卷积神经网络结构

卷积神经网络是多级神经网络,包含滤波级(filtering stage)与分类级(classification stage),其中,滤波级用来提取输入信号的特征,分类级对学习到的特征进行分类,两级网络参数是共同训练得到的。滤波级包含卷积层(convolutional layers),池化层(pooling layer)与激活层(activation layers)等3个基本单元,而分类级一般由全连接层组成。

卷积层

卷积层使用卷积核(Convolutional Kernels)对输入信号(或特征)的局部区域进行卷积运算,并产生相应的特征。卷积层最重要的特点是权值共享(Weights sharing),即同一个卷积核将以固定的步长(Stride)遍历一次输入。权值共享减少了卷积层的网络参数,避免了由于参数过多造成的过拟合,并且降低了系统所需内存。在实际操作中,大多使用相关运算(Correlation Operation)来替代卷积运算,这样可以避免反向传播时翻转卷积核。具体的卷积层运算如式:




卷积神经网络 隐藏层 卷积神经网络层级结构_卷积神经网络 隐藏层


一维卷积层的运算过程如图。



卷积神经网络 隐藏层 卷积神经网络层级结构_卷积神经网络 隐藏层_02


每个卷积核均遍历一次卷积层,同时进行卷积运算。以第一个卷积核为例,在进行卷积操作时,卷积核与被卷区域的神经元对应的系数相乘,得到第一个logits值y,然后以步长为1移动卷积核,重复之前的操作,直至卷积核遍历完输入信号的所有区域。

激活层

经过卷积操作之后,激活函数将对每一个卷积输出的logits值进行非线性变化。激活函数的目的,是将原本线性不可分的多维特征映射到另一空间,在此空间内,特征的线性可分性将增强。神经网络中常用的激活函数有Sigmoid函数,双曲正切函数Tanh以及修正线性单元ReLU(Rectified Linear Unit)。
当输入值的绝对值较大时,Sigmoid与Tanh函数的导数值均接近0,这会造成利用误差反向传播来更新权值时,随着神经网络层数的增加,误差值无法向下传播,从而底层网络训练不透,这也被称为梯度弥散现象。而ReLU函数在输入值大于0时的导数值始终为1,很好的克服了梯度弥散现象。

池化层

池化层进行的是降采样操作,主要目的是减少神经网络的参数。一维池化操作的示例如图。



卷积神经网络 隐藏层 卷积神经网络层级结构_卷积核_03


图中输入层的特征宽度为6,深度为4,通过大小、步长为2的池化操作,将原始特征降采样到宽度为3,深度为4的输出特征。

常用的池化函数有均值池化(Average Pooling)与最大值池化(Max Pooling)。均值池化是将感知域的神经元的均值作为输出值,而最大值池化是将感知域中的最大值作为输出。

最大值池化的优点在于可以获得位置无关的特征,对于周期性的时域信号很关键。

全连接层

全连接层是将滤波级提取出的特征进行分类。具体做法为,先将最后一个池化层的输出,铺展成一维的特征向量,作为全连接层的输入;再将输入与输出之间进行全连接,如图所示。



卷积神经网络 隐藏层 卷积神经网络层级结构_卷积核_04


其中隐含层使用的激活函数为ReLU,最后输出层采用的激活函数是Softmax函数。Softmax函数的目的是将输入的神经元转化为和为1的概率分布,这样做有利于后续的多分类目标函数的建立。

目标函数

一段输入信号在神经网络的输出应当与它的目标值一致,评价这种一致性的函数叫做神经网络的目标函数(Odjective Function),也称为损失函数(Loss Function)。常用目标函数有平方误差损失函数(Squared Loss Function)以及交叉熵损失函数(Cross-entropy Loss Function)。假设卷积神经网络的实际输出的Softmax值为q,其目标分布p为one-hot类型的向量,即当目标类别为j是,pj=1.否则pj=0。
与平方误差函数比较每一个类别的大小不同,交叉熵函数是衡量两个概率分布的一致性。交叉熵函数在机器学习中常被看做是softmax分布的负对数似然,因此常采用交叉熵函数作为目标函数。

误差反向传播

误差反向传播是对神经网络进行权值优化的关键步骤。主要做法是先求解目标函数关于最后一层神经元的导数,通过链式法则,从后往前逐层计算目标函数关于所有权值的导数值。

1D卷积神经网络设计

batch normal

