Delete 第五章_卷积神经网络(CNN).md

This commit is contained in:
TroyChang 2018-11-13 14:20:21 +08:00 committed by GitHub
parent 33b21794cc
commit faeed1f023
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 0 additions and 815 deletions

View File

@ -1,815 +0,0 @@
# 第五章 卷积神经网络CNN
标签(空格分隔): 深度学习
---
Markdown Revision 1;
Date: 2018/11/08
Editor: 李骁丹-杜克大学
Contact: xiaodan.li@duke.edu
## 5.1 卷积神经网络的组成层
1. 卷积神经网络主要应用于具有网格拓扑结构的数据集。
2. 卷积神经网络在语音识别,图像处理以及人脸识别方面有了广泛的应用并取得了巨大的成功。
3. 卷积神经网络主要包含3种层
> * 卷积运算层:该层利用过滤器对输入特征进行卷积化以获得本地特征。本地特征构成特征图(feature map)。
> * 池化层: 池化操作包括取最值,取和以及取平均。池化操作将作用于特征图(feature map)。
> * 全连接层:基于池化层结果,全连接层将进行将分类预测等操作。
一个完整的神经网络就是由这三种层叠加组成的。
**结构示例**
拿CIFAR-10数据集举例一个典型的卷积神经网络分类器应该有[INPUT - CONV - RELU - POOL - FC]的结构,
> * INPUT[32\*32\*3]包含原始图片数据中的全部像素长宽都是32有RGB 3个颜色通道。
> * CONV卷积层中每个神经元会和上一层的若干小区域连接计算权重和小区域像素的内积比如结果数据为[32\*32\*12]的。
> * RELU层就是神经元激励层主要的计算就是max(0,x),结果数据依旧是[32\*32\*12]。
> * POOLing层操作可以理解成一个下采样得到的结果维度就变为[16\*16\*12]。
> * 全连接层一般用于最后计算类别得分,得到的结果为[1\*1\*10]其中的10对应10个不同的类别。该层的所有神经元会和上一层的所有神经元连接。
这样卷积神经网络作为一个中间通道就一步步把原始图像数据转成最后的类别得分。有一点我们要提一下刚才提及的几种不同神经网络层其中有一些层是需要进行参数训练另外一些不需要。详细一点说卷积层和全连接层包含权重和偏移而RELU和POOLing层只是一个固定的函数运算是不包含权重和偏移参数的。不过POOLing层包含了我们手动指定的超参数。
**总结一下**
* 一个卷积神经网络由多种不同类型的层(卷积层/RELU层/POOLing层/全连接层等)叠加而成。
* 每一层的输入结构是3维的数据计算完输出依旧是3维的数据。
* 卷积层和全连接层包含训练参数但是RELU 和 POOLing 层不包含。
* 卷积层,全连接层和 POOLing 层包含超参数RELU 层没有。
下图为 CIFAR-10 数据集构建的一个卷积神经网络结构示意图:
![](./img/ch5/img1.png)
## 5.2 卷积如何检测边缘信息?
卷积运算是卷积神经网络最基本的组成部分。神经网络的前几层首先检测边缘,接下来的层有可能检测到物体的部分区域,更靠后的一些层可能检测到完整的物体。
先介绍一个概念,过滤器:
![image](./img/ch5/img2.png)
这是一个3*3的过滤器是一个矩阵数值如上所示。
假设我们有一个6*6的灰度图像
![image](./img/ch5/img3.png)
把这个图像与过滤器进行卷积运算,卷积运算在此处用“*”表示。
![image](./img/ch5/img4.png)
如图深蓝色区域所示过滤器在图像左上方3*3的范围内逐一加权相加得到-5。
同理将过滤器右移进行相同操作再下移直到过滤器对准图像右下角最后一格。依次运算得到一个4*4的矩阵。
在了解了过滤器以及卷积运算后,让我们看看为何过滤器能检测物体边缘:
举一个最简单的例子:
![image](./img/ch5/img5.png)
这张图片如上所示,左半边全是白的,右半边全是灰的,我们仍然使用之前的过滤器,对该图片进行卷积处理:
![image](./img/ch5/img6.png)
可以看到最终得到的结果中间是一段白色两边为灰色于是垂直边缘被找到了。为什么呢因为在6*6图像中红框标出来的部分也就是图像中的分界线所在部分与过滤器进行卷积结果是30。而在不是分界线的所有部分进行卷积结果都为0.
在这个图中白色的分界线很粗那是因为6\*6的图像尺寸过小对于1000\*1000的图像我们会发现在最终结果中分界线较细但很明显。
这就是检测物体垂直边缘的例子水平边缘的话只需将过滤器旋转90度。
## 5.3 卷积的几个基本定义?
首先,我们需要定义卷积层参数。
### 5.3.1 卷积核大小
Kernel Size: 卷积核大小定义了卷积的视图范围。针对二维通常选择大小是3即3×3像素。
### 5.3.2 卷积核的步长
Stride: Stride定义了卷积核步长。虽然它的默认值通常为1但我们可以将步长设置为2然后对类似于MaxPooling的图像进行向下采样。
### 5.3.3 边缘填充
Padding: Padding用于填充输入图像的边界。一个(半)填充的卷积将使空间输出维度与输入相等而如果卷积核大于1则未被填充的卷积将会使一些边界消失。
### 5.3.4 输入和输出通道
一个卷积层接受一定数量的输入通道(I),并计算一个特定数量的输出通道(O)这一层所需的参数可以由I\*O\*K计算K等于卷积核中值的数量。
## 5.4 卷积的网络类型分类?
### 5.4.1 普通卷积
普通卷积如下图所示。
![image](./img/ch5/img7.png)
### 5.4.2 扩张卷积
又名空洞atrous卷积扩张的卷积引入了另一个被称为扩张率dilation rate的卷积层。扩张率定义了卷积核中值之间的间隔。一个3×3卷积核的扩张率为2它的视图与5×5卷积核相同而只使用9个参数。一个5×5卷积核每两行或两列删除一行或一列。
这将以同样的计算代价提供更广阔的视角。扩张的卷积在实时分割领域特别受欢迎。如果需要广泛视图,但不能负担较多个卷积或更大的卷积核,往往会使用扩张卷积。
举例:
![image](./img/ch5/img8.png)
### 5.4.3 转置卷积
转置卷积也称反卷积deconvolution。虽然有些人经常直接叫其反卷积但严格意义上讲是不合适的因为它不符合反卷积的基本概念。反卷积确实存在但它们在深度学习领域并不常见。一个实际的反卷积会恢复卷积的过程。将一个图像放入一个卷积层中。接着把输出传输到一个黑盒子里最后该黑盒将输出原始图像。这个黑盒子就完成了一个反卷积。其是卷积层的数学逆过程。
转置卷积在某种程度上与反卷积类似因为它在相同的空间分辨率下是一个假设的反卷积层。然而在数值上执行的实际数学操作是不同的。一个转置卷积层执行一个常规的卷积但是它会恢复它的空间变换spatial transformation
在这一点上,你应该非常困惑,让我们来看一个具体的例子:
5×5的图像被馈送到一个卷积层。步长设置为2无边界填充而卷积核是3×3。结果得到了2×2的图像。
如果想要逆转这个过程我们需要反向的数学运算以便从我们输入的每个像素中生成9个值。我们将步长设置为2来遍历输出图像。这就是一个反卷积过程。
![image](./img/ch5/img9.png)
一个转置的卷积做法与此不同。唯一的共同点是它的输出仍然是一个5×5的图像但其实际上执行的是正常卷积运算。为了实现这一点我们需要在输入上执行一些奇特的填充。
因此这一步不会逆转上面的过程。至少不考虑数值。
它仅仅是重新构造了之前的空间分辨率并进行了卷积运算。这不是数学上的逆过程,但是对于编码-解码器Encoder-Decoder架构来说这仍然是非常有用的。这样我们就可以把图像的尺度上推upscaling和卷积结合起来而不是做两个分离的过程。
如果我们想反转这个过程我们需要反数学运算以便从我们输入的每个像素中生成9个值。之后我们以2步幅的设置来遍历输出图像。这将是一个反卷积。
![image](./img/ch5/img10.png)
### 5.4.4 可分离卷积
在一个可分离卷积中我们可以将内核操作拆分成多个步骤。我们用y = convxk表示卷积其中y是输出图像x是输入图像k是内核。这一步很简单。接下来我们假设k可以由下面这个等式计算得出k = k1.dotk2。这将使它成为一个可分离的卷积因为我们可以通过对k1和k2做2个一维卷积来取得相同的结果而不是用k做二维卷积。
![image](./img/ch5/img11.png)
我们以通常用于图像处理的Sobel内核为例。你可以通过乘以向量[10-1]和[1,2,1] .T获得相同的内核。在执行相同的操作时你只需要6个而不是9个参数。
上面的示例显示了所谓的空间可分离卷积,据我所知,这并不是在深度学习中使用的。我只是想确保在他人费劲地操作时,你不会受到如此困惑。在神经网络中,我们通常使用的是一种叫做深度可分离卷积的神经网络。
## 5.5 图解12种不同类型的2D卷积
http://www.sohu.com/a/159591827_390227
## 5.6 2D卷积与3D卷积有什么区别
### 5.6.1 2D卷积
2D卷积操作如图所示为了解释的更清楚分别展示了单通道和多通道的操作。且为了画图方便假定只有1个filter即输出图像只有一个chanel。
其中针对单通道输入图像的channel为1卷积核尺寸为 (k_h, k_w, 1),卷积核在输入图像上的的空间维度(即(height,width)两维)上进行进行滑窗操作,每次滑窗和 (k_h, k_w) 窗口内的values进行卷积操作现在都用相关操作取代得到输出图像中的一个value。针对多通道假定输入图像的channel为3卷积核尺寸为 (k_h, k_w, 3) 卷积核在输入图像上的的空间维度(即(h, w)两维上进行进行滑窗操作每次滑窗与3个channels上的 (k_h, k_w) 窗口内的所有的values进行相关操作得到输出图像中的一个value。
![image](./img/ch5/img12.png)
### 5.6.2 3D卷积
3D卷积操作如图2所示同样分为单通道和多通道且只使用一个filter输出一个channel。其中针对单通道与2D卷积不同之处在于输入图像多了一个 length 维度卷积核也多了一个k_l维度因此卷积核在输入3D图像的空间维度height和widthw维和length维度上均进行滑窗操作每次滑窗与 (k_h, k_w, k_l) 窗口内的values进行相关操作得到输出3D图像中的一个value.
针对多通道则与2D卷积的操作一样每次滑窗与3个channels上的 (k_h, k_w, k_l) 窗口内的所有values进行相关操作得到输出3D图像中的一个value。
![image](./img/ch5/img13.png)
## 5.7 有哪些池化方法?
在卷积神经网络中,我们经常会碰到池化操作,而池化层往往在卷积层后面,通过池化来降低卷积层输出的特征向量,同时改善结果(不易出现过拟合)。
为什么可以通过降低维度呢?
因为图像具有一种“静态性”的属性,这也就意味着在一个图像区域有用的特征极有可能在另一个区域同样适用。因此,为了描述大的图像,一个很自然的想法就是对不同位置的特征进行聚合统计,例如,人们可以计算图像一个区域上的某个特定特征的平均值 (或最大值)来代表这个区域的特征。
### 5.7.1 一般池化General Pooling
池化作用于图像中不重合的区域(这与卷积操作不同),过程如下图。
![image](./img/ch5/img14.png)
![image](./img/ch5/img15.png)
我们定义池化窗口的大小为sizeX即下图中红色正方形的边长定义两个相邻池化窗口的水平位移/竖直位移为stride。一般池化由于每一池化窗口都是不重复的所以sizeX=stride。
![image](./img/ch5/img16.png)
最常见的池化操作为平均池化mean pooling和最大池化max pooling
* 平均池化:计算图像区域的平均值作为该区域池化后的值。
* 最大池化:选图像区域的最大值作为该区域池化后的值。
### 5.7.2 重叠池化General Pooling
重叠池化正如其名字所说的相邻池化窗口之间会有重叠区域此时sizeX>stride。论文中有作者使用了重叠池化其他的设置都不变的情况下 top-1和top-5 的错误率分别减少了0.4% 和0.3%。
### 5.7.3 空间金字塔池化Spatial Pyramid Pooling
空间金字塔池化可以把任何尺度的图像的卷积特征转化成相同维度这不仅可以让CNN处理任意尺度的图像还能避免裁剪(cropping)和弯曲(warping)操作,导致一些信息的丢失,具有非常重要的意义。
一般的CNN都需要输入图像的大小是固定的这是因为全连接层的输入需要固定输入维度但在卷积操作是没有对图像尺度有限制所以作者提出了空间金字塔池化先让图像进行卷积操作然后转化成维度相同的特征输入到全连接层这个可以把CNN扩展到任意大小的图像。
![image](./img/ch5/img17.png)
空间金字塔池化的思想来自于Spatial Pyramid Model,它一个pooling变成了多个scale的pooling。用不同大小池化窗口作用于卷积特征我们可以得到1*1,2*2,4*4的池化结果由于conv5中共有256个过滤器所以得到1个256维的特征4个256个特征以及16个256维的特征然后把这21个256维特征连接起来输入全连接层通过这种方式把不同大小的图像转化成相同维度的特征。
![image](./img/ch5/img18.png)
对于不同的图像要得到相同大小的pooling结果就需要根据图像的大小动态的计算池化窗口的大小和步长。假设conv5输出的大小为a*a需要得到n*n大小的池化结果可以让窗口大小sizeX为[a/n],步长为[a/n]。下图以conv5输出的大小为13*13为例。
![image](./img/ch5/img19.png)
疑问如果conv5输出的大小为14*14[pool1*1]的sizeX=stride=14[pool2*2]的sizeX=stride=7这些都没有问题但是[pool4*4]的sizeX=5stride=4最后一列和最后一行特征没有被池化操作计算在内。
SPP其实就是一种多个scale的pooling可以获取图像中的多尺度信息在CNN中加入SPP后可以让CNN处理任意大小的输入这让模型变得更加的flexible。
## 5.8 1x1卷积作用
1×1的卷积大概有两个方面的作用
1. 实现跨通道的交互和信息整合。
2. 进行卷积核通道数的降维和升维。
下面详细解释一下:
1. 1×1的卷积层可能引起人们的重视是在NIN(Network In Network)的结构中论文中林敏师兄的想法是利用MLP(multilayer perceptron)代替传统的线性卷积核从而提高网络的表达能力。文中同时利用了跨通道pooling的角度解释认为文中提出的MLP其实等价于在传统卷积核后面接cccp层从而实现多个feature map的线性组合实现跨通道的信息整合。而cccp层是等价于1×1卷积的因此细看NIN的caffe实现就是在每个传统卷积层后面接了两个cccp层其实就是接了两个1×1的卷积层
2. 进行降维和升维引起人们重视的可能是在GoogLeNet里。对于每一个Inception模块如下图原始模块是左图右图中是加入了1×1卷积进行降维的。虽然左图的卷积核都比较小但是当输入和输出的通道数很大时乘起来也会使得卷积核参数变的很大而右图加入1×1卷积后可以降低输入的通道数卷积核参数、运算复杂度也就跟着降下来了。以GoogLeNet的3a模块为例输入的feature map是28×28×1923a模块中1×1卷积通道为643×3卷积通道为128,5×5卷积通道为32如果是左图结构那么卷积核参数为1×1×192×64+3×3×192×128+5×5×192×32而右图对3×3和5×5卷积层前分别加入了通道数为96和16的1×1卷积层这样卷积核参数就变成了1×1×192×64+1×1×192×96+3×3×96×128+1×1×192×16+5×5×16×32参数大约减少到原来的三分之一。同时在并行pooling层后面加入1×1卷积层后也可以降低输出的feature map数量左图pooling后feature map是不变的再加卷积层得到的feature map会使输出的feature map扩大到416如果每个模块都这样网络的输出会越来越大。而右图在pooling后面加了通道为32的1×1卷积使得输出的feature map数降到了256。GoogLeNet利用1×1的卷积降维后得到了更为紧凑的网络结构虽然总共有22层但是参数数量却只是8层的AlexNet的十二分之一当然也有很大一部分原因是去掉了全连接层
![image](./img/ch5/img20.png)
最近大热的MSRA的ResNet同样也利用了1×1卷积并且是在3×3卷积层的前后都使用了不仅进行了降维还进行了升维使得卷积层的输入和输出的通道数都减小参数数量进一步减少如下图的结构。不然真不敢想象152层的网络要怎么跑起来TAT
![image](./img/ch5/img21.png)
## 5.9 卷积层和池化层有什么区别?
首先可以从结构上可以看出,卷积之后输出层的维度减小,深度变深。但池化层深度不变。同时池化可以把很多数据用最大值或者平均值代替。目的是降低数据量。降低训练的参数。对于输入层,当其中像素在邻域发生微小位移时,池化层的输出是不变的,从而能提升鲁棒性。而卷积则是把数据通过一个卷积核变化成特征,便于后面的分离。
1:卷积
当从一个大尺寸图像中随机选取一小块,比如说 8x8 作为样本,并且从这个小块样本中学习到了一些特征,这时我们可以把从这个 8x8 样本中学习到的特征作为探测器,应用到这个图像的任意地方中去。特别是,我们可以用从 8x8 样本中所学习到的特征跟原本的大尺寸图像作卷积,从而对这个大尺寸图像上的任一位置获得一个不同特征的激活值。
下面给出一个具体的例子:假设你已经从一个 96x96 的图像中学习到了它的一个 8x8 的样本所具有的特征,假设这是由有 100 个隐含单元的自编码完成的。为了得到卷积特征,需要对 96x96 的图像的每个 8x8 的小块图像区域都进行卷积运算。也就是说,抽取 8x8 的小块区域并且从起始坐标开始依次标记为1112...一直到8989然后对抽取的区域逐个运行训练过的稀疏自编码来得到特征的激活值。在这个例子里显然可以得到 100 个集合,每个集合含有 89x89 个卷积特征。
![image](./img/ch5/img22.png)
2说下池化其实池化很容易理解先看图
转自: http://blog.csdn.net/silence1214/article/details/11809947
![image](./img/ch5/img23.png)
比如上方左侧矩阵A是20*20的矩阵要进行大小为10*10的池化那么左侧图中的红色就是10*10的大小对应到右侧的矩阵右侧每个元素的值是左侧红色矩阵每个元素的值得和再处于红色矩阵的元素个数也就是平均值形式的池化。
3上面说了下卷积和池化再说下计算中需要注意到的。在代码中使用的是彩色图彩色图有3个通道那么对于每一个通道来说要单独进行卷积和池化有一个地方尤其是进行卷积的时候要注意到隐藏层的每一个值是对应到一幅图的3个通道穿起来的所以分3个通道进行卷积之后要加起来正好才能对应到一个隐藏层的神经元上也就是一个feature上去。
## 5.10 卷积核一定越大越好?
AlexNet中用到了一些非常大的卷积核比如11×11、5×5卷积核之前人们的观念是卷积核越大receptive field感受野越大看到的图片信息越多因此获得的特征越好。虽说如此但是大的卷积核会导致计算量的暴增不利于模型深度的增加计算性能也会降低。于是在VGG最早使用、Inception网络中利用2个3×3卷积核的组合比1个5×5卷积核的效果更佳同时参数量3×3×2+1 VS 5×5×1+1 被降低因此后来3×3卷积核被广泛应用在各种模型中。多个小的卷积核叠加使用要远比一个大的卷积核单独使用效果要好的多在连通性不变的情况下大大降低了参数个数和计算复杂度。当然卷积核也不是越小越好对于特别稀疏的数据比如下图所示当使用比较小的卷积核的时候可能无法表示其特征如果采用较大的卷积核则会导致复杂度极大的增加。总而言之我们应该选择多个相对小的卷积核来进行卷积。
## 5.11 每层卷积只能用一种尺寸的卷积核?
传统的层叠式网络基本上都是一个个卷积层的堆叠每层只用一个尺寸的卷积核例如VGG结构中使用了大量的3×3卷积层。事实上同一层feature map可以分别使用多个不同尺寸的卷积核以获得不同尺度的特征再把这些特征结合起来得到的特征往往比使用单一卷积核的要好谷歌的GoogLeNet或者说Inception系列的网络就使用了多个卷积核的结构
![image](./img/ch5/img24.png)
如上图所示一个输入的feature map 分别同时经过1×1、3×3、5×5的卷积核的处理得出的特征再组合起来获得更佳的特征。
## 5.12 怎样才能减少卷积层参数量?
发明GoogleNet的团队发现如果仅仅引入多个尺寸的卷积核会带来大量的额外的参数受到Network In Network中1×1卷积核的启发为了解决这个问题他们往Inception结构中加入了一些1×1的卷积核如图所示
![image](./img/ch5/img25.png)
加入1×1卷积核的Inception结构
![image](./img/ch5/img26.png)
根据上图我们来做个对比计算假设输入feature map的维度为256维要求输出维度也是256维。有以下两种操作
* 1256维的输入直接经过一个3×3×256的卷积层输出一个256维的feature map那么参数量为256×3×3×256 = 589,824
* 2256维的输入先经过一个1×1×64的卷积层再经过一个3×3×64的卷积层最后经过一个1×1×256的卷积层输出256维参数量为256×1×1×64 + 64×3×3×64 + 64×1×1×256 = 69,632。足足把第一种操作的参数量降低到九分之一
1×1卷积核也被认为是影响深远的操作往后大型的网络为了降低参数量都会应用上1×1卷积核。
## 5.13 卷积操作时必须同时考虑通道和区域吗?
![image](./img/ch5/img27.png)
标准的卷积过程可以看上图一个2×2的卷积核在卷积时对应图像区域中的所有通道均被同时考虑问题在于为什么一定要同时考虑图像区域和通道我们为什么不能把通道和空间区域分开考虑
![image](./img/ch5/img28.png)
Xception网络就是基于以上的问题发明而来。我们首先对每一个通道进行各自的卷积操作有多少个通道就有多少个过滤器。得到新的通道feature maps之后这时再对这批新的通道feature maps进行标准的1×1跨通道卷积操作。这种操作被称为 “DepthWise convolution” 缩写“DW”。
这种操作是相当有效的在imagenet 1000类分类任务中已经超过了InceptionV3的表现而且也同时减少了大量的参数我们来算一算假设输入通道数为3要求输出通道数为256两种做法
1. 直接接一个3×3×256的卷积核参数量为3×3×3×256 = 6,912
2. DW操作分两步完成参数量为3×3×3 + 3×1×1×256 = 795又把参数量降低到九分之一
因此一个depthwise操作比标准的卷积操作降低不少的参数量同时论文中指出这个模型得到了更好的分类效果。
## 5.14 采用宽卷积的好处有什么?
### 5.14.1 窄卷积和宽卷积
对于窄卷积来说是从第一个点开始做卷积每次窗口滑动固定步幅。比如下图左部分为窄卷积。那么注意到越在边缘的位置被卷积的次数越少。于是有了宽卷积的方法可以看作在卷积之前在边缘用0补充常见有两种情况一个是全补充入下图右部分这样输出大于输入的维度。另一种常用的方法是补充一部0值使得输出和输入的维度一致。这里文中给了一个公式 。这里npadding在全补充里是filter-1在输入输出相等时就要主要奇偶性了注意到卷积核常为奇数。
![image](./img/ch5/img29.png)
### 5.14.2 为什么采用宽卷积?
通过将输入边角的值纳入到滑窗中心进行计算,以便损失更少的信息。
## 5.15 卷积层输出的深度与哪个部件的个数相同?
输出深度(通道)与卷积核(过滤器)的个数相等。
## 5.16 如何得到卷积层输出的深度?
参数共享在卷积层中使用参数共享是用来控制参数的数量。假设在第一个卷积层就有55x55x96=290,400个神经元每个有11x11x3=364个参数和1个偏差。将这些合起来就是290400x364=105,705,600个参数。单单第一层就有这么多参数显然这个数目是非常大的。
作一个合理的假设:如果一个特征在计算某个空间位置(x,y)的时候有用,那么它在计算另一个不同位置(x2,y2)的时候也有用。基于这个假设可以显著地减少参数数量。换言之就是将深度维度上一个单独的2维切片看做深度切片depth slice比如一个数据体尺寸为[55x55x96]的就有96个深度切片每个尺寸为[55x55]。在每个深度切片上的神经元都使用同样的权重和偏差。在这样的参数共享下例子中的第一个卷积层就只有96个不同的权重集了一个权重集对应一个深度切片共有96x11x11x3=34,848个不同的权重或34,944个参数+96个偏差
```w_conv1=weight_variable([5,5,1,32])```
可以看出上面的32表示的是卷积层输出的深度因为大家都明白width和height都可以通过公式计算得到但是很多文献都没有告诉深度是如何得到的下面是我的认识
1. 因为这个深度是没有公式可以计算出来的因为深度是一个经验值如上面代码的32 其实是一个经验值是通过调整参数发现32是一个最合适的值可以得到最好的准确率但是不同的图像的深度是不一样的。
2. 这个深度表示用了多少个卷积核,下面这个图可以说明一下:
![image](./img/ch5/img30.png)
上图就可以很有效的说明 :卷积层输出的深度==卷积核的个数。
## 5.17 激活函数通常放在卷积神经网络的哪个操作之后?
通常放在卷积层之后。
## 5.18 如何理解最大池化层有几分缩小?
池化层:对输入的特征图进行压缩,一方面使特征图变小,简化网络计算复杂度;一方面进行特征压缩,提取主要特征。
池化操作一般有两种一种是Avy Pooling,一种是max Pooling。
![image](./img/ch5/img31.png)
同样地采用一个2*2的filter,max pooling是在每一个区域中寻找最大值这里的stride=2,最终在原特征图中提取主要特征得到右图。
>注1Avy pooling现在不怎么用了方法是对每一个2*2的区域元素求和再除以4得到主要特征而一般的filter取2*2,最大取3*3,stride取2压缩为原来的1/4.
>注2这里的pooling操作是特征图缩小有可能影响网络的准确度因此可以通过增加特征图的深度来弥补。
## 5.19 理解图像卷积与反卷积
### 5.19.1 图像卷积
首先给出一个输入输出结果
![image](./img/ch5/img32.png)
那他是怎样计算的呢?
卷积的时候需要对卷积核进行180的旋转同时卷积核中心与需计算的图像像素对齐输出结构为中心对齐像素的一个新的像素值计算例子如下
![image](./img/ch5/img33.png)
这样计算出左上角(即第一行第一列)像素的卷积后像素值。
给出一个更直观的例子从左到右看原像素经过卷积由1变成-8。
![image](./img/ch5/img34.png)
通过滑动卷积核,就可以得到整张图片的卷积结果
![image](./img/ch5/img35.png)
### 5.19.2 图像反卷积
这里提到的反卷积跟1维信号处理的反卷积计算是很不一样的FCN作者称为backwards convolution有人称Deconvolution layer is a very unfortunate name and should rather be called a transposed convolutional layer. 我们可以知道在CNN中有con layer与pool layercon layer进行对图像卷积提取特征pool layer 对图像缩小一半筛选重要特征对于经典的图像识别CNN网络如IMAGENET最后输出结果是1X1X10001000是类别种类1x1得到的是。FCN作者或者后来对end to end研究的人员就是对最终1x1的结果使用反卷积事实上FCN作者最后的输出不是1X1是图片大小的32分之一但不影响反卷积的使用
这里图像的反卷积与full卷积原理是一样的使用了这一种反卷积手段使得图像可以变大FCN作者使用的方法是这里所说反卷积的一种变体这样就可以获得相应的像素值图像可以实现end to end。
![image](./img/ch5/img36.png)
![image](./img/ch5/img37.png)
![image](./img/ch5/img38.png)
这里说另外一种反卷积做法假设原图是3*3首先使用上采样让图像变成7*7可以看到图像多了很多空白的像素点。使用一个3*3的卷积核对图像进行滑动步长为1的valid卷积得到一个5*5的图像我们知道的是使用上采样扩大图片使用反卷积填充图像内容使得图像内容变得丰富这也是CNN输出end to end结果的一种方法。韩国作者Hyeonwoo Noh使用VGG16层CNN网络后面加上对称的16层反卷积与上采样网络实现end to end 输出,其不同层上采样与反卷积变化效果如下:
![image](./img/ch5/img39.png)
经过上面的解释与推导对卷积有基本的了解但是在图像上的deconvolution究竟是怎么一回事可能还是不能够很好的理解因此这里再对这个过程解释一下。 目前使用得最多的deconvolution有2种上文都已经介绍。
* 方法1full卷积 完整的卷积可以使得原来的定义域变大。
* 方法2记录pooling index然后扩大空间再用卷积填充。
图像的deconvolution过程如下
![image](./img/ch5/img40.png)
输入2x2 卷积核4x4 滑动步长3 输出7x7
即输入为2x2的图片经过4x4的卷积核进行步长为3的反卷积的过程
1. 输入图片每个像素进行一次full卷积根据full卷积大小计算可以知道每个像素的卷积后大小为 1+4-1=4 即4x4大小的特征图输入有4个像素所以4个4x4的特征图
2. 将4个特征图进行步长为3的fusion即相加 例如红色的特征图仍然是在原来输入位置左上角绿色还是在原来的位置右上角步长为3是指每隔3个像素进行fusion重叠部分进行相加即输出的第1行第4列是由红色特阵图的第一行第四列与绿色特征图的第一行第一列相加得到其他如此类推。
可以看出翻卷积的大小是由卷积核大小与滑动步长决定, in是输入大小 k是卷积核大小 s是滑动步长 out是输出大小 得到 out = (in - 1) * s + k 上图过程就是, (2 - 1) * 3 + 4 = 7
## 5.20 不同卷积后图像大小计算?
### 5.20.1 类型划分
2维卷积的计算分为了3类1.full 2.same 3. valid
1、**full**
![image](./img/ch5/img41.png)
蓝色为原图像白色为对应卷积所增加的padding通常全部为0绿色是卷积后图片。图6的卷积的滑动是从卷积核右下角与图片左上角重叠开始进行卷积滑动步长为1卷积核的中心元素对应卷积后图像的像素点。可以看到卷积后的图像是4X4比原图2X2大了我们还记1维卷积大小是n1+n2-1这里原图是2X2卷积核3X3卷积后结果是4X4与一维完全对应起来了。其实这才是完整的卷积计算其他比它小的卷积结果都是省去了部分像素的卷积
2、**same**
![image](./img/ch5/img42.png)
3、**valid**
![image](./img/ch5/img43.png)
### 5.20.2 计算公式
这里我们可以总结出fullsamevalid三种卷积后图像大小的计算公式
1. full: 滑动步长为1图片大小为N1xN1卷积核大小为N2xN2卷积后图像大小N1+N2-1 x N1+N2-1。
2. same: 滑动步长为1图片大小为N1xN1卷积核大小为N2xN2卷积后图像大小N1xN1。
3. valid:滑动步长为S图片大小为N1xN1卷积核大小为N2xN2卷积后图像大小(N1-N2)/S+1 x (N1-N2)/S+1。
## 5.21 步长、填充大小与输入输出关系总结?
在设计深度学习网络的时候,需要计算输入尺寸和输出尺寸,那么就要设计卷积层的的各种参数。这里有一些设计时候的计算公式,方便得到各层的参数。
这里简化下,约定:
![image](./img/ch5/img44.png)
### 5.21.1 没有0填充单位步长
![image](./img/ch5/img45.png)
### 5.21.2 零填充,单位步长
![image](./img/ch5/img46.png)
<1>半填充
![image](./img/ch5/img47.png)
<2>全填充
![image](./img/ch5/img48.png)
参考图如下图所示
![image](./img/ch5/img49.png)
![image](./img/ch5/img50.png)
### 5.21.3 不填充,非单位步长
![image](./img/ch5/img51.png)
### 5.21.4 零填充,非单位步长
![image](./img/ch5/img52.png)
![image](./img/ch5/img53.png)
![image](./img/ch5/img54.png)
![image](./img/ch5/img55.png)
http://blog.csdn.net/u011692048/article/details/77572024
https://arxiv.org/pdf/1603.07285.pdf
## 5.22 理解反卷积和棋盘效应
### 5.22.1 为什么出现棋盘现象?
图像生成网络的上采样部分通常用反卷积网络,不合理的卷积核大小和步长会使反卷积操作产生棋盘效应 (checkerboard artifacts)。
![image](./img/ch5/img56.png)
![image](./img/ch5/img57.png)
重叠图案也在二维中形成。两个轴上的不均匀重叠相乘,产生不同亮度的棋盘状图案。
事实上不均匀重叠往往在二维上更极端因为两个模式相乘所以它的不均匀性是原来的平方。例如在一个维度中一个步长为2大小为3的反卷积的输出是其输入的两倍但在二维中输出是输入的4倍。
现在,生成图像时,神经网络通常使用多层反卷积,从一系列较低分辨率的描述中迭代建立更大的图像。虽然这些堆栈的反卷积可以消除棋盘效应,但它们经常混合,在更多尺度上产生棋盘效应。
直观地看假设生成的图像中包含1只黑猫。黑猫身体部分的像素颜色应平滑过渡或极端地说该部分应全为黑色。实际生成的图像中该部分却有深深浅浅的近黑方块组成很像棋盘的网格即棋盘效应。
https://distill.pub/2016/deconv-checkerboard/
http://blog.csdn.net/shadow_guo/article/details/52862161
### 5.22.2 有哪些方法可以避免棋盘效应?
1第一种方法是用到的反卷积核的大小可被步长整除从而避免重叠效应。与最近成功用于图像超分辨率的技术“子像素卷积”sub-pixel convolution等价。
![image](./img/ch5/img58.png)
2另一种方法是从卷积操作中分离出对卷积后更高分辨率的特征图上采样来计算特征。例如可以先缩放图像最近邻插值或双线性插值再卷积。
![image](./img/ch5/img59.png)
反卷积与不同缩放卷积方法都是线性操作并可用矩阵去解释。对于每个输出窗口反卷积操作的输入唯一缩放卷积会以阻碍高频棋盘效应的方式来隐式地集中权重weight-tying
#### 缩放卷积
缩放卷积为线性操作假设原图像为A经过插值后的图像为A+B用卷积核C对插值缩放后的图像卷积得到最终的图像 ,其中*为卷积操作。则可将缩放卷积分解为原图像卷积和插值增量图像卷积,或卷积的原图像和卷积的插值增量图像。
C为卷积操作的卷积核。此时为上采样理解为反卷积操作中的卷积核。
1最近邻缩放卷积
![image](./img/ch5/img60.png)
发现插值增量图像表示的矩阵为原图像表示的矩阵下移1行。可将原图像矩阵看成环形队列队列最后1行的输出送入队列的第1行
2双线性缩放卷积
![image](./img/ch5/img61.png)
发现插值增量图像可细分为原图像表示的矩阵下移1行后乘以1/2与原图像表示的矩阵上移1行后乘以1/2。
## 5.23 CNN主要的计算瓶颈
CNN的训练主要是在卷积层和子采样层的交互上其主要的计算瓶颈是
* 1前向传播过程下采样每个卷积层的maps
* 2反向传播过程上采样高层子采样层的灵敏度map以匹配底层的卷积层输出maps的大小
* 3sigmoid的运用和求导。
举例:
对于第一和第二个问题我们考虑的是如何用Matlab内置的图像处理函数去实现上采样和下采样的操作。对于上采样imresize函数可以搞定但需要很大的开销。一个比较快速的版本是使用Kronecker乘积函数kron。通过一个全一矩阵ones来和我们需要上采样的矩阵进行Kronecker乘积就可以实现上采样的效果。对于前向传播过程中的下采样imresize并没有提供在缩小图像的过程中还计算nxn块内像素的和的功能所以没法用。一个比较好和快速的方法是用一个全一的卷积核来卷积图像然后简单的通过标准的索引方法来采样最后卷积结果。例如如果下采样的域是2x2的那么我们可以用2x2的元素全是1的卷积核来卷积图像。然后再卷积后的图像中我们每个2个点采集一次数据y=x(1:2:end,1:2:end),这样就可以得到了两倍下采样,同时执行求和的效果。
对于第三个问题实际上有些人以为Matlab中对sigmoid函数进行inline的定义会更快其实不然Matlab与C/C++等等语言不一样Matlab的inline反而比普通的函数定义更费时间。所以我们可以直接在代码中使用计算sigmoid函数及其导数的真实代码。
## 5.24 CNN的参数经验设置
对于卷积神经网络的参数设置,没有很明确的方法,这只是众多学者的一些经验。
1、learning-rate 学习速率学习速率越小模型收敛花费的时间就越长但是可以提高模型精确度。一般初始设置为0.1然后每次除以0.2或者0.5来改进,得到最终值;
2、batch-size 样本批次容量:影响模型的优化程度和收敛速度,需要参考你的数据集大小来设置,具体问题具体分析;
3、weight-decay 权重衰减用来在反向传播中更新权重和偏置一般设置为0.005
4、epoch-number 训练次数包括所有训练样本的一个正向传递和一个反向传递训练至模型收敛即可和迭代周期iteration不一样
而且,也不是说训练的次数越多,测试精度就会越高,可能会因为预训练的模型太复杂,而我的数据集样本数量太少,种类太单一,而出现过拟合。
## 5.25 提高泛化能力的方法总结
http://blog.csdn.net/u010900574/article/details/51992156
### 5.25.1 主要方法
一般来说,提高泛化能力的方法主要有以下几个:
> * 正则化
> * 增加神经网络层数
> * 使用正确的代价函数
> * 使用好的权重初始化技术
> * 人为拓展训练集
> * 弃权技术
### 5.25.2 主要方法
下面我们通过实验结果给这些参数优化理论一个直观的结果
1普通的全连接神经网络的效果
我们使用一个隐藏层包含100个隐藏神经元输入层是784输出层是one-hot编码的形式最后一层是Softmax层。训练过程采用对数似然代价函数60次迭代学习速率η=0.1随机梯度下降的小批量数据大小为10没有正则化。在测试集上得到的结果是97.8%,代码如下:
```python
>>> import network3
>>> from network3 import Network
>>> from network3 import ConvPoolLayer, FullyConnectedLayer, SoftmaxLayer
>>> training_data, validation_data, test_data = network3.load_data_shared()
>>> mini_batch_size = 10
>>> net = Network([FullyConnectedLayer(n_in=784, n_out=100),
SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size)
>>> net.SGD(training_data, 60, mini_batch_size, 0.1, validation_data, test_data)
```
2使用卷积神经网络 — 仅一个卷积层
输入层是卷积层5*5的局部感受野也就是一个5*5的卷积核一共20个特征映射。最大池化层选用2*2的大小。后面是100个隐藏神经元的全连接层。结构如图所示
![image](./img/ch5/img62.png)
在这个架构中我们把卷积层和chihua层看做是学习输入训练图像中的局部感受野而后的全连接层则是一个更抽象层次的学习从整个图像整合全局信息。也是60次迭代批量数据大小是10学习率是0.1.代码如下。
```python
>>> net = Network([
ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28),
filter_shape=(20, 1, 5, 5),
poolsize=(2, 2)),
FullyConnectedLayer(n_in=20*12*12, n_out=100),
SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size)
>>> net.SGD(training_data, 60, mini_batch_size, 0.1,
validation_data, test_data)
```
经过三次运行取平均后准确率是98.78%这是相当大的改善。错误率降低了1/3。卷积神经网络开始显现威力。
3使用卷积神经网络 — 两个卷积层
我们接着插入第二个卷积-混合层,把它插入在之前的卷积-混合层和全连接层之间同样的5*5的局部感受野2*2的池化层。
```python
>>> net = Network([
ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28),
filter_shape=(20, 1, 5, 5),
poolsize=(2, 2)),
ConvPoolLayer(image_shape=(mini_batch_size, 20, 12, 12),
filter_shape=(40, 20, 5, 5),
poolsize=(2, 2)),
FullyConnectedLayer(n_in=40*4*4, n_out=100),
SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size)
>>> net.SGD(training_data, 60, mini_batch_size, 0.1, validation_data, test_data)
```
这一次我们拥有了99.06%的准确率。
4使用卷积神经网络 — 两个卷积层+线性修正单元(ReLU)+正则化
上面我们使用的Sigmod激活函数现在我们换成线性修正激活函数ReLU f(z)=max(0,z)f(z)=max(0,z),我们选择60个迭代期学习速率η=0.03,η=0.03, 使用L2正则化正则化参数λ=0.1λ=0.1,代码如下:
```python
>>> from network3 import ReLU
>>> net = Network([
ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28),
filter_shape=(20, 1, 5, 5),
poolsize=(2, 2),
activation_fn=ReLU),
ConvPoolLayer(image_shape=(mini_batch_size, 20, 12, 12),
filter_shape=(40, 20, 5, 5),
poolsize=(2, 2),
activation_fn=ReLU),
FullyConnectedLayer(n_in=40*4*4, n_out=100, activation_fn=ReLU),
SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size)
>>> net.SGD(training_data, 60, mini_batch_size, 0.03,
validation_data, test_data, lmbda=0.1)
```
这一次我们获得了99.23%的准确率超过了S型激活函数的99.06%. ReLU的优势是max(0,z)max(0,z)中z取最大极限时不会饱和不像是S函数这有助于持续学习。
5使用卷积神经网络,即两个卷基层+线性修正单元(ReLU)+正则化+拓展数据集
拓展训练集数据的一个简单方法是将每个训练图像由一个像素来代替无论是上一个像素下一个像素或者左右的像素。其他的方法也有改变亮度改变分辨率图片旋转扭曲位移等。我们把50,000幅图像人为拓展到250,000幅图像。使用第4节一样的网络因为我们是在训练5倍的数据所以减少了过拟合的风险。
```python
>>> expanded_training_data, _, _ = network3.load_data_shared(
"../data/mnist_expanded.pkl.gz")
>>> net = Network([
ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28),
filter_shape=(20, 1, 5, 5),
poolsize=(2, 2),
activation_fn=ReLU),
ConvPoolLayer(image_shape=(mini_batch_size, 20, 12, 12),
filter_shape=(40, 20, 5, 5),
poolsize=(2, 2),
activation_fn=ReLU),
FullyConnectedLayer(n_in=40*4*4, n_out=100, activation_fn=ReLU),
SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size)
>>> net.SGD(expanded_training_data, 60, mini_batch_size, 0.03,
validation_data, test_data, lmbda=0.1)
```
这次的到了99.37的训练正确率。
6使用卷积神经网络 — 两个卷基层+线性修正单元(ReLU)+正则化+拓展数据集+继续插入额外的全连接层
继续上面的网络我们拓展全连接层的规模300个隐藏神经元和1000个神经元的额精度分别是99.46%和99.43%. 我们插入一个额外的全连接层
```python
>>> net = Network([
ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28),
filter_shape=(20, 1, 5, 5),
poolsize=(2, 2),
activation_fn=ReLU),
ConvPoolLayer(image_shape=(mini_batch_size, 20, 12, 12),
filter_shape=(40, 20, 5, 5),
poolsize=(2, 2),
activation_fn=ReLU),
FullyConnectedLayer(n_in=40*4*4, n_out=100, activation_fn=ReLU),
FullyConnectedLayer(n_in=100, n_out=100, activation_fn=ReLU),
SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size)
>>> net.SGD(expanded_training_data, 60, mini_batch_size, 0.03,
validation_data, test_data, lmbda=0.1)
```
这次取得了99.43%的精度。拓展后的网络并没有帮助太多。
7使用卷积神经网络 — 两个卷基层+线性修正单元(ReLU)+拓展数据集+继续插入额外的全连接层+弃权技术
弃权的基本思想就是在训练网络时随机地移除单独的激活值,使得模型对单独的依据丢失更为强劲,因此不太依赖于训练数据的特质。我们尝试应用弃权技术到最终的全连接层(不是在卷积层)。这里减少了迭代期的数量为40个全连接层使用1000个隐藏神经元因为弃权技术会丢弃一些神经元。Dropout是一种非常有效有提高泛化能力降低过拟合的方法
```python
>>> net = Network([
ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28),
filter_shape=(20, 1, 5, 5),
poolsize=(2, 2),
activation_fn=ReLU),
ConvPoolLayer(image_shape=(mini_batch_size, 20, 12, 12),
filter_shape=(40, 20, 5, 5),
poolsize=(2, 2),
activation_fn=ReLU),
FullyConnectedLayer(
n_in=40*4*4, n_out=1000, activation_fn=ReLU, p_dropout=0.5),
FullyConnectedLayer(
n_in=1000, n_out=1000, activation_fn=ReLU, p_dropout=0.5),
SoftmaxLayer(n_in=1000, n_out=10, p_dropout=0.5)],
mini_batch_size)
>>> net.SGD(expanded_training_data, 40, mini_batch_size, 0.03,
validation_data, test_data)
```
使用弃权技术得到了99.60%的准确率。
8使用卷积神经网络 — 两个卷基层+线性修正单元(ReLU)+正则化+拓展数据集+继续插入额外的全连接层+弃权技术+组合网络
组合网络类似于随机森林或者adaboost的集成方法创建几个神经网络让他们投票来决定最好的分类。我们训练了5个不同的神经网络每个都大到了99.60%的准去率用这5个网络来进行投票表决一个图像的分类。
采用这个方法达到了99.67%的准确率。
## 5.26 CNN在CV与NLP领域运用的联系与区别
### 5.26.1 联系
自然语言处理是对一维信号(词序列)做操作。
计算机视觉是对二维(图像)或三维(视频流)信号做操作。
### 5.26.2 区别
自然语言处理的输入数据通常是离散取值例如表示一个单词或字母通常表示为词典中的one hot向量计算机视觉则是连续取值比如归一化到01之间的灰度值。CNN有两个主要特点区域不变性(location invariance)和组合性(Compositionality)。
1. 区域不变性:滤波器在每层的输入向量(图像)上滑动检测的是局部信息然后通过pooling取最大值或均值。pooling这步综合了局部特征失去了每个特征的位置信息。这很适合基于图像的任务比如要判断一幅图里有没有猫这种生物你可能不会去关心这只猫出现在图像的哪个区域。但是在NLP里词语在句子或是段落里出现的位置顺序都是很重要的信息。
2. 局部组合性CNN中每个滤波器都把较低层的局部特征组合生成较高层的更全局化的特征。这在CV里很好理解像素组合成边缘边缘生成形状最后把各种形状组合起来得到复杂的物体表达。在语言里当然也有类似的组合关系但是远不如图像来的直接。而且在图像里相邻像素必须是相关的相邻的词语却未必相关。
## 5.27 CNN凸显共性的手段
### 5.27.1 局部连接
感受视野每个神经元仅与输入神经元的一块区域连接这块局部区域称作感受野receptive field
在图像卷积操作中,即神经元在空间维度是局部连接,但在深度上是全部连接。对于二维图像本身而言,也是局部像素关联较强。这种局部连接保证了学习后的过滤器能够对于局部的输入特征有最强的响应。局部连接的思想,也是受启发于生物学里面的视觉系统结构,视觉皮层的神经元就是局部接受信息的。
局部连接使网络可以提取数据的局部特征;
下图是一个很经典的图示,左边是全连接,右边是局部连接。
![image](./img/ch5/img63.png)
对于一个1000 × 1000的输入图像而言如果下一个隐藏层的神经元数目为10^6个采用全连接则有1000 × 1000 × 10^6 = 10^12个权值参数如此数目巨大的参数几乎难以训练而采用局部连接隐藏层的每个神经元仅与图像中10 × 10的局部图像相连接那么此时的权值参数数量为10 × 10 × 10^6 = 10^8将直接减少4个数量级。
### 5.27.2 权值共享
权重共享计算同一个深度切片的神经元时采用的滤波器是共享的。例如图4中计算o[:,:,0]的每个每个神经元的滤波器均相同都为W0这样可以很大程度上减少参数。共享权重在一定程度上讲是有意义的例如图片的底层边缘特征与特征在图中的具体位置无关。但是在一些场景中是无意的比如输入的图片是人脸眼睛和头发位于不同的位置希望在不同的位置学到不同的特征 (参考斯坦福大学公开课)。请注意权重只是对于同一深度切片的神经元是共享的,在卷积层,通常采用多组卷积核提取不同特征,即对应不同深度切片的特征,不同深度切片的神经元权重是不共享。另外,偏重对同一深度切片的所有神经元都是共享的。
权值共享大大降低了网络的训练难度一个Filter只提取一个特征在整个图片或者语音文本 中进行卷积
尽管减少了几个数量级但参数数量依然较多。能不能再进一步减少呢方法就是权值共享。具体做法是在局部连接中隐藏层的每一个神经元连接的是一个10 × 10的局部图像因此有10 × 10个权值参数将这10 × 10个权值参数共享给剩下的神经元也就是说隐藏层中10^6个神经元的权值参数相同那么此时不管隐藏层神经元的数目是多少需要训练的参数就是这 10 × 10个权值参数也就是卷积核(也称滤波器)的大小),如下图。
![image](./img/ch5/img64.png)
这大概就是CNN的一个神奇之处尽管只有这么少的参数依旧有出色的性能。但是这样仅提取了图像的一种特征如果要多提取出一些特征可以增加多个卷积核不同的卷积核能够得到图像的不同映射下的特征称之为Feature Map。如果有100个卷积核最终的权值参数也仅为100 × 100 = 10^4个而已。另外偏置参数也是共享的同一种滤波器共享一个。
### 5.27.3 池化操作
池化操作与多层次结构一起,实现了数据的降维,将低层次的局部特征组合成为较高层次的特征,从而对整个图片进行表示。如下图:
![image](./img/ch5/img65.png)
### 5.28 全卷积与Local-Conv的异同点
如果每一个点的处理使用相同的Filter则为全卷积如果使用不同的Filter则为Local-Conv。
### 5.29 举例理解Local-Conv的作用
这个问题主要针对为什么很多做人脸的Paper会最后加入一个Local Connected Conv总体上说这一步的作用就是使用3D模型来将人脸对齐从而使CNN发挥最大的效果。
![image](./img/ch5/img66.png)
经过3D对齐以后形成的图像都是152×152的图像输入到上述网络结构中该结构的参数如下
* Conv32个11×11×3的卷积核max-pooling: 3×3 stride=2Conv: 16个9×9的卷积核。
* Local-Conv: 16个9×9的卷积核Local的意思是卷积核的参数不共享。
* Local-Conv: 16个7×7的卷积核参数不共享Local-Conv: 16个5×5的卷积核参数不共享
* Fully-connected: 4096维Softmax: 4030维。
前三层的目的在于提取低层次的特征比如简单的边和纹理。其中Max-pooling层使得卷积的输出对微小的偏移情况更加鲁棒。但没有用太多的Max-pooling层因为太多的Max-pooling层会使得网络损失图像信息。
后面三层都是使用参数不共享的卷积核,之所以使用参数不共享,有如下原因:
1对齐的人脸图片中不同的区域会有不同的统计特征卷积的局部稳定性假设并不存在所以使用相同的卷积核会导致信息的丢失
2不共享的卷积核并不增加抽取特征时的计算量而会增加训练时的计算量
3使用不共享的卷积核需要训练的参数量大大增加因而需要很大的数据量然而这个条件本文刚好满足。
全连接层将上一层的每个单元和本层的所有单元相连用来捕捉人脸图像不同位置的特征之间的相关性。其中第7层4096-d被用来表示人脸。
全连接层的输出可以用于Softmax的输入Softmax层用于分类。
## 5.30 简述卷积神经网络进化史
主要讨论CNN的发展并且引用刘昕博士的思路对CNN的发展作一个更加详细的介绍将按下图的CNN发展史进行描述
![image](./img/ch5/img67
1. 列表项
http://mp.weixin.qq.com/s?__biz=MzI1NTE4NTUwOQ==&mid=2650324619&idx=1&sn=ca1aed9e42d8f020d0971e62148e13be&scene=1&srcid=0503De6zpYN01gagUvn0Ht8D#wechat_redirect
CNN的演化路径可以总结为以下几个方向
> * 进化之路一:网络结构加深
> * 进化之路二:加强卷积功能
> * 进化之路三:从分类到检测
> * 进化之路四:新增功能模块