用C语言构建一个数字识别深度神经网络

接上一篇: 用C语言构建一个数字识别卷积神经网络

1. 深度神经网络

  按照深度学习的理论,随着神经网络层数的增加,网络拟合复杂问题的能力也会增强,对事物特征的挖掘也会更加深入.这里尝试构建一个5层深度的神经网络,包括两个卷积层和两个池化层, 其中输出层为全连接层,如下图示:

程序中对应配置说明:

conv_layer层: 为3x3的卷积层, 8个卷积核, 采用valid_padding(不填充),移动扫描步长为1.

maxpool_layer层: 采用2x2最大池化,步长为2.

convA_layer层: 为3x3的卷积层, 32个卷积核, 采用valid_padding(不填充),移动扫描步长为1.

maxpoolA_layer层: 采用2x2最大池化,步长为2.

输出层output_layer: 一共10个神经元,分别对应0~9数字的可能性,与展平后的maxpoolA_layer层输出进行全连接.

卷积层的激活函数都采用func_ReLU,这样可以很大程度上抑制神经网络的梯度爆炸和消失问题.

2. 实验

  取2万条训练样本进行训练,训练后再进行测试,其准确率可超过96%.

3.问题和心得:

3.1 梯度爆炸和梯度消失

  在运行本文这个训练程序的时候,你可能会不幸踩到梯度的爆雷,提示"Gradients Explosion!? err is nan or inf!". 不过不要紧, 再来运行一遍嘛。也可以将学习率调小一点。

  梯度爆炸(或消失)的根本原因是反向传播的链式传导法则,它导致了梯度在反向层层传播时会对后级梯度进行放大或缩小.如果某个节点上的权重梯度不幸处在一个连续放大(或连续缩小)的传导路径上,那么这个权重更新时就会被放大(或缩小)到极大(或极小)的数值从而导致溢出(或变成0).在这里表现为输出损失值err变成NaN, 或err长时间保持基本无变化.

3.2 深度神经网络模型

  深度神经网络并不是简单的堆叠网络层数,而是要求对每层的输入/输出/结构/参数量等做合理的配置.不仅要保证层与层之间数据流的顺畅,还要保证所需特征信息的充分提取和传导.举个列子,如果将上面第一层和第二层卷积层的核心数量都改成16, 那么其总体效果可能还不如一个三层网络.如此看来, 一些经典的神经网络模型(如LeNet-5等)都值得我们好好学习.

3.3 学习率

  由于我们这里采用了SGD梯度下降学习法,因此学习曲线会比较曲折, 相对batch-GD方法应该取更小的学习率,这里可以取0.0025(或0.005). 对于大的学习率,踩到梯度雷的概率也会更大.往往大的学习率会造成输出损失值大幅度跳动,不过令人疑惑的是其最终结果可能会更好.另外,对于层数多的神经网络也要相应选取相对小的学习率.

另外,还可以实时调整学习率,如当发现输出损失值来回跳动时就将学习率减小一半,试验发现这样做可以加快收敛速度。在linux下这个可以简单地用kill发信号量来实现。

3.4 训练终止条件的设置

  一般对于一个新的模型一时无法知道它最终的收敛状况。这时可以把条件设得严格一些,如把mean_err<=0.0005作为终止条件;或直接设定epoch的计数值,如300。在经过一两轮训练后我们就会知道模型的大概收敛值了。 另外,我们也可以用ctrl+c发个信号让训练终止,但保留此时的参数值,直接进行下一步验证。

4. 源代码:

https://github.com/midaszhou/nnc 下载后编译: make TEST_NAME=test_nnc4

(如果是用git pull更新,那么先make clean)

参考资料:

  1. MNIST手写数字集 http://yann.lecun.com/exdb/mnist/

  2. LeNet5 介绍: https://www.cnblogs.com/sinpoo/p/15970402.html

相关推荐
hope_wisdom17 分钟前
C/C++数据结构之二叉树的遍历
c语言·数据结构·c++·二叉树·深度优先·广度优先
机器学习之心17 分钟前
基于残差融合WOA-LSTM-EKF的锂电池SOC估计方法
人工智能·深度学习·神经网络·锂电池soc估计·woa-lstm-ekf
老王以为23 分钟前
走进AI Agent第三篇:让 Agent 记住你
前端·人工智能·机器学习
VL——MOESR24 分钟前
【具身智能】OpenVLA论文阅读随笔
论文阅读·机器学习·具身智能·vla·openvla
ai小陈29 分钟前
CUDA版本不匹配怎么办?深度学习GPU环境排查与修复指南
人工智能·深度学习·ai·gpu算力
月华路1 小时前
《模型不玄学》第21章 稳定性与偏置审计
人工智能·深度学习·机器学习
等一朵映山红1 小时前
扩散模型在跨模态生成任务中的时序一致性优化
人工智能·机器学习
一木 之林1 小时前
五、C++ 新特性、关键字与编译原理(进阶)(一)
c语言·开发语言·c++
等一朵映山红3 小时前
对抗性攻击与鲁棒性:破解机器学习模型的“视觉盲区”
人工智能·机器学习
是隼人3 小时前
buuctf-pwn wustctf2020_closed(文件描述符)题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门