目的是减少内部协变量转移,提高网络的训练效率,增强网络的泛化能力。其主要操作步骤是将输入先减去所在mini-batch的均值,再除以其标准差,类似于一种标准化操作,因此可以加速训练。但是这样会将输入值限制在一个较窄的区间,降低网络的表达能力。因此,姜标准化的值重新乘以一个锁放量y并加上偏置量ß,用于增强表达。



卷积神经网络 隐藏层 卷积神经网络层级结构_卷积核_05


与利用每个mini-batch的 卷积神经网络 隐藏层 卷积神经网络层级结构_卷积_06卷积神经网络 隐藏层 卷积神经网络层级结构_卷积神经网络_07,通过无偏估计求解整个训练样本的卷积神经网络 隐藏层 卷积神经网络层级结构_卷积_06 train 和 卷积神经网络 隐藏层 卷积神经网络层级结构_卷积神经网络_07 train 不同。也可直接求解整个训练样本的卷积神经网络 隐藏层 卷积神经网络层级结构_卷积_06 train 和 卷积神经网络 隐藏层 卷积神经网络层级结构_卷积神经网络_07 train,在测试时使用卷积神经网络 隐藏层 卷积神经网络层级结构_卷积_06 train 和 卷积神经网络 隐藏层 卷积神经网络层级结构_卷积神经网络_07 train替换卷积神经网络 隐藏层 卷积神经网络层级结构_卷积_06卷积神经网络 隐藏层 卷积神经网络层级结构_卷积神经网络_07

超参数设计准则

卷积神经网络的设计核心是感受野,即一个神经元在其下层网络中感知范围。
第L个池化层的感受野R(l与第L-1个池化层的感受野R(l-1)的关系,如式:



卷积神经网络 隐藏层 卷积神经网络层级结构_深度学习_16


在配置其他超参数时,需要注意,当增加卷积核的个数,宽度,以及网络的层数,或者减少卷积核的步长,网络的神经元的总数将会增加,这可以提高网络的表达能力,但也存在过拟合的风险。

tensorflow建模

在CNN中,想搞清楚每一层的传递关系,主要就是 height,width 的变化情况,和 channels 的变化情况。



卷积神经网络 隐藏层 卷积神经网络层级结构_卷积_17


tensorflow 中 tf.nn.conv2d 的 input 和 filter 这两个参数。
input : [batch, in_height, in_width, in_channels] ,
filter : [filter_height, filter_width, in_channels, out_channels] 。

卷积神经网络中 channel含义

一般含义是,每个卷积层中卷积核的数量。
channels 分为三种:
1.最初输入的样本的 channels ,取决于样本数据维度,比如3维数据就是3;
2.卷积操作完成后输出的 out_channels ,取决于卷积核的数量。此时的 out_channels 也会作为下一次卷积时的卷积核的 in_channels;
3.卷积核中的 in_channels ,就是上一次卷积的 out_channels ,如果是第一次做卷积,就是1中样本数据的 channels 。

padding参数的作用

决定在进行卷积或池化操作时,是否对输入的图像/数据矩阵边缘补0,‘SAME’ 为补零,‘VALID’ 则不补,其原因是因为在这些操作过程中过滤器可能不能将某个方向上的数据刚好处理完。

CNN调参经验

参数初始化
relu+bn
dropout 。分类问题用dropout ,只需要最后一层softmax 前用基本就可以了,能够防止过拟合能够防止过拟合,可能对accuracy提高不大,但是dropout 前面的那层如果是之后要使用的feature的话,性能会大大提升。
数据的shuffle 和augmentation 。这个没啥好说的,aug也不是瞎加,比如行人识别一般就不会加上下翻转的,因为不会碰到头朝下的异型种。
降学习率。随着网络训练的进行,学习率要逐渐降下来,如果你有tensorboard,你有可能发现,在学习率下降的一瞬间,网络会有个巨大的性能提升。
tensorboard。以前不怎么用,用了之后发现太有帮助,帮助你监视网络的状态,来调整网络参数。
随时存档模型,要有validation 。这就跟打游戏一样存档,把每个epoch和其对应的validation 结果存下来,可以分析出开始overfitting的时间点,方便下次加载fine-tuning。
batchsize通常影响没那么大,塞满卡就行,除了特殊的算法需要batch大一点。
输入减不减mean归一化在有了bn之后已经不那么重要了。

卷积核可视化

pip install keras-vis
https://raghakot.github.io/keras-vis/