更新于 

系统设计

数据预处理

数据集分割

为了训练FER2013数据集,我们参照ICML官方设计的训练(Training)、验证(Validation)、测试(Test)数据集的分割方法,即80%作为训练数据集,10%作为验证数据集,10%作为测试数据集。

数据增强

为了能让我们的卷积神经网络对表情识别有更加可靠的自适应性,我们可以在神经网络的训练中使用数据增强(Data Augmentation)。基于批量(Batch)数据的实时训练方式,我们的数据增强方法如下表所示。

处理方式 参数设置 效果
1 Zoom ±20% 对图像做随机缩放
2 Width/Height Shift ±20% 水平/垂直平移
3 Rotation ±10% 随机旋转角度
4 Horizontal Flip 水平镜像

VGGNet 网络结构

VGGNet是一种用于大规模图像处理和模式识别的经典卷积神经网络结构。我们的搭建的VGGNet变体如下图所示。

VGGNet 结构示意图
VGGNet 结构示意图

该网络由4个卷积级(Convolutional Stages)和3个全连接层(Fully Connected Layers)组成。每个卷积级包含两个卷积块(Convolutional Blocks)和一个最大池化层(Max Pooling)。卷积块由卷积层(Convolution)、ReLU激活函数和批标准化层(Batch Normalization)组成。批标准化能够加速神经网络的学习过程,减少内部协方差偏移,以及防止梯度消失或爆炸。前两个全连接层之后是ReLU激活函数。第三个全连接层用于最终分类,使用SoftMax激活函数。卷积级的作用是特征提取、降维和非线性。经过全连接层的训练,我们可以根据提取的特征对输入图像进行分类。

神经网络的优化方法

基于Nesterov momentum的SGD方法

我们回顾基本的mini-bacth SGD方法,其原理是,采用训练数据的一部分,生成批量样本(mini-batch),然后对批量样本,使用随机梯度下降法(SGD)更新权值(weights)和偏置(biases),如下面的公式所示。

其中, 就是学习速率,m是mini-batch的样本数量。

mini-bacth SGD的核心是对权值梯度和偏置的梯度,经过反向传播的方式进行更新。因此,我们也把基于SGD方法的神经网络称为BP神经网络。

进一步,我们使用动量(momentum)方法更好地完成对权值的更新。当使用SGD训练参数时,有时候会下降的非常慢,并且可能会陷入到局部最小值中。momentum的引入就是为了加快学习过程,特别是对于高曲率、小但一致的梯度,或者噪声比较大的梯度能够很好的加快学习过程。

我们引入速度变量,其中每一个对应变量。然后我们将上述公式中关于权值的梯度下降更新规则改成如下的公式。

其中, 是一个超参数,其值越大,则之前的梯度对现在的方向影响越大。

最后,Nesterov momentum是对momentum的改进,可以理解为Nesterov动量在标准动量方法中添加了一个校正因子。与momentum的唯一区别就是计算梯度的不同,Nesterov先用当前的速度v更新一遍参数,再用更新的临时参数计算梯度。即上述公式中的梯度计算先使用如下的公式。

学习速率监测器

学习速率通常会影响神经网络的训练的效果,当评价指标不再提升时,我们应该降低学习速率,因为此时,较慢的学习速率能找到更精准的网络。

我们使用Reduce Learning Rate on Plateau(RLRP)策略:当评估标准停止提升时,降低一定的学习速率。当学习停止时,模型总是会受益于降低 2-10 倍的学习速率。我们检测某个数据并且当这个数据在一定“有耐心”的训练轮之后还没有进步,那么学习速率就会被降低。