系统设计
数据预处理
数据集分割
为了训练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变体如下图所示。
该网络由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),如下面的公式所示。
其中,
mini-bacth SGD的核心是对权值梯度
进一步,我们使用动量(momentum)方法更好地完成对权值的更新。当使用SGD训练参数时,有时候会下降的非常慢,并且可能会陷入到局部最小值中。momentum的引入就是为了加快学习过程,特别是对于高曲率、小但一致的梯度,或者噪声比较大的梯度能够很好的加快学习过程。
我们引入速度变量
其中,
最后,Nesterov momentum是对momentum的改进,可以理解为Nesterov动量在标准动量方法中添加了一个校正因子。与momentum的唯一区别就是计算梯度的不同,Nesterov先用当前的速度v更新一遍参数,再用更新的临时参数计算梯度。即上述公式中的梯度计算先使用如下的公式。
学习速率监测器
学习速率通常会影响神经网络的训练的效果,当评价指标不再提升时,我们应该降低学习速率,因为此时,较慢的学习速率能找到更精准的网络。
我们使用Reduce Learning Rate on Plateau(RLRP)策略:当评估标准停止提升时,降低一定的学习速率。当学习停止时,模型总是会受益于降低 2-10 倍的学习速率。我们检测某个数据并且当这个数据在一定“有耐心”的训练轮之后还没有进步,那么学习速率就会被降低。