CNN的动机
图片处理如果使用普通 的神经网络模型,将所有的像素点作为输入,输入的向量就会很长,需要的参数就会很多。
希望每一个神经元都能成为一个基本的分类器,第一层神经元是最基本的分类器,比如探测有没有绿色出现或者有没有斜条纹。第二层的神经元根据第一层输出的结果探测更复杂的特征。再根据第二层的输出,第三层可以做更复杂的事情。
如果我们直接用全连接网络来做图像处理往往需要更多的参数,比如像素大小为100×100的彩色图,输入具有30000个维度,假设隐藏层有1000个神经元,就会有30000×1000个参数。CNN的动机就是减少模型的参数,根据人对图片的认识,会知道有些权重参数是用不到的,可以去掉,不必用全连接网络,而应该用较少的参数,所以CNN比DNN更精简。
小区域
可以减少参数的原因:
大部分需要识别的Pattern比整张图片的大小要小,所以不需要看整个图片,只需要看图片的一小部分。比如寻找一张图片里有没有鸟嘴,只需要看图片中的一小部分区域就行了。
同样的特征
同样的pattern可能出现在图片的不同位置,但是代表同样的含义。同样的形状可以用同样的参数、同样的神经元识别出来,而不需要识别出该形状在图片中的位置,这样就可以减少需要的参数量。
下采样
把一幅图像的奇数行和偶数列去掉,变为原来大小的四分之一,不会影响人对图片的理解,所以可以把图像的大小变小,从而减少模型的参数。
CNN架构
CNN的结构包括卷积层和池化层,卷积层和池化层可以使用多次,使用完卷积和池化层后使用flatten层,将它的输出传给全连接层,从而得到最终结果。
出于图像的三个特性,我们设计了CNN:
- 只需要图像的一小部分,就可以识别pattern;
- 通用的pattern会出现在图像的不同区域;
- 对图像做下采样,不会影响对图像的理解;
卷积层可以利用前两个特性,池化层利用了第三个特性。
卷积
特性1
假设网络的输入是6×6的图片,如果是黑白图片,每个像素点需要1个值来描述。在卷积层里,有一组过滤器作为卷积核,每个过滤器都相当于全连接网络中的一个神经元。每个过滤器都是一个3×3的矩阵,矩阵中的值就是过滤器的参数,这是需要学习得到的,而不是人为设计的。
每个过滤器探测3×3的区域,在识别pattern的时候,不看整张图片,只看3×3的区域,这反映了输入图像的第一个特性。
特性2
首先把过滤器放在图片的左上角,将过滤器的9个值和图片的9个值进行内积,得到卷积的结果。然后,移动过滤器,移动的距离是人为设定的,移动的距离成为stride。这里我们设stride为1。
经过卷积,本来6×6的图片大小变为了4×4的结果。结果的左上角和左下角得到了最大值,代表所要识别的特征在原始图片的左上角和左下角。这就反映了图片的特性2,处于图片不同位置的同样的特征只需要一个过滤器就可以识别,而不需要设计不同的过滤器。
在一个卷积层里会有很多的过滤器,上面只展示了其中1个。这样就会得到很多4×4的卷积结果,将它们合起来就是feature map。
刚才举例是黑白图片,所以输入是一个矩阵。如果是彩色图片,就是3个矩阵叠在一起,输入是3×6×6,一共有3个通道。做卷积时,所有通道是合在一起算的,每个过滤器都在所有的通道上进行计算。
convolution和fully connected之间的关系
卷积其实就是全连接网络去掉一些权重参数得到的结果。
卷积的实质是强迫神经元去共用权重,同时每一个神经元的输入也很少,这样就大大减少了参数的数量。
Max pooling
卷积层有多少个过滤器,输出就有多少个通道 (每个输出通道的维度与输入的通道数有关)。
Flatten
CNN in Keras
CNN学到了什么
这些image有一个共同的特征就是:某种纹路在图上不断的反复。比如说第三张image,上面是有小小的斜条纹,意味着第三个filter的工作就是识别图上有没有斜的条纹。每一个filter考虑的范围都只是图上一个小小的范围。所以今天一个图上如果出现小小的斜的条纹的话,这个filter就会被active,这个output的值就会比较大。如果让图上所有的范围通通都出现这个小小的斜条纹的话,那这个时候它的Degree activation会是最大的。(因为它的工作就是侦测有没有斜的条纹,所以你给它一个完整的数字的时候,它不会最兴奋。你给它都是斜的条纹的时候,它是最兴奋的)
分析全连接层
把每张image(如图)都丢到CNN里面,然后看它classifier的结果是什么。CNN确定就说:这个是1,这个是,…,这个是8。CNN就觉得说:你若拿这张image train出来正确率有98的话,就说:这个就是8。所以就很神奇
这个结果在很多的地方有已经被观察到了,今天的这个neuron network它所学到东西跟我们人类是不太一样的(它所学到的东西跟我们人类想象和认知不一样的)。
让图更像数字
设定了一些约束条件,终于发现可以使输出层的函数达到最大值的输入有一些像数字了。
参考资料
- Datawhale开源文档 https://datawhalechina.github.io/leeml-notes
- 李宏毅机器学习视频 https://www.bilibili.com/video/BV1Ht411g7Ef