卷积神经网络:Convolutional Neural Networks
卷积层用来识别图片里的空间模式,例如线条和物体局部,之后的最大池化层则用来降低卷积层对位置的敏感性。
从之前的学习中我们了解到,计算机在识别图片时,学习到的初级特征往往是一些线条,而利用卷积神经网络可以帮助模型更快地发现特征线条。
识别图片里的空间模式,例如线条和物体局部
“卷积”的过程很简单:如上图所示,将原始图像(左)乘以一个筛子(中)后,即可得到处理后的结果。
如下图所示,可以利用该筛子找到原图像中的垂直线条。
当然,通过设置筛子中的数值,还可以找到水平的、45度的线条等。
Padding
上述的“卷积”处理过程会将图像形状改变,如从6x6变成了4x4;并且原始图像中间的像素点比边缘的像素点用到了更多次;Padding正是为了应对该现象。如下图所示,该padding 在原始图像像素周围加了一圈零像素点。
Strided Convolutions
Stride指的是筛子在移动过程中的步幅,前面虽然没说,但其实它们的stride为1。当面我们可以设置stride为任意我们想要的值。过筛后的图片形状为。
Convolutions Over Volume
如何对RGB(彩色)图像进行卷积处理?其实方法还是一样,只是相应地我们的筛子也变成三层立体形状了。当只需考虑一种颜色时,只需要把其它两层筛子的值设置为零就可以了。
One Layer of a Convolutional Networks
以下为一个简单的单层卷积神经网络的例子,该例子中,存在两个筛子(每个三层),隐藏层采用Relu作为**函数。
卷积神经网络中参数数量的计算方式如下:
Simple Convolutional Network Example
一个典型的卷积神经网络例子如下:
在该例子中,存在三个卷积层,每次卷积后,图像的层数增多,而每层的元素变少;接着将卷积后的元素堆叠成一列,用softmax**函数处理,即获得结果。
Pooling Layers
卷积层可以用来精确的找到像素变化的位置(边界);但实际中图片里我们感兴趣的物体不会总出现在固定位置,例如即使我们连续拍摄同一个物体也极有可能出现像素上的偏移。这样导致同一个边缘对应的输出可能出现在图片中不同位置,进而对后面的模式识别造成不便。
池化层的提出是为了缓解卷积层对位置的过渡敏感性。
Max pooling
Max pooling 在设置完基本的参数后,不需要再去进行参数学习。
Average pooling
Average pooling 也会被经常用到,如下:
CNN Example
如下为一个典型的包含卷积层、池化层、全连接层的手写数字识别神经网络模型结构图:
Why Convolutions?
为什么要选择卷积神经网络?卷积神经网络为什么会有效?
(下面两段话引自:http://zh.gluon.ai/chapter_convolutional-neural-networks/lenet.html)
如果不采用卷积神经网络,对于高宽均是28的图片,我们将其展开成长为784的向量输入到模型里。这样的做法虽然简单,但也有局限性:(1)垂直方向接近的像素在这个向量的图片表示里可能相距很远,它们组成的模式难被模型识别。(2)对于大尺寸的输入图片,我们会得到过大的模型。假设输入是高宽为1000的彩色照片,即使隐藏层输出仍是256,这一层的模型形状是3,000,000×2563,000,000×256,其占用将近3GB的内存,这带来过复杂的模型和过高的存储开销。
卷积层尝试解决这两个问题:它保留输入形状,使得可以有效的发掘水平和垂直两个方向上的数据关联。它通过滑动窗口将卷积核重复作用在输入上,而得到更紧凑的模型参数表示。
注:如无特殊说明,以上所有图片均截选自吴恩达在Coursera开设的神经网络系列课程的讲义。