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

这篇具有很好参考价值的文章主要介绍了用C语言构建一个数字识别深度神经网络。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

1. 深度神经网络

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

(如果第一层卷积用16个核,效果会更好)

程序中对应配置说明:
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%.

用C语言构建一个数字识别深度神经网络,神经网络,深度学习,机器学习,c语言

 3.问题和心得:

3.1 梯度爆炸和梯度消失
  在运行本文这个训练程序的时候,你可能会不幸踩到梯度的爆雷,提示"Gradients Explosion!? err is nan or inf!". 不过不要紧, 再来运行一遍嘛。也可以将学习率调小一点。
  梯度爆炸(或消失)的根本原因是反向传播的链式传导法则,它导致了梯度在反向层层传播时会对后级梯度进行放大或缩小.如果某个节点上的权重梯度不幸处在一个连续放大(或连续缩小)的传导路径上,那么这个权重更新时就会被放大(或缩小)到极大(或极小)的数值从而导致溢出(或变成0).在这里表现为输出损失值err变成NaN, 或err长时间保持基本无变化.

改进: 在这个程序中梯度爆炸(或消失)的最终结果通常会体现在输出层func_softmax()函数的计算中, 由于e的指数超级大(或小)而造成计算溢出.其实我们可以提前在softmax公式的分子分母上都先除以一个大数(比如e^DBL_MAX_e_EXP),以降低计算过程中间数值,而保证最后结果不变.

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)

 文章来源地址https://www.toymoban.com/news/detail-637398.html

参考资料:

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

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

 

 

 

 

 

 

 

到了这里,关于用C语言构建一个数字识别深度神经网络的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深度学习:使用卷积神经网络CNN实现MNIST手写数字识别

    本项目基于pytorch构建了一个深度学习神经网络,网络包含卷积层、池化层、全连接层,通过此网络实现对MINST数据集手写数字的识别,通过本项目代码,从原理上理解手写数字识别的全过程,包括反向传播,梯度下降等。 卷积神经网络是一种多层、前馈型神经网络。从功能上

    2024年02月13日
    浏览(33)
  • pytorch学习——如何构建一个神经网络——以手写数字识别为例

    目录 一.概念介绍 1.1神经网络核心组件 1.2神经网络结构示意图 1.3使用pytorch构建神经网络的主要工具 二、实现手写数字识别 2.1环境 2.2主要步骤 2.3神经网络结构 2.4准备数据 2.4.1导入模块 2.4.2定义一些超参数 2.4.3下载数据并对数据进行预处理 2.4.4可视化数据集中部分元素  2

    2024年02月14日
    浏览(23)
  • 入门深度学习——基于全连接神经网络的手写数字识别案例(python代码实现)

    1.1 问题导入 如图所示,数字五的图片作为输入,layer01层为输入层,layer02层为隐藏层,找出每列最大值对应索引为输出层。根据下图给出的网络结构搭建本案例用到的全连接神经网络 1.2 手写字数据集MINST 如图所示,MNIST数据集是机器学习领域中非常经典的一个数据集,由6

    2024年02月03日
    浏览(35)
  • (九)人工智能应用--深度学习原理与实战--前馈神经网络实现MNST手写数字识别

    目标: 识别手写体的数字,如图所示: 学习内容: 1、掌握MNIST数据集的加载和查看方法 2、熟练掌握Keras建立前馈神经网络的步骤【重点】 3、掌握模型的编译及拟合方法的使用,理解参数含义【重点】 4、掌握模型的评估方法 5、掌握模型的预测方法 6、掌握自定义图片的处理与

    2024年02月13日
    浏览(34)
  • 乳腺癌CT影像数据的深度学习:R语言与ANN神经网络构建高性能分类诊断模型

    乳腺癌是全球最常见的女性恶性肿瘤之一,也影响着男性的健康。据统计,每年有数百万人被诊断出患有乳腺癌[1]。乳腺癌的早期检测和准确诊断对于治疗和预后至关重要。然而,乳腺癌的早期诊断面临许多挑战,如图像解读的主观性和复杂性,以及差异化的病理特征[2]。因

    2024年02月14日
    浏览(34)
  • 手写数字识别--神经网络实验

     我自己搞的代码,预测精度才94% 神经网络实验报告源码.zip - 蓝奏云  老师给的实验源码答案和资料,预测精度高达99% 深度学习实验报告.zip - 蓝奏云 上深度学习的课程,老师布置了一个经典的实验报告,我做了好久才搞懂,所以把实验报告放到CSDN保存,自己忘了方便查阅

    2024年02月06日
    浏览(31)
  • 手写数字识别-基于卷积神经网络

    🌞欢迎来到机器学习的世界  🌈博客主页:卿云阁  💌欢迎关注🎉点赞👍收藏⭐️留言📝 🌟本文由卿云阁原创! 🌠本阶段属于练气阶段,希望各位仙友顺利完成突破 📆首发时间:🌹2021年6月5日🌹 ✉️希望可以和大家一起完成进阶之路! 🙏作者水平很有限,如果发

    2024年02月10日
    浏览(34)
  • 神经网络基础-手写数字识别

    基本原理 图像本质上被认为是一个矩阵,每个像素点都是一个对应的像素值,相当于在多维数据上进行相关的归类或者其他操作。 线性函数 线性函数的一个从输入到输出的映射,用于给目标一个每个类别对应的得分。 图像 ( 32 ∗ 32 ∗ 3 ) → f ( x , W ) Y 图像(32*32*3) stackrel{

    2024年02月02日
    浏览(29)
  • 【神经网络手写数字识别-最全源码(pytorch)】

    Torch安装的方法 学习方法 1.边用边学,torch只是一个工具,真正用,查的过程才是学习的过程 2.直接就上案例就行,先来跑,遇到什么来解决什么 Mnist分类任务: 网络基本构建与训练方法,常用函数解析 torch.nn.functional模块 nn.Module模块 读取Mnist数据集 会自动进行下载 784是m

    2024年02月14日
    浏览(25)
  • 卷积神经网络 —— 图像识别与深度学习

    视频教程学习链接: https://www.icourse163.org/learn/XUST-1206363802?tid=1467124640#/learn/content?type=detailid=1248319353cid=1275090253 原始数据的形式是多种多样的,除了数字之外,还可能是文字、图像、视频、音频等,下面,就以图像识别为例,来了解深度学习在计算机视觉领域中的应用。 图像

    2024年02月05日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包