Update 第五章 卷积神经网络(CNN)(修改版).md

This commit is contained in:
TroyChang 2018-11-13 17:40:39 +08:00 committed by GitHub
parent 581e5a8332
commit 106bf2de74
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 38 additions and 4 deletions

View File

@ -2,7 +2,9 @@
标签(空格分隔): 原创性 深度学习 协作
卷积神经网络负责人:
重庆大学研究生-刘畅 787913208@qq.com
铪星创新科技联合创始人-杨文英;
# 第五章 卷积神经网络CNN
@ -97,7 +99,9 @@
### 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卷积
@ -106,9 +110,11 @@ http://www.sohu.com/a/159591827_390227
## 5.6 2D卷积与3D卷积有什么区别重庆大学研究生-刘畅)
### 5.6.1 2D卷积
二维卷积操作如图所示为了更直观的说明分别展示了单通道和多通道的操作。假定只使用了1个滤波器即输出图像只有一个channel。其中针对单通道输入图像的channel为1卷积核尺寸为 (k_h, k_w, 1),卷积核在输入图像的空间维度上进行滑窗操作,每次滑窗和 (k_h, k_w)窗口内的值进行卷积操作得到输出图像中的一个值。针对多通道假定输入图像的channel为3卷积核尺寸则为 (k_h, k_w, 3)则每次滑窗与3个channels上的 (k_h, k_w)窗口内的所有值进行卷积操作,得到输出图像中的一个值。
![image](./img/ch5/img12.png)
### 5.6.2 3D卷积
3D卷积操作如图所示同样分为单通道和多通道且假定只使用1个滤波器即输出图像仅有一个channel。其中针对单通道与2D卷积不同之处在于输入图像多了一个length维度卷积核也多了一个k_l维度因此3D卷积核的尺寸为k_h, k_w, k_l),每次滑窗与 (k_h, k_w, k_l)窗口内的值进行相关操作得到输出3D图像中的一个值.针对多通道则与2D卷积的操作一样每次滑窗与3个channels上的 (k_h, k_w, k_l) 窗口内的所有值进行相关操作得到输出3D图像中的一个值。
![image](./img/ch5/img13.png)
## 5.7 有哪些池化方法?(重庆大学研究生-刘畅)
@ -116,37 +122,48 @@ http://www.sohu.com/a/159591827_390227
### 5.7.1 一般池化General Pooling
池化操作与卷积操作不同,过程如下图。
![image](./img/ch5/img14.png)
池化操作过程如图所示对固定区域的特征使用某一个值来表示。最常见的池化操作有两种分为平均池化mean pooling和最大池化max pooling
1、平均池化计算图像区域的平均值作为该区域池化后的值。
2、最大池化选图像区域的最大值作为该区域池化后的值。
上述的池化过程,相邻的池化窗口间没有重叠部分。
### 5.7.2 重叠池化General Pooling
重叠池化即是一种相邻池化窗口之间会有重叠区域的池化技术。论文中[2]中作者使用了重叠池化其他的设置都不变的情况下top-1和top-5 的错误率分别减少了0.4% 和0.3%。
### 5.7.3 空金字塔池化Spatial Pyramid Pooling
空间金字塔池化可以将任意尺度的图像卷积特征转化为相同维度这不仅可以让CNN处理任意尺度的图像还能避免cropping和warping操作导致一些信息的丢失。一般的卷积神经网络都需要固定输入图像大小这是因为全连接层的输入需要固定输入维度但在卷积操作时并没有对图像大小有限制所以作者提出了空间金字塔池化方法先让图像进行卷积操作然后使用SPP方法转化成维度相同的特征最后输入到全连接层。
![image](./img/ch5/img17.png)
根据论文作者所述空间金字塔池化的思想来自于Spatial Pyramid Model,它是将一个pooling过程变成了多个尺度的pooling。用不同大小的池化窗口作用于卷积特征这样就可以得到1X1,2X2,4X4的池化结果由于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为例spp算法的各层参数。
![image](./img/ch5/img19.png)
总结来说SPP方法其实就是一种使用多个尺度的池化方法可以获取图像中的多尺度信息。在卷积神经网络中加入SPP后可以让CNN处理任意大小的输入这让模型变得更加的灵活。
## 5.8 1x1卷积作用重庆大学研究生-刘畅)
1×1的卷积主要有以下两个方面的作用
1. 实现信息的跨通道交互和整合。
2. 对卷积核通道数进行降维和升维,减小参数量。
下面详细解释一下:
**第一点 实现信息的跨通道交互和整合**
对1×1卷积层的探讨最初是出现在NIN的结构论文作者的动机是利用MLP代替传统的线性卷积核从而提高网络的表达能力。文中从跨通道池化的角度进行解释认为文中提出的MLP其实等价于在传统卷积核后面接cccp层从而实现多个feature map的线性组合实现跨通道的信息整合。而查看代码实现cccp层即等价于1×1卷积层。
**第二点 对卷积核通道数进行降维和升维,减小参数量**
1x1卷积层能带来降维和升维的效果在一系列的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的十二分之一当然其中也有丢掉全连接层的原因。
1x1卷积层能带来降维和升维的效果在一系列的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)
而非常经典的ResNet结构同样也使用了1×1卷积并且是在3×3卷积层的前后都使用了不仅进行了降维还进行了升维使得卷积层的输入和输出的通道数都减小参数数量进一步减少如下图结构所示。
![image](./img/ch5/img21.png)
## 5.9 卷积层和池化层有什么区别?
@ -179,7 +196,6 @@ http://www.sohu.com/a/159591827_390227
总而言之,我们多倾向于选择多个相对小的卷积核来进行卷积。
## 5.11 每层卷积是否只能用一种尺寸的卷积核?
经典的神经网络都属于层叠式网络并且每层仅用一个尺寸的卷积核例如VGG结构中使用了大量的3×3卷积层。事实上同一层feature map可以分别使用多个不同尺寸的卷积核以获得不同尺度的特征再把这些特征结合起来得到的特征往往比使用单一卷积核的要好例如GoogLeNet、Inception系列的网络均是每层使用了多个卷积核结构。如下图所示输入的feature map在同一层分别经过1×1、3×3、5×5三种不同尺寸的卷积核再将分别得到的特征进行组合。
![image](./img/ch5/img24.png)
@ -450,9 +466,13 @@ CNN的训练主要是在卷积层和子采样层的交互上其主要的计
## 5.24 卷积神经网络的经验参数设置(重庆大学研究生-刘畅)
对于卷积神经网络的参数设置,没有很明确的指导原则,以下仅是一些经验集合。
1、learning-rate 学习率学习率越小模型收敛花费的时间就越长但是可以逐步稳健的提高模型精确度。一般初始设置为0.1然后每次除以0.2或者0.5来改进,得到最终值;
2、batch-size 样本批次容量影响模型的优化程度和收敛速度需要参考你的数据集大小来设置具体问题具体分析一般使用32或64在计算资源允许的情况下可以使用大batch进行训练。有论文提出大batch可以加速训练速度并取得更鲁棒的结果
3、weight-decay 权重衰减用来在反向传播中更新权重和偏置一般设置为0.005或0.001
4、epoch-number 训练次数包括所有训练样本的一个正向传递和一个反向传递训练至模型收敛即可和迭代次数iteration不一样
总之,不是训练的次数越多,测试精度就会越高。会有各种原因导致过拟合,比如一种可能是预训练的模型太复杂,而使用的数据集样本数量太少,种类太单一。
@ -617,14 +637,18 @@ dropout的基本思想就是在训练网络时随机的移除单独的激活值
我们首先了解一个概念,感受野,即每个神经元仅与输入神经元相连接的一块区域。
在图像卷积操作中,神经元在空间维度上是局部连接,但在深度上是全连接。局部连接的思想,是受启发于生物学里的视觉系统结构,视觉皮层的神经元就是仅用局部接受信息。对于二维图像,局部像素关联性较强。这种局部连接保证了训练后的滤波器能够对局部特征有最强的响应,使神经网络可以提取数据的局部特征;
下图是一个很经典的图示,左边是全连接,右边是局部连接。
![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 权值共享
权值共享,即计算同一深度的神经元时采用的卷积核参数是共享的。权值共享在一定程度上讲是有意义的,是由于在神经网络中,提取的底层边缘特征与其在图中的位置无关。但是在另一些场景中是无意的,如在人脸识别任务,我们期望在不同的位置学到不同的特征。
需要注意的是,权重只是对于同一深度切片的神经元是共享的。在卷积层中,通常采用多组卷积核提取不同的特征,即对应的是不同深度切片的特征,而不同深度切片的神经元权重是不共享。相反,偏置这一权值对于同一深度切片的所有神经元都是共享的。
权值共享带来的好处是大大降低了网络的训练难度。如下图假设在局部连接中隐藏层的每一个神经元连接的是一个10 × 10的局部图像因此有10 × 10个权值参数将这10 × 10个权值参数共享给剩下的神经元也就是说隐藏层中10^6个神经元的权值参数相同那么此时不管隐藏层神经元的数目是多少需要训练的参数就是这 10 × 10个权值参数也就是卷积核的大小
![image](./img/ch5/img64.png)
这里就体现了卷积神经网络的奇妙之处使用少量的参数却依然能有非常出色的性能。上述仅仅是提取图像一种特征的过程。如果要多提取出一些特征可以增加多个卷积核不同的卷积核能够得到图像不同尺度下的特征称之为特征图feature map
### 5.27.3 池化操作
@ -640,15 +664,25 @@ dropout的基本思想就是在训练网络时随机的移除单独的激活值
## 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×3stride=2
Conv: 16个9×9的卷积核
Local-Conv: 16个9×9的卷积核
Local-Conv: 16个7×7的卷积核
Local-Conv: 16个5×5的卷积核
Fully-connected: 4096维
Softmax: 4030维。
前三层的目的在于提取低层次的特征比如简单的边和纹理。其中Max-pooling层使得卷积的输出对微小的偏移情况更加鲁棒。但不能使用更多的Max-pooling层因为太多的Max-pooling层会使得网络损失图像信息。全连接层将上一层的每个单元和本层的所有单元相连用来捕捉人脸图像不同位置特征之间的相关性。最后使用softmax层用于人脸分类。
中间三层都是使用参数不共享的卷积核,之所以使用参数不共享,有如下原因: