用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

相关推荐
格林威6 分钟前
工业视觉检测:两大主流异常检测开源框架深度对比(PatchCore vs SPADE)
开发语言·人工智能·深度学习·数码相机·计算机视觉·视觉检测·工业相机
eDEs OLDE9 分钟前
CC++链接数据库(MySQL)超级详细指南
c语言·数据库·c++
小何code14 分钟前
人工智能【第11篇】K近邻算法KNN:简单有效的分类方法(长文+代码实现)
人工智能·机器学习·knn
AI木马人16 分钟前
18.人工智能实战:LoRA 微调后效果不升反降?从数据清洗到训练参数的完整排查方案
人工智能·深度学习·机器学习
广州山泉婚姻24 分钟前
C语言三种基本程序结构详解
c语言·开发语言
上弦月-编程28 分钟前
【C语言】函数栈帧的创建与销毁(底层原理)
c语言·开发语言
Hhy_110734 分钟前
【从零开始学习数据结构 ④】:栈 ——后进先出的艺术
c语言·数据结构·学习·visual studio
爱编码的小八嘎39 分钟前
c语言完美演绎9-17
c语言
广州山泉婚姻40 分钟前
C++ STL Vector 入门与实战全攻略
c语言·c++
淡海水1 小时前
【AI模型】核心概念解析
人工智能·机器学习