卷积层
- 深度/depth(解释见下图)
- 步长/stride (窗口一次滑动的长度)
- 填充值/zero-padding
参数共享机制
在卷积层中每个神经元连接数据窗的权重是固定的,每个神经元只关注一个特性。神经元就是图像处理中的滤波器,比如边缘检测专用的Sobel滤波器,即卷积层的每个滤波器都会有自己所关注一个图像特征,比如垂直边缘,水平边缘,颜色,纹理等等,这些所有神经元加起来就好比就是整张图像的特征提取器集合。
池化层
池化层夹在连续的卷积层中间, 用于压缩数据和参数的量,减小过拟合。
简而言之,如果输入是图像的话,那么池化层的最主要作用就是压缩图像。
这里再展开叙述池化层的具体作用。
1. 特征不变性,也就是我们在图像处理中经常提到的特征的尺度不变性,池化操作就是图像的resize,平时一张狗的图像被缩小了一倍我们还能认出这是一张狗的照片,这说明这张图像中仍保留着狗最重要的特征,我们一看就能判断图像中画的是一只狗,图像压缩时去掉的信息只是一些无关紧要的信息,而留下的信息则是具有尺度不变性的特征,是最能表达图像的特征。
2. 特征降维,我们知道一幅图像含有的信息是很大的,特征也很多,但是有些信息对于我们做图像任务时没有太多用途或者有重复,我们可以把这类冗余信息去除,把最重要的特征抽取出来,这也是池化操作的一大作用。
3. 在一定程度上防止过拟合,更方便优化。
归一化层:
1. Batch Normalization
Batch Normalization(批量归一化)实现了在神经网络层的中间进行预处理的操作,即在上一层的输入归一化处理后再进入网络的下一层,这样可有效地防止“梯度弥散”,加速网络训练。
Batch Normalization具体的算法如下图所示:
每次训练时,取 batch_size 大小的样本进行训练,在BN层中,将一个神经元看作一个特征,batch_size 个样本在某个特征维度会有 batch_size 个值,然后在每个神经元 xixi 维度上的进行这些样本的均值和方差,通过公式得到 xi∧xi∧,再通过参数 γγ 和 ββ 进行线性映射得到每个神经元对应的输出 yiyi 。在BN层中,可以看出每一个神经元维度上,都会有一个参数 γγ 和 ββ ,它们同权重ww一样可以通过训练进行优化。
在卷积神经网络中进行批量归一化时,一般对 未进行ReLu激活的 feature map进行批量归一化,输出后再作为激励层的输入,可达到调整激励函数偏导的作用。
一种做法是将 feature map 中的神经元作为特征维度,参数 γγ 和 ββ 的数量和则等于 2×fmapwidth×fmaplength×fmapnum2×fmapwidth×fmaplength×fmapnum,这样做的话参数的数量会变得很多;
另一种做法是把 一个 feature map 看做一个特征维度,一个 feature map 上的神经元共享这个 feature map的 参数 γγ 和 ββ ,参数 γγ 和 ββ 的数量和则等于 2×fmapnum2×fmapnum,计算均值和方差则在batch_size个训练样本在每一个feature map维度上的均值和方差。
注:fmapnumfmapnum指的是一个样本的feature map数量,feature map 跟神经元一样也有一定的排列顺序。
Batch Normalization 算法的训练过程和测试过程的区别:
在训练过程中,我们每次都会将 batch_size 数目大小的训练样本 放入到CNN网络中进行训练,在BN层中自然可以得到计算输出所需要的 均值 和 方差 ;
而在测试过程中,我们往往只会向CNN网络中输入一个测试样本,这是在BN层计算的均值和方差会均为 0,因为只有一个样本输入,因此BN层的输入也会出现很大的问题,从而导致CNN网络输出的错误。所以在测试过程中,我们需要借助训练集中所有样本在BN层归一化时每个维度上的均值和方差,当然为了计算方便,我们可以在 batch_num 次训练过程中,将每一次在BN层归一化时每个维度上的均值和方差进行相加,最后再进行求一次均值即可。
2. Local Response Normalization
近邻归一化(Local Response Normalization)的归一化方法主要发生在不同的相邻的卷积核(经过ReLu之后)的输出之间,即输入是发生在不同的经过ReLu之后的 feature map 中。
LRN的公式如下:
b(i,x,y)=a(i,x,y)(k+α∑min(N−1,i+n/2)j=max(0,i−n/2)a(j,x,y)2) βb(i,x,y)=a(i,x,y)(k+α∑j=max(0,i−n/2)min(N−1,i+n/2)a(j,x,y)2) β
其中:
a(i,x,y)a(i,x,y) 表示第ii个卷积核的输出(经过ReLu层)的feature map上的 (x,y)(x,y) 位置上的值。
b(i,x,y)b(i,x,y) 表示 a(i,x,y)a(i,x,y) 经LRN后的输出。
NN 表示卷积核的数量,即输入的 feature map的个数。
nn 表示近邻的卷积核(或feature map)个数,由自己来决定。
k,α,βk,α,β是超参数,由用户自己调整或决定。
与BN的区别:BN依据mini batch的数据,近邻归一仅需要自己来决定,BN训练中有学习参数;BN归一化主要发生在不同的样本之间,LRN归一化主要发生在不同的卷积核的输出之间。
切分层:
在一些应用中,需要对图片进行切割,独立地对某一部分区域进行单独学习。这样可以对特定部分进行通过调整 感受视野 进行力度更大的学习。
融合层:
融合层可以对切分层进行融合,也可以对不同大小的卷积核学习到的特征进行融合。
例如在GoogleLeNet 中,使用多种分辨率的卷积核对目标特征进行学习,通过 padding 使得每一个 feature map 的长宽都一致,之后再将多个 feature map 在深度上拼接在一起:
融合的方法有几种,一种是特征矩阵之间的拼接级联,另一种是在特征矩阵进行运算 (+,−,x,max,conv)(+,−,x,max,conv)。
全连接层
全连接层主要对特征进行重新拟合,减少特征信息的丢失;
卷积神经网络之优缺点
优点
• 共享卷积核,对高维数据处理无压力
• 无需手动选取特征,训练好权重,即得特征分类效果好
缺点
• 需要调参,需要大样本量,训练最好要GPU
• 物理含义不明确(也就说,我们并不知道没个卷积层到底提取到的是什么特征,而且神经网络本身就是一种难以解释的“黑箱模型”)
在学习CNN的时候遇到的一些困惑,以及查阅一些资料后得到的一些答案。
第一个问题:为什么不用BP神经网络去做呢?
1.全连接,权值太多,需要很多样本去训练,计算困难
• 应对之道:减少权值的尝试,局部连接,权值共享
卷积神经网络有两种神器可以降低参数数目。
第一种神器叫做局部感知野,一般认为人对外界的认知是从局部到全局的,而图像的空间联系也是局部的像素联系较为紧密,而距离较远的像素相关性则较弱。因而,每个神经元其实没有必要对全局图像进行感知,只需要对局部进行感知,然后在更高层将局部的信息综合起来就得到了全局的信息。
第二级神器,即权值共享。
2.边缘过渡不平滑
• 应对之道:采样窗口彼此重叠
参考
- 深度学习简介(一)——卷积神经网络
- 详解卷积神经网络(CNN)
- 【CNN】一文读懂卷积神经网络CNN
- 深度学习之卷积神经网络CNN及tensorflow代码实现示例
- 卷积神经网络CNN总结
- Deep Learning论文笔记之(四)CNN卷积神经网络推导和实现