点击蓝字关注我们
应用之道
存乎一心

本文承接《【CNN】认识卷积神经网络(一)》,以下简称“文一”。本文主要介绍卷积神经网络的卷积层(Convolutional Layer)及其它相关概念。卷积层的主要功能就是提取特征,卷积之后参数数量将大大减小。而特征映射(卷积特征)的大小由我们在执行卷积步骤之前需要决定的三个参数有关,这三个参数分别是:步长、深度、零填充。本文中如有错误,欢迎大佬们指正!
01
步长
文一的样例一中演示了卷积是如何操作的,即过滤器矩阵(橙色)在原始图像矩阵(绿色)上从左上角开始以每次固定像素的速率移动。过滤器速率称为步长(Stride)。

如下图所示,黄色框一次运动到蓝色框跨过1个像素点,其步长为1。黄色框一次运动到紫色框跨过2个像素点,其步长为2。

3X3过滤器卷积上5X5原始图像,步长为1时输出3X3的特征图,步长为2时输出2X2的特征图。由此可知,步长越大,生成的特征映射越小。

文一中提到过:卷积输出的特征图(Feature Map),除了特征值本身外,还包含相对位置信息,比如人脸图片中眼睛、鼻子、嘴巴都是从上到下排列。与此类似,通过卷积提取出相应的特征值也需要按照固定顺序排列。一般情况下,过滤器按照从左上到右下的顺序,以固定步长移动后,再与原始图像的像素点进行卷积。

卷积计算的过程中通常需要加入一项偏置(Bias)。

样例二:如何理解偏置的作用
为了便于理解,我们以二元函数 y = Wx + b为例,左图为b = 0时的线型,右图为b > 0时的线型:

偏置 b=0
1

偏置 b>0
2
如果我们不考虑偏置(b = 0),即直线必须过原点。试想我们能否找到这样一条经过原点的直线恰好将下图中两种形状分开?

很明显不能。但是我们如果引入偏置,使直线偏离原点向上平移(b > 0),这样我们就能找到这样一条分隔线。

目前,我们已经讨论了二维卷积,但实际工程中图像数据除了宽高之外往往还有通道数,此时卷积核通道数必须与输入的通道数相同。如下图,我们考虑32x32x3图像与5x5x3进行步长为1的卷积,由于两者通道数均为3,则卷积可以进行并输出维度是28x28x1的特征图。

样例三:如何理解多通道图像
举个例子,一般情况下计算机处理的彩色图片是RGB格式,即红绿蓝三色。

也就是说,我们可以通过叠加红绿蓝三个颜色通道得到各式各样的颜色。

下图演示了RGB三通道图像的卷积过程,需要注意的是3X3X3过滤器卷积上原始图像上3X3X3的像素点后得到的是一个数值而不是向量或立体。

02
深度
深度(Depth)即卷积层中用于卷积运算的过滤器数量。如下图所示,我们使用三个不同的过滤器对初始的图像进行卷积,从而生成三个不同的特征图。可以将这三个特征地图视为堆叠的二维矩阵,因此,特征映射的“深度”为3。

如果我们希望卷积层寻找6个不同的特征图(即深度为6)。在这种情况下,我们需要6个5x5x3过滤器。每一个过滤器都会对输入图片进行特征提取。

样例四:如何理解多个过滤器
我们来看看深度为2的过滤器如何对图像卷积:

先让一个过滤器(红色边框)在输入图像上移动(卷积操作)以生成特征映射。再在同一张图像上,让另一个过滤器(绿色边框)的卷积生成了不同的特征图。
实际上,卷积神经网络在训练过程中会自己学习这些过滤器的值(尽管在训练过程之前需要指定诸如过滤器数目和大小、网络框架等参数)。一般情况下,拥有的过滤器数目越多,提取的图像特征就越多,卷积神经网络在识别新图像时效果就会越好。
03
零填充
有时输入矩阵边界可以用零来填充,从而便于将过滤器应用于输入图像矩阵的边界元素,这个操作称为零填充(Padding)。添加零填充的卷积也称为宽卷积,不使用零填充的卷积称为窄卷积。

样例五:零填充有何作用
零填充究竟有何优点才让我们“多此一举”地给原始图像环绕一圈0呢?我们假设用一个3X3的过滤器和5X5的原始图像卷积得到一个3X3的特征图:

如果我们在原始图像的周围添加一圈0后(下图中以补空框代替),再与3X3的过滤器卷积,可得到一个5X5的特征图:

