图2
同样地,卷积的时候需要对卷积核进行180的旋转,同时卷积核中心与需计算的图像像素对齐,输出结构为中心对齐像素的一个新的像素值,计算例子如下
图3
这样计算出左上角(即第一行第一列)像素的卷积后像素值。
给出一个更直观的例子,从左到右看,原像素经过卷积由1变成-8。
图4
通过滑动卷积核,就可以得到整张图片的卷积结果,
图5
到了这里,大致可以明白图像卷积。但是我们可以看出,通过图像卷积后,新图像的大小跟原来一样,或者变小。图2计算后图像大小不变,如图5卷积后图像变小是因为没有对所用像素进行卷积计算。但是1维的卷积结果不是变大了吗? 下面对其解释。
在matlb中对2维卷积的计算分为了3类,1.full 2.same 3. valid 参考:https://cn.mathworks.com/help/matlab/ref/conv2.html?requestedDomain=www.mathworks.com
图2对应的卷积就是就是所谓的same,图5对应的就是valid。那么full又是什么呢?如下图
图6
图6中蓝色为原图像,白色为对应卷积所增加的padding,通常全部为0,绿色是卷积后图片。图6的卷积的滑动是从卷积核右下角与图片左上角重叠开始进行卷积,滑动步长为1,卷积核的中心元素对应卷积后图像的像素点。可以看到卷积后的图像是4X4,比原图2X2大了,我们还记1维卷积大小是n1+n2-1,这里原图是2X2,卷积核3X3,卷积后结果是4X4,与一维完全对应起来了。其实这才是完整的卷积计算,其他比它小的卷积结果都是省去了部分像素的卷积。下面是WIKI对应图像卷积后多出部分的解释:
Kernel convolution usually requires values from pixels outside of the image boundaries. There are a variety of methods for handling image edges.意思就是多出来的部分根据实际情况可以有不同的处理方法。(其实这里的full卷积就是后面要说的反卷积)
这里,我们可以总结出full,same,valid三种卷积后图像大小的计算公式:
1.full: 滑动步长为1,图片大小为N1xN1,卷积核大小为N2xN2,卷积后图像大小:N1+N2-1 x N1+N2-1
如图6, 滑动步长为1,图片大小为2x2,卷积核大小为3x3,卷积后图像大小:4x4
2.same: 滑动步长为1,图片大小为N1xN1,卷积核大小为N2xN2,卷积后图像大小:N1xN1
3.valid:滑动步长为S,图片大小为N1xN1,卷积核大小为N2xN2,卷积后图像大小:(N1-N2)/S+1 x (N1-N2)/S+1
如图5,滑动步长为1,图片大小为5x5,卷积核大小为3x3,卷积后图像大小:3x3
2.转置卷积(一般叫反卷积,但是不是很准确)
这里提到的反卷积跟1维信号处理的反卷积计算是很不一样的,FCN作者称为backwards convolution,有人称Deconvolution layer is a very unfortunate name and should rather be called a transposed convolutional layer. 我们可以知道,在CNN中有con layer与pool layer,con layer进行对图像卷积提取特征,pool layer对图像缩小一半筛选重要特征,对于经典的图像识别CNN网络,如IMAGENET,最后输出结果是1X1X1000,1000是类别种类,1x1得到的是。FCN作者,或者后来对end to end研究的人员,就是对最终1x1的结果使用反卷积(事实上FCN作者最后的输出不是1X1,是图片大小的32分之一,但不影响反卷积的使用)。
这里图像的反卷积与图6的full卷积原理是一样的,使用了这一种反卷积手段使得图像可以变大,FCN作者使用的方法是这里所说反卷积的一种变体,这样就可以获得相应的像素值,图像可以实现end to end。
不说一些理论的了,下面是一些推导:
这里的 c 中的第一行对应卷积核首次卷积的位置( 卷积核未涉及到的位置为0 , 所以从左往右出现 )
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:转置卷积的详细理解 - Python技术站