卷积神经网络

计算机视觉

计算机视觉可以应用到许多问题中,比如图片分类器,物体检测,图片风格转化。目前计算机视觉发展得非常迅速,这些问题都能够得以解决。

以前使用神经网络对图像进行分类,使用的图像都比较小,比如64*64*3,特征向量长度有12288,这个特征向量已经很大了。我们更希望能对大的图像进行分类,但是图像大小是1000*1000*3,特征向量长3000000,对应的神经网络就非常大,这就很容易出现过拟合现象。幸运的是,卷积神经网络可以解决这一问题。

边缘检测

图像边缘是指图像中明暗变化的区域。
卷积神经网络
上图右侧明亮的地方表示原图的边缘,分别是垂直边缘和水平边缘。

边缘检测的方法是对图像进行卷积操作,图像与一个过滤器(或者称为核)进行卷积,得到新的矩阵表示图像的边缘检测结果。
卷积神经网络
上图是卷积操作的其中一步,中间的“*”表示卷积操作,左边的矩阵表示图像(灰度图),中间的矩阵是过滤器。把过滤器移动到图像上作为掩膜,计算卷积值,3×1+1×1+2×1+0×0+5×0+7×0+1×1+8×1+2×1=5,-5就是这个区域的值。接着移动过滤器
卷积神经网络
计算新区域的卷积值为-4。计算完第一行后,向下移动过滤器,继续计算第二行
卷积神经网络
最后得到的结果是
卷积神经网络

来看一个特殊的例子,
卷积神经网络
上图下方的方块可以直观地表现出图像的边缘部分。原图中间部分是黑白的分界线,进行垂直边缘检测后,得到的结果中间是白色,两边是灰色,说明原图中间部分是边缘。

把过滤器垂直翻转,重新进行卷积运算,得到的结果是
卷积神经网络
结果的中间黑色的部分才表示原图的边缘。所以一般把卷积的结果再取绝对值。

水平边缘检测和垂直边缘检测一样,只是过滤器不一样。水平边缘检测的过滤器是在水平方向上取值,比如

[111000111]

水平边缘检测例子:
卷积神经网络

过滤器有许多种,有Sobel过滤器、Scharr过滤器等。
卷积神经网络
过滤器的参数不同,可以实现不同的过滤器,实现不同的边缘检测,比如45°、70°边缘检测。

编程语言实现的卷积操作函数有许多,在python中是conv_forward,在tensorflow中是tf.nn.conv2d,在keras中是Conv2D。

Padding

上述所说的卷积操作会缩小图片的大小,本来是6×6的图片,卷积之后变成4×4的图片。缩小图片会丢掉图片边界的边缘信息。而且,深度网络通常有100多层,图片每经过一层,便会缩小,最后得到一幅非常小的图片,这不符合实际需求。我们可以使用Padding来使得卷积后图片不变小。

Padding就是在卷积之前扩大原来的图片
卷积神经网络
扩大6×6的图片1个像素,然后使用3×3的过滤器进行卷积,最后得到与原图一样大小的6×6的图片。可以使用0来填充添加的像素。

假设原图大小为n×n,过滤器大小为f×f,卷积后的图片大小为(nf+1)×(nf+1)。设原图Padding后四周添加p个像素,原图变为(n+2p)×(n+2p)则Padding卷积的图片大小为(n+2pf+1)×(n+2pf+1)。为了保证卷积后的图片与原图一样大,则2pf+1=0p=f12。一般f都是奇数,保证p计算出来为整数。f一般取3、5、7等,也会取1,这种情况比较特殊。

卷积分为两种,分别是

  • Valid:不进行Padding (p=0),
  • Same:进行Padding。

卷积步长

上述的卷积操作蓝色框移动1个步长,下图是移动2个步长的卷积操作:
卷积神经网络
最后得到的结果是
卷积神经网络
设卷积的步长为s,则卷积后图片的大小为(n+2pfs+1)×(n+2pfs+1)
如果n+2pfs不能取整,则对n+2pfs向下取整,卷积后图片的大小为(n+2pfs+1)×(n+2pfs+1)

在数学或信号处理的书籍中,卷积操作中还有一步操作,需要把过滤器进行翻转,如下图
卷积神经网络
这个卷积运算有结合律,(AB)C=A(BC)。但是,在深度学习中,不需要用到卷积的结合律,因此深度学习简化了卷积运算,这样可以简化实现的代码。

立方卷积