由此可以看出,我们可以:
获得更多更细致的特征信息。比如,上图卷积后可以获得更多的图像边缘信息。
控制卷积层输出的特征图的大小,从而可以达到控制网络结构的作用。如果没有做补零,第二层卷积层的卷积核尺寸仍然是3x3, 那么第二层卷积层将输出一个尺寸1X1的特征图,卷积神经网络的特征提取至此结束。同样的情况下加了零填充的第二层卷积层输出一个尺寸仍为5X5的特征图,这样我们可以再增加一层卷积层提取到更深层次的特征。
04
感受野
在机器视觉领域的深度神经网络中有一个概念叫做感受野(Receptive Field),用来表示网络内部的不同位置的神经元对原图像的感受范围的大小。神经元之所以无法对原始图像的所有信息进行感知,是因为在这些网络结构中普遍使用卷积层和采样层(又称池化层),层与层之间均为局部相连。
神经元感受野的值越大表示其能接触到的原始图像范围就越大,也意味着它可能蕴含更为全局、语义层次更高的特征。而值越小则表示其所包含的特征越趋向于局部和细节。因此感受野的值可以大致用来判断每一层的抽象层次。

如上图所示可以看到在一次卷积后的特征图(简称Conv1)中的每个像素所能看到的原始图像3X3个像素,而由于二次卷积后的特征图(简称Conv2)的每个像素都是由2X2个Conv1像素构成,因此回溯到原始图像,其实是能够看到5X5个原始图像像素范围。因此可以看出Conv1的感受野是3,Conv2的感受野是5。特殊的,由于输入每个像素只能看到自己,所以它的感受野定义为1。
级联几个小卷积可以使感受野变大。如下图所示,两次3X3的卷积效果相当于一次5X5卷积之后的效果:

工程实际更多的是趋向于使用小的过滤器,例如使用三个3X3的过滤器替代一个7X7的过滤器。
特别提醒
1.卷积层第一层尽量不要选择用三个3X3过滤器替换一个7X7过滤器
具体情况仍需结合工程实际来定,并不绝对。一般情况下虽然感受野一样,但是相比一个7X7过滤器,三个3X3的非线性程度更高,层数加深了三层。由于层数加深会有一串连锁效应,效果既可能会提升也可能变差,例如梯度弥散(梯度变得非常小不利于学习,可通过优化Relu函数避免)。
2.三个3X3的过滤器堆叠和深度为3的3X3过滤器不是一回事
三个3X3过滤器堆叠效果像是三片镜片叠加组合成的望远镜,相比单镜片可以看得更远(即感受野大)。

而深度为3的3X3过滤器则更像是三个过滤不同颜色的镜片,只不过它们分别作用于同一片视野:

05
卷积层的应用特色
卷积神经网络的卷积层中有两个减少参数数量的重要思想:
局部连接(Local Connectivity)
权值共享(Shared Weights)
局部感知
一般认为图像中局部像素联系比较密切,而距离较远的像素相关性较弱。因此,每个神经元没必要对全局图像进行感知,而只需要对局部进行感知,然后在更高层将局部的信息综合起来就可以得到全局信息。卷积层通过局部感知减少了运算参数的数量。

如上图所示,假定输入原始图像尺寸为1000X1000,左图为全连接示意图,右图为局部连接示意图。若将原始图像输入到100万个节点的隐藏层,这样一个隐藏层就会产生10¹²个参数,参数数目非常之大,基本很难训练。而如果使用10X10的过滤器与原始图像卷积做卷积,这个卷积层才1亿个参数,参数数量减少为原来的千分之一。
参数共享
通过局部连接处理后,神经元之间的连接个数已经有所减少,但参数数量仍然很大。而权值共享就是来解决这个问题的,它能显著降低参数的数量。每个过滤器相当一种特征提取方式,而这种方式与图像等数据的位置无关。即对于同一个过滤器,它在一个区域提取到的特征,也能适用于其它区域。在上图的局部连接中,假设每个节点都对应100个参数,一共100万个节点,如果这100万个神经元的参数都是相等的,那么参数总数就减少至100。由此可见,参数共享可以大大减少网络中的参数。
至此,本文带大家认识了卷积神经网络的“卷积层”,下文我们将继续了解什么是“采样层”和“全连接层”。感谢大家的支持,我们下期再见!
应用之道
END
存乎一心
本文作者:Bingunner
一位头发浓郁的信息安全工程师
爱摄影/爱数码/爱跑步的经济学人死忠粉





