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

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

1. 深度神经网络

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/67691.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【逗老师的PMP学习笔记】9、项目资源管理

目录 一、规划资源管理1、【关键工具】责任分配矩阵RACI矩阵2、【关键工具】组织理论2.1、马斯洛需求层次理论2.2、麦格雷戈-X-Y理论2.3、赫兹伯格双因素理论 3、【关键输出】资源管理计划4、【关键输出】团队章程 二、估算活动资源1、【关键输入】资源日历 三、获取资源1、【关…

LeetCode_01 精度丢失

1281. 整数的各位积和之差 给你一个整数 n&#xff0c;请你帮忙计算并返回该整数「各位数字之积」与「各位数字之和」的差。 示例 输入&#xff1a;n 234 输出&#xff1a;15 解释&#xff1a; 各位数之积 2 * 3 * 4 24 各位数之和 2 3 4 9 结果 24 - 9 15示例 …

【计算机视觉】干货分享:Segmentation model PyTorch(快速搭建图像分割网络)

一、前言 如何快速搭建图像分割网络&#xff1f; 要手写把backbone &#xff0c;手写decoder 吗&#xff1f; 介绍一个分割神器&#xff0c;分分钟搭建一个分割网络。 仓库的地址&#xff1a; https://github.com/qubvel/segmentation_models.pytorch该库的主要特点是&#…

【2.2】Java微服务:Hystrix的详解与使用

目录 分布式系统面临问题 Hystrix概念 Hystrix作用 降级 什么是降级 order服务导入Hystrix依赖&#xff08;简单判断原则&#xff1a;谁调用远程谁加&#xff09; 启动类添加注解 业务方法添加注解&#xff08;冒号里填回调方法名&#xff0c;回调方法返回兜底数据&…

沁恒ch32V208处理器开发(二)工程配置

概述 MounRiver Studio在进行任何项目的开发时&#xff0c;为了提高效率&#xff0c;往往需要复用芯片厂家或第三方开发的成熟模块&#xff0c;这些模块通过一个.wvproj文件来进行组织&#xff0c;主要包含&#xff1a; 1&#xff09;MCU厂家提供的硬件接口文件&#xff0c;包…

Windows使用docker desktop 安装kafka、zookeeper集群

docker-compose安装zookeeper集群 参考文章&#xff1a;http://t.csdn.cn/TtTYI https://blog.csdn.net/u010416101/article/details/122803105?spm1001.2014.3001.5501 准备工作&#xff1a; ​ 在开始新建集群之前&#xff0c;新建好文件夹&#xff0c;用来挂载kafka、z…

设计师常用的6款UI设计工具

在选择UI设计工具时&#xff0c;设计师需要关注UI设计工具的功能。市场上有很多设计UI的工具。既然UI设计工具这么多&#xff0c;设计师应该如何选择UI设计工具&#xff1f;本文盘点了6种流行的UI设计工具&#xff0c;快来看看。 1.即时设计 即时设计是一款免费的在线 UI 设计…

Kubernetes kubectl管理命令使用方法

陈述式资源管理方法&#xff08;通过命令行&#xff09; 1.kubernetes 集群管理集群资源的唯一入口是通过相应的方法调用 apiserver 的接口 2.kubectl 是官方的CLI命令行工具&#xff0c;用于与 apiserver 进行通信&#xff0c;将用户在命令行输入的命令&#xff0c;组织并转化…

element-ui表格跨页多选实现

前言 在我们日常项目开发中,经常会有表格跨页多选的需求,接下来让我们用 el-table 示例一步步来实现这个需求。 动手开发 在线体验 https://codesandbox.io/s/priceless-mcclintock-4cp7x3?file/src/App.vue 常规版本 本部分只写了一些重点代码,心急的彦祖可以直接看 性…

使用chatGPT-4 畅聊量子物理学