上述进行卷积的图像都是灰度图像,我们需要对RGB图像进行卷积。RGB图像有3个颜色通道,大小为n×n×3。要对RGB图像进行卷积,过滤器也需要有3层。RGB图像的卷积示意图如下:
卷积神经网络
最后的结果仍为二维矩阵,不是三维。

如果需要对R层进行垂直边缘检测,过滤器可以为
卷积神经网络
如果不考虑颜色通道进行垂直边缘检测,过滤器可以为
卷积神经网络

最后,使用多个过滤器的卷积结果构成新的图像。
卷积神经网络
上图分别进行垂直边缘检测和水平边缘检测,把两个结果组合起来,构成4×4×2的新图像。

单层卷积网络

单层的卷积网络如下图所示
卷积神经网络
原图相当于输入的a[0],过滤器相当于参数W[1],卷积操作就相当于线性乘法,对卷积的结果加上偏置,然后使用非线性的**函数,得到的结果叠加起来成为a[l]

如果过滤器有10个,我们来统计一下这一层卷积网络需要多少个参数。首先每个过滤器有3×3×3=27个参数,加上偏置28个,最后乘以10等于280个。无论原图有多大,100×100,或者1000×1000,这层的参数都是280个。可以看出卷积神经网络的参数数量的优势。

对卷积层l进行符号约定。f[l]表示过滤器的大小,p[l]表示Padding的大小,s[l]表示卷积的步长,nc[l]表示过滤器的个数。对于l层,输入的是nH[l1]×nW[l1]×nc[l1]的图片,nH[l1]表示图片的高度,nW[l1]表示图片的宽度,输出的是nH[l]×nW[l]×nc[l]的图片。输出图片的高度nH[l]=nH[l1]+2p[l]f[l]s[l]+1,宽度nW[l]=nW[l1]+2p[l]f[l]s[l]+1。每个过滤器大小为f[l]×f[l]×nc[l1]。**函数a[l]大小为nH[l]×nW[l]×nc[l],所以参数大小为f[l]×f[l]×nc[l1]×nc[l],偏置大小为nc[l],或者写成1×1×1×nc[l]

简单卷积网络示例

下图是一个简单的卷积网络
卷积神经网络
在上图,一张39×39×3的图片经过3层卷积层,最后变成了7×7×40的图片,也就是从图片中提取了7×7×40=1960个特征。最后把这1960个特征变形为1960×1的向量,输入到神经网络中。

卷积网络的层的类型分为

  • 卷积层,
  • 池化层,
  • 全连接层。

池化层

池化层和卷积层类似,区别是卷积层使用卷积操作,池化层使用池化操作。

对于最大池化层,它的工作方式如下:
卷积神经网络
对于每个区域,取特征值最大的特征,这里过滤器大小为2×2,步长为2。

对于平均池化层,它的工作方式如下:
卷积神经网络
对于每个区域,取特征值的平均值,这里过滤器大小为2×2,步长为2。

池化层是单独对每个信道进行池化,对nH×nW×nc的图片进行池化,得到的结果是(nH+2pfs+1)×(nW+2pfs+1)×nc。通常是不会对池化的图片进行Padding操作的,池化就是为了删除一些特征,保留需要的特征,比如最大值特征或平均特征。池化层只有超参数,没有参数。

卷积网络示例

下图是一个经典的卷积网络
卷积神经网络
上图的例子类似LeNet,许多参数的选择是参考LeNet。这个卷积网络的结构是:卷积层-池化层-卷积层-池化层-全连接层-全连接层。许多时候人们会把一层卷积层和一层池化层合起来作为卷积层的一层,因为池化层是没有参数的。

卷积网络还有另外一种结构,它是一层卷积层或几层卷积层之后接一个池化层。

下表统计了这个卷积网络的**函数和参数的大小
卷积神经网络
可以看到,**函数的数量在不断地减少,如果减少地太快,会影响网络的性能。

为什么使用卷积

标准的神经网络和卷积网络的参数比较
卷积神经网络
对于32×32×3的图片,转化到28×28×6的图片,标准的神经网络需要3072×4704约等于1400万的参数,而卷积网络使用156个参数。通过参数数量对比可以看出卷积网络的优势。

为什么卷积网络需要的参数很少呢?有两个原因,一是参数共享,特征检测器(过滤器)的参数可以在一张图的不同地方使用。二是稀疏连接,输出图片的像素只依赖输入图片的部分输入,减少了参数。

卷积网络需要许多超参数,使用卷积网络时一般直接拿别人设计好的卷积网络来用。