Why CNN?
当我们直接用一般的fully connected的feedforward network来做图像处理的时候,往往会需要太多的参数,100100的彩色图片input是3100*100维向量,如果第一层hidden layer有1000个神经元,则一共需要需要30000000个参数
怎么减少参数呢?
- 想要发现图片的样式不需要看整张图片,只需要看一部分图片
- 对于出现在不同位置的同样的pattern,处理这些的神经元功能相似,可以共用同一组参数
- 利用subsampling这个概念把image变小,从而减少需要用到的参数量
CNN架构
接下来详细介绍每一层
Convolution
假设input是一张6*6的黑白图像,每个pixel只需要用一个value来表示,而在convolution layer里面,有一堆Filter,每一个Filter,其实等同于是Fully connected layer里的一个neuron,其中的的参数是通过training data学习到的
从image的左上角开始,做一个slide window,每次向右挪动一定的距离(本例中stride设定1),每次filter停下的时候就跟image中对应的33的matrix计算内积(相同位置的值相乘并累计求和),经过一整个convolution的process,最终得到下图所示的红色的44 matrix
观察上图中的Filter1,它斜对角的地方是1,1,1,所以它的工作就是detect有没有连续的从左上角到右下角的1,1,1的pattern出现在这个image里面,此时filter得到的卷积结果的左上和左下得到了最大的值3,这就代表说,该filter所要侦测的pattern出现在image的左上角和左下角
同一个pattern出现在image左上角的位置和左下角的位置,并不需要用到不同的filter,我们用filter1就可以侦测出来,这就考虑了property 2
Feature Map
在一个convolution的layer里面,它会有一系列filter,不一样的filter会有不一样的参数,把filter2跟image做完convolution以后,就会得到另外一个蓝色的44 matrix,那这个蓝色的44 matrix跟之前红色的4*4matrix合起来,就叫做Feature Map(特征映射),有多少个filter,对应就有多少个映射后的image
同学提问:filter大小是固定的,对于不同大小的鸟嘴怎么办?
CNN对不同scale的相同pattern的处理上存在一定的困难,由于现在每一个filter size都是一样的,这意味着,如果你今天有同一个pattern,它有不同的size,有大的鸟嘴,也有小的鸟嘴,CNN并不能够自动处理这个问题;DeepMind曾经发过一篇paper,上面提到了当你input一张image的时候,它在CNN前面,再接另外一个network,这个network做的事情是,它会output一些scalar,告诉你,它要把这个image的里面的哪些位置做旋转、缩放,然后,再丢到CNN里面,得到较好的表现
彩色图片怎么处理?
彩色图片RGB有三层,对应的filter也有三层
Convolution V.s. Fully connected
filter是特殊的”neuron“
convolution其实就是fully connected的layer把一些weight拿掉而已,下图中绿色方框标识出的feature map的output,其实就是hidden layer的neuron的output
如下图所示,convolution得到左上角的值3
这件事情等同于,我们现在把这个image的6*6的matrix拉直变成右边这个用于input的vector
然后,有一个neuron,这个neuron带weight的连线只连接了vector的1,2,3,7,8,9,13,14,15共9个位置,而这个neuron和这9个pixel连线上所标注的的weight就是filter matrix里面的这9个数值,这些input经过这个neuron之后,得到的output是3
对比fully connected要连接36个位置,但是,我们现在只用连接9个input,因为我们知道要detect一个pattern,不需要看整张image,看9个input pixel就够了,所以当我们这么做的时候,就用了比较少的参数
“neuron”之间共享参数
当我们把filter做stride = 1的移动的时候,得到另外一个output值-1作为另外一个neuron的output
output为3和-1的这两个neuron,它们分别去检测在image的两个不同位置上是否存在某个pattern,这两个neuron共享一组weight,虽然这两个neuron连接到的pixel对象各不相同,但它们用的weight都必须是一样的,等于filter里面的元素值,这件事情就叫做weight share,进一步减少了参数数量
所以CNN通过减少连接和share weight两次减少了参数
Max Pooling
max pooling就是做subsampling
根据filter 1,我们得到一个44的matrix,根据filter 2,你得到另外一个44的matrix,我们把output四个分为一组,每一组里面通过选取平均值或最大值的方式,把原来4个value合成一个value
PS:如果取Maximum放到network里面,不就没法微分了吗?后面的章节会讲到Maxout network,其实用微分的方式来处理它
Convolution + Max Pooling
所以,结论是这样的:
做完一次convolution加一次max pooling,我们就把原来66的image,变成了一个22的image
第一层convolution+max pooling结束后,因为使用了2个filter,所以得到的2*2的image,它每一个pixel的深度(channel)=2
the number of the channel is the number of filters
不同的filter检测的是该image同一区域上的不同特征属性,所以每一层channel(通道)代表的是一种属性,一块区域有几种不同的属性,就有几层不同的channel,对应的就会有几个不同的filter对其进行convolution操作
PS: 假设我第一个convolution有25个filter,通过这些filter得到25个feature map,然后repeat的时候第二个convolution也有25个filter,那这样做完,我是不是会得到 2 5 2 25^2 252个feature map?
其实不是这样的,一次convolution结束,得到25个feature map之后再做一次convolution,还是会得到25个feature map,因为convolution在考虑input的时候,是会考虑深度的,它并不是每一个channel分开考虑,而是一次考虑所有的channel
Flatten
做完convolution和max pooling之后,提取出了image的feature,它相较于原先一整个image的vetor,少了很大一部分内容,因此需要的参数也大幅度地减少了,紧接着进行flatten操作,Flatten的意思是,把左边的feature map拉直,然后把它丢进一个Fully connected Feedforward network中去做最后的分类工作
CNN in Keras
后面还没看。。。