李宏毅深度学习笔记2-4Cinvolutional neural network

1、为什么CNN适合影响识别

当我们直接用fully connect feedforward network做影像处理的时候,往往需要太多的参数,而CNN做的事就是简化neural network的架构。根据人的知识把一些用不上的weight去掉,就可以用比较少的参数来做影像处理。所以CNN比一般的DNN还要简单

CNN是如何把一些参数拿掉的

第一
在影像处理里面,第一层的hidden layer的neural就是取侦测某一种pattern。而大部分的pattern其实要小于整张的image,对一个neural来说,假设它要知道一个image里面有没有某一个pattern出现,它其实是不需要看整张image,它只要看image的一小部分。所以,每一个neural连接到每一个小块的区域就好了,不需要连接到整张完整的图。
第二
同样的pattern在image里面,可能会出现在不同的部分,但是代表同样的含义,它们有同样的形状,可以用同样的neural,同样的参数就可以把patter侦测出来。这样就可以减少参数的量
第三
可以对于一个image做subsampling,比如把一个image的奇数行,偶数列的pixel拿掉,变成原来四分之一的大小,它其实不影响人对这张image的理解。所以我们就可以用这样的概念把image变小,这样就可以减少需要的参数

2、CNN的架构

整个过程

input一张image,依次通过convolution layer,max pooling、convolution、max pooling反复无数次(次数需要设定好),这样以后,再做依次flatten,把flatten的output丢到一般fully connected feedforward network,然后得到影像辨识的结果。

三个对影像处理的观察与CNN的对应关系

propetry1:要生成一个pattern,只需要看image的一小部分。
propetry2:通用的pattern会出现在一张图片的不同的区域。
propetry3:可以做subsampling
前面的两个用convolution来处理,第三个用Max Pooling处理。

convolution

假设network的input是一张6×6的Image,对于每个pixel,1就代表有涂墨水,0就代表没有涂到墨水。
李宏毅深度学习笔记2-4Cinvolutional neural network
propetry1:在convolution layer里面,由一组的filter(每个filter等同于是fully connect layer里面的一个neuron)组成,每个filter是一个matrix(3×3),而每个filter里面的参数就是network的parameter(这些parameter是要学习出来的)
李宏毅深度学习笔记2-4Cinvolutional neural network
propetry2:把第一个filter放在image的左上角,把filter的9个值和image的9个值做内积结果为3。循环的进行移动(移动的距离叫做stride,stride的大小自己来设计),以此类推(每次都移动一格),直到你把filter移到右下角的时候
这样就把6×6的matrix,经过convolution process就得到4×4的matrix。而其中最大的值就代表是这个filter要侦测的pattern,这就考虑了propetry2。同一个pattern就可以用同一个filtert侦测出来
一个convolution layer有很多的filter,不同的filter有不同的参数,但它们做的事是一样的,都会获得一个4×4的matrix,这些matrix叫做feature map,而这个feature map可以看成另一张image,一共有几个filter就有几个image
如果是彩色的图片就相当于RGB三层的image,那么filter就是一个立方体,同样的遍历三维矩阵做内积就可以了
convolution和fully connected之间的关系
convolution就是fully connected layer把一些weight拿掉了。经过convolution的output其实就是一个hidden layer的neural的output。如果把这两个link在一起的话,convolution就是fully connected拿掉一些weight的结果。
做convolution的时候,把filter1放到左上角做inner product,得到内积为3,这件事情就等同于把6* 6的image拉直,对应一个neural的output是3,这个neural的output考虑了9个pixel。此时这个neuron的weight其实只连接到那9个pixel而已。而不是在fully connected中一个neural连接所有的input。而且因为是同一个filter所以相同的filter产生输出的weight是相同的,也即可以共享参数,这样就实现了参数的减少

max pooling

propetry3
把每一个filter得到4×4的maxtrix分组。每一组里选择它们的平均或者选最大的都可以,就是把四个value合成一个value。这个可以让你的image缩小。
然后把新的image再做一轮convolution和max pooling,知道得到一个满意的大小的矩阵
而且filter的数量一般是需要自己设计的,一般靠近input的地方比较少,之后会变多,假设每一层有25个filter,就会产生25个矩阵,然后将这25层叠加成一个三维矩阵提供给下一层。相当于一个channel=depth=1的图变成了一个channel=depth=25的图
例如,如果有28×28的输入图像和20x7×7的滤波器和步幅1的卷积层,那么将在该层的输出端获得20个22×22的特征图.请注意,这是以宽=height=22和depth=channels=20的卷形式呈现给下一层,也可以使用相同的表示法在RGB图像上训练CNN,例如CIFAR10数据集中的CNN,这将是32x32x3卷(卷积仅应用于2个空间维度)。因此每一次输出都是厚度为20的三维矩阵,只不过宽度和长度变小了

flatten

将最后的矩阵拉成一位向量,丢到fully connected feedforward netwwork,就可以了。

3、分析CNN学到了什么

方法1:可以直接看第一层所有filter的feature map
李宏毅深度学习笔记2-4Cinvolutional neural network
但高层的输入不再是真正的图片,对于高层的layer,我们可以用不同图片去看,对于每个神经元,哪些图片的数值最高,然后把这些图片放到一起,就可以大概知道这个神经元在检测什么了
李宏毅深度学习笔记2-4Cinvolutional neural network
方法2:用aka^k表示某一层的第k个filter的输出矩阵的元素和,方向用梯度上升的方式求可以使这个元素和最大的输入值
李宏毅深度学习笔记2-4Cinvolutional neural network
同理对于flaten的某一层的神经元也可以求出使其最大的图像
,如果我们去直接求输出层的最佳图像,结果如下
李宏毅深度学习笔记2-4Cinvolutional neural network
实际上却没有得到我们期望的结果(0就是0),而且这些图片真的进行测试的时候,模型会十分确信这个图片是对应的结果的,因此可能它实在用无法理解的方式在检测,这也意味着预测模型可能很容易被骗
方法3:我们也可以用一张图片的每一个像素去求正确结果对于它的微分的绝对值,绝对值越大代表对结果越重要,然后将每个像素的值组合成一张新的图片,发现侦测的物体的位置的值都普遍很高,这也可以让我们,了解模型都在侦测什么
李宏毅深度学习笔记2-4Cinvolutional neural network
方法4:可以把图片折遮起来,看看哪里会让模型侦测不出结果,再将这些位置合成,也可以观察侦测物体的位置,这也可以让我们;了解模型都在侦测什么
deep dream:夸张化CNN看到的东西(将输出的值增大)。
也可以使用一个模型中侦测style 的部分并保留其内容的部分就可以产生一些风格的变化
李宏毅深度学习笔记2-4Cinvolutional neural network
Alpha GO:把棋盘看成图片,预测下一步位置
Alpha GO如何解决maxpooling的问题呢?实际上他没有做maxpooling