学习笔记P20-CNN
学习网址:https://www.bilibili.com/video/av48285039?p=20
前言
CNN【Convolutional Neural Network,CNN或ConvNet】通常被用在影像处理的问题上,但是并不是说只有CNN才能做影像处理,一般的Neuron Network也可以做这件事。
例如做影像分类,通常就是train一个NN,输入一个图片【该图片表示成pixels,是一个vector】,输出这个图片对应的类别【假如有10个类别,那么输出就是10个dimension】。
实际上我们在训练一个NN时,我们希望在NN的structure里面,每一个neuron都代表一个最基本的classifier,这在以往的经验中也得到了验证。
例如输入一张图片pixels的vector,第一层的layer:第一个neuron就判断有没有绿色出现,第二个neuron判断有没有黄色出现,。。。,最后一个neuron判断有没有斜条纹出现。第二层layer做出比第一层更加复杂的判别:第一个neuron判断是否有条纹来识别窗栏,。。。,最后一层layer则做出更加复杂的判断,第一个neuron判断是否是蜂巢,第二个判断是否是车轮。。。
现在面对的问题:
用一般的fully connection NN做影像处理时,往往需要很多参数;例如有一张100X100的彩色图片,把它转化成一个vector就是:100X100X3的pixels就是3万维;假设NN的layer有1000个neuron,那么第一层的layer就有30000X1000个参数。这参数也太多了。
所以CNN要做的事情就是来简化这个NN 的structure;根据人的经验,图片中某些weight是用不到的,所以在一开始就可以把它过滤掉。因此不用FNN,而用其他的方式用比较少的参数来做影像处理。所以CNN是比传统的DNN要简单的(结构上拥有更少的参数)。
小结:用全连接前馈网络来处理图像时,会存在两个问题:
1)参数太多;
2)局部不变性特征:FNN很难提取局部不变特征,一般需要进行数据增强来提高性能。
为什么可以用CNN来处理图片?或者为什么可以用部分的pattern就可以识别图片?或为什么我们可以直接把一些参数拿掉,只用很少的参数就可以做影像处理?
这里有如下观察:
第一个观察:Some patterns are much smaller than the whole image.
——》A neuron does not have to see the whole image to discover the pattern.
解释:在影像处理问题中,图片的pattern要比整张图片小,所以在图片的pattern识别时不需要关注整张图片。
假设第一层layer的哪些neuron是侦查有没有某种pattern出现,而大部分pattern是比整张image还要小的,所以对一个neuron来说他要判断是否出现这个pattern是不需要看整张image的,只要看一部分就可以决定这个事情。
举例来说:
即从图片中识别鸟嘴,我们只需要看图片的一部分就可以判断是不是鸟嘴。
第二个观察:The same pattern appear in different regions.
解释:同样的pattern可以出现在图片的不同部分【他们代表同样的含义,同样的形状;他们可以用同样的neuron来侦测】。
举例来说:
上面来张图片,第一张鸟嘴在左上方,第二张鸟嘴在中间。在侦测鸟嘴这件事情上他们不需要用不同的参数来做,可以让两个neuron共用一组参数;即share parameters来减少需要用的参数的量。
第三个观察:Subsampling the pixels will not change the object.
解释:对图片的pixel做抽样不会改变对原来物体的识别。
举例说明:
把一张图片的奇数行偶数列拿掉,变成原来1/10的大小,不会影响人对这张image的理解。
所以做Subsampling对影响辨识来说可能没有太大的影响,所用可以通过这种方式让参数减少。
基于以上对影像处理的观察设计了CNN的架构;如下CNN的整个架构图:
目前的卷积神经网络一般是由卷积层、池化层和全连接层交叉堆叠而成的前馈神经网络,使用BP算法进行训练。CNN有三个结构上的特性:
1)局部不变性
2)权重共享
3)pooling
对应于上面三个观察。
再来看看上面3个观察在CNN架构中的处理:
观察一:要侦测一个pattern不需要看整张图片,只要看image的一小部分就可以。
观察二:同样的pattern可能会出现在不同图片的不同区域。
观察三:图像识别可以做subsampling。
前两个观察是用CNN的convolution layer来实现的,第三个观察是用Pooling layer来实现。
下面看看每个layer要做的事情:
一、convolution
1.1 filter的作用
假设我们有一张6X6的黑白图片,【1就表示有墨迹,0表示没有墨迹】。在convolution中有一组filter【每个filter就相当于FNN中的一个neuron,它是一个matrix】,filter中的每个值都是nn中的parameter,它和NN中的weights和biases是一样的都需要学习得到。
一个3X3的filter含义:在侦测一个3X3的pattern;它不是看整张image,而是看部分来侦探有没有某个pattern出现。
每个filter都会和输入的matrix做内积,有多少filter就可以得到多少feature map。
下面看看彩色图片的例子:
小结:
在图像处理中,卷积通常为特征提取的有效方法。一幅图像经过卷积操作后得到的结果称为特征映射(Feature Map)。
filter的效果图示:
给出在图像处理中几种:常用的滤波器,以及其对应的特征映射。图中最上面的滤波器是常用的高斯滤波器,可以用来对图像进行平滑去噪;中间和最下面的过滤器可以用来提取边缘特征。
convolution和fully connected有什么关系?
convolution的过程其实就是fully connected把一些weight拿掉而已:
减少了参数,原来6X6的输入都要与参数做运算,现在只有3X3个输入需要与对应参数做运算。
参数共享,filter在对6X6的图片做运算时,每个stride的参数都是一样的。这样实现了参数共享,需要的参数就更少了。
二、pooling
以Max pooling为例:
三、flatten的作用