首页 > > > 5.2.1.3 卷积层
前言
上文我们讲到卷积核,其实这种东西画出来确实比较直观,只是在实际应用中,卷积核也是“一层一层”出现的。对于这一层一层的卷积层,我们在定义的时候也是一层一层来定义的。定义的时候会有另外两个比较重要的参数,一个是Striding,一个是Padding。
Padding参数
先说Padding,Padding是指用多少个像素单位来填充输入图像(向量)的边界。就像图上所画,在这四周的区域里都进行Padding填充,通常都是填充0值。然一般不会有像我们图上画的这么大比例的Padding了,在一张图片通过卷积层的时候,能在四周各Padding上5到10个单位就不少了。

在Tensorflow里面,对于Padding的定义有这样两种参数,一种叫“Valid”,一种叫“Same”。
如果你在定义卷积层的时候给Padding赋值为“Valid”,相当于不补0。“Valid”意思是“有效的”,那就是只保留有效信息,不做补充处理。大家可能也注意到了,前面的例子里面一个 5×5 的图片,经过 3×3 的卷积以后在后面就变成了 3×3 大小的Feature Map,这就相当于“Valid”的含义。这个尺寸的缩小是卷积核本身的长宽造成的,卷积核越大,缩得就越厉害,比如说如果是一个 ×的卷积核在刚才的情况下以“Valid”方式扫描了 5×5 的图片那Feature Map上就仅剩下一个点的Feature信息了。这种方式当然非常极端,相当于整个图片的像素拉成一条线,和一个w做了内积,做了一个线性变换,提取出来一个实数值用来描述它。
3×3 的卷积在以“Valid”方式扫描了图片后还会有一些不好的地方,那就是边缘上的像素点被扫描的次数要比中间的像素点少。这个例子中,最中间的点就被扫描了9次,而左上角的点只扫描了一次,通常我们会认为这样对于边上的点提取的信息不充分。
如果你在定义卷积层的时候给Padding赋值为“Same”,那就是要在周围补"一圈的0"。"Same"意思是"相同的",这个相同的指的是大小,也就是卷积后的大小。如果使用"Same",图片在被卷积核处理之前还会进行"补0"的处理,补的目标是满足扫描完了产生的Feature Map的大小和前面输出的图片尺寸一样大。还是以刚刚这个 5×5 的图片经过 3×3 的卷积处理的情况,那应该是给这个 5×5 的图片边上补一圈0就够了mdash;mdash;也就是相当于变成了一个 7×7 的图片,中间的 5×5 的部分是原图,周围有一圈0。再扫描就能保证后面生成的Feature Map尺寸也为 5×5 了。

这种方式的好处就是使得生成的Feature Map尺寸和前面的输入图片一样大,让每一个输入的像素点被扫描的次数一样多。
Stride参数
Stride参数也是一个比较重要的参数,有的资料上也写成Strides或者Striding,但是只要出现在卷积层上就只有一个含义,就是步幅。
在卷积层工作的时候,Stride可以理解为每次滑动的单位。比如刚刚这个例子中,我们用的就是Stride=1的情况——每次只滑动一个单位。在实际工作中Stride=1的使用场景很多,因为它对于采用的细密程度保证的最好。当然Stride是可以取别的值,比如Stride=3,那么扫描的时候就不是每次移动1个像素了,而是每次移动3个像素了。这种方式直观上想一想就会觉得比较“粗糙”,因为跳过的像素行列的信息明显扫描的次数降低了。不过好处也显而易见,就是因为处理的次数变少了,所以卷积层在扫描的时候工作会变快,这可能是唯一的好处。在设计网络的时候,Stride取多少合适需要经过测试,先设置为Stride=1,如果工作状况已经很理想了,而希望通过加大Stride来获得一些性能的提升或者存储量的减小,那么可以逐步尝试调整为Stride=2或其它值。一切都以实测结果为准,到目前为止这个值究竟应该设定为多少还没有一个确切的有效的判断方法,我们自己在实践中还是优先使用Stride=1的情况。
定义的格式
在Tensorflow这样的工具中,如果你要定义一个卷积网络的话和全连接网络一样是一层一层定义的,卷积层的定义你可能会看到类似下面这样的代码:

其它框架工具中的写法很类似,形式略有差别,不管关键参数都会有。如果你有些许编程经验的话,这种padding='SAME'的含义估计你也能猜个差不多。重点看一下tf.truncated_normal([5,
5, 32, 64])这个部分。
这4个参数就分别表达了这个卷积层的重要属性,卷积核大小,输入通道数,输出通道数。刚才我们是没有提ldquo;通道(Channel)rdquo;这个概念的,通道这个概念在卷积网络的范畴中几乎可以跟Feature Map划等号。在这个部分其实相当于定义了这样一个卷积层,这个卷积层将处理32个通道的输入(输入32个Feature Map),产生64个通道的输出(输出64个Feature Map),每个卷积核的尺寸为 5×5 。现在我有一个问题,这个刚刚被定义的层中到底有几个卷积核?它们是怎样工作的?你可千万别以为是定义了64个 5×5 的卷积核,每2个负责去"卷"一个Feature Map。因为当你把代码改成[5, 5, 32, 63]或者[5, 5, 32, 65]这个训练过程照样可以工作,你觉得跟刚才的这种设想矛盾不?如果你顿感语塞,那请继续细细阅读下面的这段内容。

我们就看这一张图就能看明白了一切了。这定义的是一个[3,3,3,2]的卷积层,也就是输入为3通道,输出为2通道,每个卷积核大小 3×3 。这个好记:
输出的通道有2,也就是有2组卷积核。
输入的通道有3,也就是每组有3个 3×3 的卷积核。
每组的3个卷积核分别去与前面输入的3个通道做卷积,这个过程与我们前面说的那个wx做点积是一样的,只不过乘出来是3个数字。以图上当前这卷积计算的一瞬间来看的话,第一组wx等于4,第二组wx等于-1,第三组wx等于-1。最后还有一个偏置的b,这个b是1。最后投射到输出的第一张Feature Map上的就是

其它点同理计算,第二组卷积核也是同理计算,这样就可以得到两张完整的Feature Map。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69954080/viewspace-3147040/ ,如需转载,请注明出处,否则将追究法律责任。