用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

相关推荐
pumpkin845141 分钟前
Rust 调用 C 函数的 FFI
c语言·算法·rust
汀沿河31 分钟前
2 大模型高效参数微调;prompt tunning
人工智能·深度学习·prompt
路溪非溪38 分钟前
机器学习之线性回归
人工智能·机器学习·线性回归
Chef_Chen40 分钟前
从0开始学习计算机视觉--Day07--神经网络
神经网络·学习·计算机视觉
2401_858286111 小时前
125.【C语言】数据结构之归并排序递归解法
c语言·开发语言·数据结构·算法·排序算法·归并排序
双叶8362 小时前
(C++)学生管理系统(正式版)(map数组的应用)(string应用)(引用)(文件储存的应用)(C++教学)(C++项目)
c语言·开发语言·数据结构·c++
是Dream呀3 小时前
基于连接感知的实时困倦分类图神经网络
神经网络·分类·数据挖掘
Blossom.1183 小时前
机器学习在智能制造业中的应用:质量检测与设备故障预测
人工智能·深度学习·神经网络·机器学习·机器人·tensorflow·sklearn
巴伦是只猫3 小时前
【机器学习笔记 Ⅱ】1 神经网络
笔记·神经网络·机器学习
烟锁池塘柳04 小时前
【深度学习】强化学习(Reinforcement Learning, RL)主流架构解析
人工智能·深度学习·机器学习