本实验系列文章目录如下,相关代码(python)托管在我的Github - SIGNS experiment,欢迎访问;
数字手势识别实验:2.MLP
基础回顾 - MLP
MLP(Multi-layer Perceptron,多层感知机)是建立在全连接基础上的多层前向神经网络。形如下图:
在隐含层数目较大时,MLP常被称作深层神经网络(DNN)。本实验拟基于Tensorflow框架实现MLP。
实验模型设计
要设计MLP模型,必须明确输入输出数据维度。根据MLP的全连接特点,由图片数据可以计算出输入维度n_x=64×64×3=12288(64×64像素大小,RGB三通道)
,输出维度n_y=6(即0,1,2,3,4,5)
。可将问题看作是一个多分类问题。设计出MLP的初始化结构如下图示:
这里的隐含层采用ReLU
激活函数,输出层采用Softmax
,隐层规模与参数维度已在图中注明,可以直接基于Tensorflow写出基本的MLP实现代码(代码参考:mlp_1.py),这里的实现过程关键点有:
- 根据tensorflow建模流程,先构建
computation graph
,再基于session
运行。 - 参数初始化时采用
Xavier initialization
,注意参数维度的设置; cost
计算采用cross_entropy
函数;- 优化过程采用
gradient descent
,目标即为最小化cost
; - 采用
mini-batch
策略提高训练效率;
训练与验证
加载数据,对模型进行训练与验证,得出代价曲线变化图:
最终的误差结果为:
Train Accuracy: 1.0
Test Accuracy: 0.891667
其中一部分测试集手势图像的预测结果显示如下图示:
小结
这里的优化方法采用的是最简单的梯度下降法(GradientDescentOptimizer()
),结合所学知识,可在接下来的实验中尝试采用提高训练效率的方法(trick),如采用Momentum、Batch-Norm等。
结果显示训练集已经完全拟合(Train Accuracy=1.0
),同时考虑到这里只有约1k的训练样本,故需担心是否过拟合。测试集精度(Test Accuracy=0.891667
)较训练集还有较大差距,同时考虑到测试集和训练集样本图像均是采用同样的方式获取的手势图像,故而不考虑dis-match
问题,所以接下来应考虑如何提高模型的泛化能力(降低variance
),如采用Dropout策略。
下面的实验中,我们将依次学习使用Momentum、Batch-Norm、Dropout等深度学习中常见的tricks。