与chatGPT深入研究起源、基本概念&#xff0c;以及海森堡、德布罗意、薛定谔、玻尔、爱因斯坦和狄拉克如何得出他们的想法和方程。 1965 年&#xff0c;费曼&#xff08;左&#xff09;与朱利安施温格&#xff08;未显示&#xff09;和朝永信一郎&#xff08;右&#xff09;分享…

机器学习深度学习——文本预处理

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——序列模型&#xff08;NLP启动&#xff01;&#xff09; &#x1f4da;订阅专栏&#xff1a;机器学习&am…

大厂容器云实践之路(二)

3-网易蜂巢的DOCKER实践之路 面临问题 场景分析 如何解决 功能性需求&#xff08;基础&#xff09; 第一步 技术支撑公有化 开发流程 场景分析 功能性需求&#xff08;基础&#xff09; 非功能性需求&#xff08;SLA&#xff09; 第二步 产品技术云端化 开发流程 场景分析…

Maven介绍,部署在eclipse中

目录 一.Maven介绍 1&#xff0c;什么是maven&#xff1f; 2. 为什么maven会在企业中大量使用&#xff1f; 3.没有使用maven的前后区别? 4.maven在Java开发中的实际效果图 二.maven部署在eclipse中 1.下载maven在其官方网址下载&#xff08;当然实际下载也要根据个人的…

C语言案例 判断是否为回文数-06

题目&#xff1a;随机输入一个5位数&#xff0c;判断它是不是回文数 步骤一&#xff1a;定义程序的目标 编写C程序&#xff0c;随机输入一个5位数&#xff0c;判断它是不是回文数 步骤二&#xff1a;程序设计 原理&#xff1a;即12321是回文数&#xff0c;个位与万位相同&#…

【C++学习手札】new和delete看这一篇就够了!

​ 食用指南&#xff1a;本文在有C基础的情况下食用更佳 &#x1f340;本文前置知识&#xff1a; C类 ♈️今日夜电波&#xff1a; Prover—milet 1:21 ━━━━━━️&#x1f49f;──────── 4:01 …

学习C语言第三天 :关系操作符、逻辑操作符

1.关系操作符 C语言用于比较的表达式&#xff0c;称为“关系表达式”里面使用的运算符就称(relationalexpression)&#xff0c;为“关系运算符” (relationaloperator) &#xff0c;主要有下面6个。 > 大于运算符 < 小于运算符 > 大于等于运算符 < 小于等…

JVM基础篇-直接内存

JVM基础篇-直接内存 什么是直接内存? 直接内存( 堆外内存 ) 指的是 Java 应用程序通过直接方式从操作系统中申请的内存,这块内存不属于jvm 传统方式读取文件 首先会从用户态切换到内核态&#xff0c;调用操作系统函数从磁盘读取文件&#xff0c;读取一部分到操作系统缓冲区…

电影院订票选座网站小程序开发(java开源)

搭建一个电影院订票选座网站小程序需要掌握Java语言和相关的Web开发技术&#xff0c;同时需要使用开源框架和库来实现。以下是一个基本的步骤指南&#xff1a; 确定技术栈 首先&#xff0c;需要确定使用的技术栈&#xff0c;以便更好的开展工作。 设计数据库 设计数据库需要…

H5实现签字板签名功能

前言&#xff1a;H5时常需要实现给C端用户签名的功能&#xff0c;以下是基于Taro框架开发的H5页面实现&#xff0c;非 Taro 的 View 标签换成 div 即可。 一、用到的技术库 签字库&#xff1a;react-signature-canvas主流React Hooks 库&#xff1a;ahooks 二、组件具体实现…

2024考研408-计算机网络 第四章-网络层学习笔记

文章目录 前言一、网络层的功能1.1、网络层功能概述&#xff08;三种功能介绍&#xff09;1.2、SDN基本概念1.2.1、理解转发与路由选择1.2.1.1、转发1.2.1.2、路由选择 1.2.2、数据平面&#xff08;转发&#xff09;1.2.3、控制平面&#xff08;路由计算与选择&#xff09;实现…