文章目录
- Introduction
- Why CNN
- The Whole CNN
- Convolution
- Convolution v.s. Fully Conneted
- Max Pooling
- Flatten
- CNN in Keras
- What does CNN learn?
- CNN Application
- Why CNN
Introduction
图像识别在Deep Learing的input就是将图片转成pixel的维度个数,output就是要分类的种类的个数。
这个在Modularization那一章讲过,前面的layer是basic的,越往后就是模型的拼接。但是我们为什么要引入CNN呢?因为如果我们用fully connect的话,输入的数据就太多了,比如100100的彩色图,就是1001003的input vector。那么第一个hidden layer如果是1000个neuron,那就是300001000,那么太多了。
CNN就是用比较少的参数。
Why CNN
为什么我们可以用比较少的参数来做影像处理呢?
假设不同的neuron看到鸟的不同的部位,要看一张图片是不是鸟,不需要看整张图,而是看一部分即可。比如一个neuron就看鸟嘴。看红色框框的区域就可以了,所以每一个neuron只需要connect一个小小区域即可。
相同的特征可能出现在不同图片的不同的位置。但是我们并不需要专门设计一个网络去detect左上角有没有鸟嘴,中央有没有鸟嘴。只需要detect图片里有没有鸟嘴。share same parameter的neuron就是负责detect鸟嘴的。
还因为当我们将图片做subsampling时,比如同时拿掉奇数行列,缩小的图片并不影响我们对于图片的理解,对于神经网络也是一样。
The Whole CNN
Property1和2都是Convolution做的,Property 3 是Max pooling做的。
Convolution
每一个Fliter就是fully connect的一个neuron。里面的值都是fully connect的weight和bias,都是需要学习出来的。
filter和图片做内积
可以看出,我们这个filter的作用,是检测斜对角有没有都是1,如果都是1,那么它的内积就是最大的3。这样就可以detect出来。这就像Property 2,用同一个filter去detect相同的东西。如果是不同的图片,只要斜对角线都是1,就都可以检测出来。在一个CNN中,会有很多filter。
蓝色的Filter2就是另一个Filter,用于检测中间一列都是1的特征。最后得到的蓝色的矩阵,成为feature map。可以看到,我们有几个Filter,就有几个feature map。这些feature map最后会叠加在一起。
想起来为什么拿吸管插奶油蛋糕举例子了。终于明白了。吸管就是filter,一管子插进去,就会有不同的层,每一层就是一个feature map。
注意这里的filter大小都是相通的,也就是detect的东西大小要差不多。比如鸟嘴,如果一个图片嘴特别大,一个图片嘴特别小,这样可能CNN的效果会没有那么好。
如果是彩色的图片,那么input是3个channel的,比如366,那么我们的filter也需要是3 channel的,比如333,得到的每一个feature map也是3个channel的。疑问🤔️
Convolution v.s. Fully Conneted
其实我们的filter就相当于DNN中的权重,只不过不是全部的权重,而Feature Map就是第一层的hidden layer。
由上图可以看出,Filter1 对于图片的左上角来说,它只作用于pixel=1,2,3,7,8,9,13,14,15。Filter里面对应的值,可以看到就是DNN的input与神经元3的连线。不同的位置对应不同的颜色。
如果是fully conected,一个neuron应该连接36个input(全部的pixel)。但是如果用了Convolution,就只需要连接Filter的大小个。所以我们就用了比较少的参数来完成这个事情。
从上图可以看出,-1的neuron分享的input是2,3,4,8,9,10,14,15,16.这里特别注意,neuron 3和neuron -1,其实有一些weight是share的。比如neuron 3 的input 2 和neuron -1 的input 2是共享的。这就意味着卷机操作,使用了更少的参数,因为它们之间的weight是相互share的。
那么这个怎么做反向传播呢?其实很简单,就是和原来的back propagation一样,只是有一些weight是0,永远不需要training。如果是共享的神经元,那么它们的weight的梯度算出来之后,在做平均,之后更新即可。
之前存了一份CNN的反向传播计算。我把笔记回头插在这里。
插入笔记
Max Pooling
按照window size 2*2进行pooling。可以是取max或者avg。
这里注意,如果是灰色图片,一个channel。那么这个图片66.经过多少个filter 和Max pooling后,就产生了很多个feature map。产生的个数就是filter的个数。如果有50个filter,就有50个feature map。如果是RGB图片,那么就是503的feature map。
所以一张图片,经过几次filter和Max pooling后,图片就变小了。
经过一次filter 和 max pooling后,比如有50个feature map,那么在第二次的时候,同样还是会输出50个filter。(这里是有疑问的,问下老师)
Flatten
CNN in Keras
可以看到,经过第一次filter是331的,output有25个feature map,但是第二组是50个filter,这里的filter是3325的,所以后来出来是50个feature map。111150的。终于理解了。
What does CNN learn?
我们选择了经过第2层CNN50个filter后,前12个degree最高的filter。比如第3个filter。它的作用就是检测图像的斜线,如果图片中有斜线,那么这个filter是最兴奋的。而第4个filter是检测短横线的。
aj是flatten的最后一个hidden layer,这里出来的neuron都是比较大的pattern了。
可以看到0-8的y,我们想着本应该和数字是一样的,但是对于机器来说并不是这样,他学出来的并不是我们理解的数据。老师又将这些数据拿到train好的CNN网络中,发现CNN依然能辨别它们对应的数字!
所以说,机器学习到的东西,和人类认知想象的是不一样的。
我们加了一个L1的正则化,就有点像数字了。
CNN Application
我们将正直变大,负值变小。会让图片更加突出。
得到的Deep Dream如下:
connect content和style,然后放入CNN,max两者,就得到了混合图片。
Why CNN
这又回到了我们最初说的property1 (一些pattern是小的范围)和 property2(一些pattern是share的)了。
Alpha Go没有用max pooling。
人看到上面的频谱图,可以知道说了什么,那么说明机器也可以通过图像识别进行翻译。这里注意window要按照Frequency移动,黑色的框框,而是不按照Time移动。因为这个CNN后面要接LSTM后者RNN,已经考虑Time的维度,但是在频率上,filter的目的就是去detect不同的声音讯号。
文字处理是在句子维度移动,而不在embedding上移动,也就是不再红框移动。而是沿着篮框移动。