卷积神经网络(Convolutional Neural Network)

本博客是针对李宏毅教授在youtube上上传的机器学习系列课程视频的学习笔记。(视频地址


卷积神经网络(Convolutional Neural Network,简称CNN),在图像处理方面的效果一直非常突出。今天我们就来看一下CNN的原理,并探究一下其效果如此好的原因。

为什么用CNN来识别图像(Why CNN for Image)

Motivation to use CNN: previous fully connected deep network (DNN) has too many parameters.

比如,如果下图中的猫图像是一个100*100pixel的彩色图片,那么就有100*100*3(彩色)个像素点/特征,那么第一个隐藏层假设有1000个神经元,那么光是第一个隐藏层的权重矩阵就是30000*1000的矩阵了。

卷积神经网络(Convolutional Neural Network)

那么,我们能不能根据一些先验知识(图片的很多像素对于判定物体类别的作用肯定不大),从原本fully-connected的NN中拿掉一些参数呢?

我们注意到在图片识别问题中存在的三个属性:

  • 属性一

我们想要识别的模式(pattern)往往比整张图片要小得多。比如下图中的鸟嘴,其实只要看红色框框中的小区域就可以判断。(Some patterns are much smaller than the whole image)

卷积神经网络(Convolutional Neural Network)

  • 属性二

而同样的模式可能出现在图片的不同位置。比如下图中的两个鸟嘴,一个在左上角,一个在*。但是我们不需要针对两种情况来分别训练两个detector,我们可以让两个detector共用一组参数。(The same patterns appear in different regions)

卷积神经网络(Convolutional Neural Network)

  • 属性三

同样,当我们将图片作亚取样(subsampling,拿掉图片的奇数行和偶数列),或者说调整图片的大小时,对于人来说,去辨识图片中的物体并没有什么影响。这也可以对我们缩减图片识别的参数数量有一定启发。(subsampling the pixels will not change the object)

卷积神经网络(Convolutional Neural Network)

CNN的架构

CNN中主要包含的处理步骤有三种:

  • 卷积(Convolution)
  • 最大池化(Max Pooling)
  • 平展(Flatten)

而卷积和最大池化两个步骤是可以交替重复很多次的。而针对我们前面提到的三种属性,卷积是专门处理前两种属性的,最大池化是处理第三种属性的(Convolution deals with Prop1 & Prop2, Max Pooling deals with Prop3.)。因此,CNN在图像识别上的突出优势也正是因为其针对性地处理了这三个属性。

卷积神经网络(Convolutional Neural Network)

卷积神经网络(Convolutional Neural Network)

CNN的步骤

卷积(Convolution)

过滤器(Filter)

过滤器是一个元素仅为1或者-1的矩阵。每个过滤器就像全连接网络中的一个神经元(单一的分类器),专门用于检测小的模式。(针对属性一:每个过滤器检测一个小的模式)

卷积神经网络(Convolutional Neural Network)

如下图,针对一张我们想要识别的黑白图片(黑色像素点标记为1,白色标记为0),我们将过滤器放到目标图片上进行不断地移动(stride=1,即每次移动一个像素)和内积计算。而由于图示的过滤器1的特性(斜对角线元素全为1),使得目标图片的矩阵中凡是斜对角线均为1的小矩阵(目标模式)都会被检测出来(与过滤器1的内积为3)。最后,我们会得到一个4*4的内积矩阵。同时,我们注意到,凡是具备目标模式的矩阵,无论其位置,都会被过滤器1检测到(对应了属性二:相同模式会出现在图片不同的位置,我们用一个过滤器就可以将它们都检测出来。)

卷积神经网络(Convolutional Neural Network)

而若我们想检验另一种目标模式,我们就再用另一个过滤器2来对图片进行一次与上述相同的扫描操作,又形成了一个新的4*4内积矩阵。而我们获得的两个内积矩阵在一起就称为一个4*4特征图。(Feature Map)

卷积神经网络(Convolutional Neural Network)

而如果我们要识别的图片是一张彩色图片,比如RGB模式的图片,那么它可以看做有三层像素(channel)叠加。那么针对性地,这是我们的过滤器也需要是三层的(过滤器的高为3),过滤器的每一层分别针对图像的对应像素层。(Every Fitler also becomes a cube (instead of matrix))

卷积神经网络(Convolutional Neural Network)

这时,卷积层与全连接网络的关联就比较明显了。如下图,卷积操作输出的特征图其实就可以看作是全连接网络的一个hidden layer的输出。

卷积神经网络(Convolutional Neural Network)

我们将之前的黑白图片延展开来(从左到右,从上到下的像素顺序编号,并摆成一列),那么过滤器1就可以看做连接目标图片的最左上角3*3矩阵中的像素点的权重矩阵,而权重矩阵与3*3矩阵的内积就是隐藏层第一个神经元的输入3。而对于隐层第一个神经元,它其实就可以看做只与输入向量中的12个分量的连接权重不为0。

另外,当过滤器在图片上移动,我们就不断获得隐藏层的新的神经元的输入,而这些不同的神经元因为是用同一个过滤器1获得的输入,所以是共享连接权重的(Shared weights)。这也就是CNN为什么可以只用到相对全连接网络更少的参数。

卷积神经网络(Convolutional Neural Network)

卷积神经网络(Convolutional Neural Network)

最大池化:亚取样(Max Pooling: Subsampling)

我们通过过滤器1、2分别获得了内积矩阵后,分别对矩阵进行像素分组,然后最大池化的操作就是从每个分组中选出该分组的均值或最大值作为该组的代表值。

卷积神经网络(Convolutional Neural Network)

卷积神经网络(Convolutional Neural Network)

卷积+最大池化

对一张黑白图片进行一次卷积和最大池化的处理后,就获得了一个新的更小的目标图片(两层,或者说两个channel的,用几个过滤器处理过,就会获得几个channel)。而卷积和最大池化的操作可以继续在新的图片上重复进行。

卷积神经网络(Convolutional Neural Network)

卷积神经网络(Convolutional Neural Network)

平展:拉伸(Flatten: Stretch)

最后,将我们经过若干次卷积+最大池化处理的特征图平展开(即做拉伸)成一个列向量后,我们就可以将它作为输入向量,输入到一个全连接网络中进行训练了。

卷积神经网络(Convolutional Neural Network)

在Keras中使用CNN

卷积神经网络(Convolutional Neural Network)

卷积神经网络(Convolutional Neural Network)

卷积神经网络(Convolutional Neural Network)

CNN学到了什么(What does CNN learn)

卷积神经网络(Convolutional Neural Network)

卷积神经网络(Convolutional Neural Network)