Lecture10 Convolutional Neural Network

为什么CNN常用在影像处理上?如果我们用Fully Network来做影像处理的话,每一个Neuron实际上就代表一个Classifier,举例来说,第一层的Neuron做的事情就是有没有绿色出现,有没有红色出现,有没有条纹出现,第二层的Neuron做的事情就是相比第一层更加复杂,在第一层Layer的Output基础上,如果看到直线横线,那么可能就是框框的一部分,如果看到棕色直条纹就是木纹,看到斜条纹就可能是轮胎等等,第三层再在第二层Layer的Output基础上再次做更加复杂的Classify。假设我们输入的是一张解析度100*100的彩色图片,如果把它转换成Vector将会有100 * 100 * 3=30000维,如果第一层Layer有1000个Neuron,那么第一层Layer的参数就有30000 * 1000个,实在是太多了,所以就需要简化这个网络的架构,根据我们之前掌握的知识,就可以判断出某些参数是用不上的,一开始就把这些参数过滤掉,所以CNN是比一般的DNN更简单的架构。

image.png

为什么我们有可能把一些参数拿掉?有如下几个原因:
1.在影像处理中,如果我们说第一层Layer中的Neuron做的事情就是侦测有没有某一种Pattern出现,但是大部分Pattern是比整张Image还要小的,所以对于一个Neuron来说它不需要看整张Image。现在我们有一张图片,假设某个Neuron的功能是侦测有没有鸟嘴的出现,只需给Neuron看红色框框的部分它就可以决定出结果。

image.png

2.同样的Pattern可能会出现在Image中不同的位置,但只需要用同一种Neuron就可以侦测出来。


image.png

3.我们可以将一个Image做一个Subsampling,分别把它的奇数行偶数列拿掉,所小为原来的1/10,对于识别结果不会产生影响。
image.png

整个CNN的结构如下:


image.png

对于图像处理的三个特性,1跟2是通过Convolution来处理,3是通过Max Pooling来处理。


image.png

接下来介绍Convolution Layer的工作流程:假设现在我们Network的输入是一张6 * 6的黑白Image,在Convolition Layer里面有一组Filter(就等于Fully Connecter Network中的一个Neuron),每一个Filter就是一个矩阵,每个矩阵中的值就是Network的Parameter(等同于Neuron的Weight和Bias),每个Filter里的参数是自动被学出来的。如果Filter是3 * 3的矩阵,那么它的功能就是侦测Image里3 * 3范围有没有某一个Pattern,将输入的矩阵与每个Filter相乘,就会得到一组结果矩阵,称为Feature Map。

image.png

如果我们的输入是一张彩色的Image呢?彩色由RGB三种组成,所以我们的输入矩阵其实不是跟黑白Image一样只是一张,而是三张,所以我们每个Filter也是三张矩阵。需要注意的是对于每种颜色的矩阵不是分开来算,而是每一个Filter都考虑到了三种颜色的矩阵,对于每个Filter其中的一张矩阵,分别与Image的三张矩阵做内积,结果组合在一起。


image.png

那么Convolution跟Fully Connecter有什么关系呢?可以这么理解,Convolution其实就是Fully Connected Network中的一层Layer把某些Weight拿掉而已。通过Filter后的输出也就是FeatureMap其实就可以当作Fully Network中一层Layer的输出。

image.png

现在来分析一下Convolution中Filter的工作过程,当一个3 * 3的Filter与Image的输入矩阵做内积时,实际上可以把Image的输入矩阵拉直,拉成一个一维的向量,如下图所示,内积后得到一个结果,也就是Layer中某个Neuron的输出,而这个Neuron的Weight(也就是Filter中矩阵的参数)只连接到输入的一维向量的第1,2,3,8,9,10,13,14,15个位置的Input。而对于Fully Connected Network中,每一个Neuron的Weight是要连接到所有Input的。现在我们将Input的矩阵移动一格,再与Filter做内积,得到一个结果-1,那么输出这个结果的Neuron的Weight只连接到Image的第2,3,4,8,9,10,14,15,16个的输入,而这个Neuron的Weight参数是与输出3的Neuron的参数是相同的,所以这两个Neuron做到了Share Weights(方法是我们强迫一些Neuron之间必须用相同的Weight),对于Fully Connected,每个Neuron都有一组自己的Weight,那么相比来看,Convolution又大大减少了参数的数量。

image.png

Convolution做完后接下来做MaxPooling,相比Convolution来说,MaxPooling的工作就简单许多。根据Filter1与输入矩阵的内积得到FeatureMap1,Filter2与输入矩阵的内积得到FeatureMap2,接下来把输出都分为四个一组,每组可以选平均值或者最大值或者其他方法,目的就是把原来四个值合成一个值。


image.png

所以当一张6 * 6的Image做完一次Convolution和一次MaxPooling后,它就变成了一张新的2 * 2的Image。


image.png

Flatten的做法就是将FeatureMap拉直,丢到FullyConnectedNetwork中。


image.png

如何判断一个Filter做的是什么工作?(这部分有点没听明白)将FeatureMap第K层的结果加起来作为第K个卷积核的激活程度。现在我们的任务就是找到一个x使这个激活程度最大。(通俗的说就是找一张图案使得某个Filter的FeatureMap取得最大值,也就是这个Filter主要是用来识别这种图案特征的。)

image.png

如下列举了12个能够使前12个Filter的FeatureMap值最大的Image。对于每个FIlter来说,它考虑的都是图上一个小小的范围而已,如果图片上出现了某种条纹,那么这个Filter的输出就会很大。

image.png

接下来分析Fully Connected中的Layer。如何弄清楚Fully Connected中的每个Neuron的功能呢?如法炮制,我们定义某一层Layer中第j个Neuron的输出为aj,接下来要做的事情就是找一张Image输入,使得aj取得最大值。需要注意的是,此时每个Neuron不再只是针对Image中的一个小小的范围,而是整张Image。

image.png

那么同理再观察最终的输出层Neuron,假设在做数字识别,输出层有10个Neuron,代表数字0~9,那么根据之前对Convolution中FIlter以及FullyConnected中Neuron的观察经验,是否输出层每个Neuron的输出就大致像某个数字?其实不是,结果如下,每个都像黑白电视一样,是出错了吗?并不是,只是CNN学到的东西跟人类想象中的不太一样,但它确实是能够分辨手写数字。


image.png

我们有没有办法让这些图看起来更像数字呢?可以根据人类的先验知识,来加一些限制条件。比如说,一张图片如果是手写数字的话,那么整张图片不可能大部分都是被涂色的(图片中白色表示有墨水),用xij表示图片输入矩阵的第i行第j列的值,将所有的xij值取绝对值加起来,再用yi减去,这个公式的意思就是找到一张Image,能够使y输出最大的情况下图片中大部分的地方是没有涂色的,结果比不加限制条件时更加像一个数字。

image.png

你可能感兴趣的:(Lecture10 Convolutional Neural Network)