简 介: 通过PaddlePaddle构造的简单神经网络对于MNIST数据库进行实验,可以看到使用普通的稠密网络,便可以达到很高的识别效果。训练结果存在一定的随机性。这取决于训练其实的条件。由于在Paddle下, AI Studio加载GPU版本的训练,但AI Studio提供环境CUDA的版本过低。还无法正常进行加速训练。

关键词paddleMNIST稠密网络

#mermaid-svg-GbqXunAp0GSmeH3Q {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GbqXunAp0GSmeH3Q .error-icon{fill:#552222;}#mermaid-svg-GbqXunAp0GSmeH3Q .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-GbqXunAp0GSmeH3Q .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-GbqXunAp0GSmeH3Q .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-GbqXunAp0GSmeH3Q .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-GbqXunAp0GSmeH3Q .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-GbqXunAp0GSmeH3Q .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-GbqXunAp0GSmeH3Q .marker{fill:#333333;stroke:#333333;}#mermaid-svg-GbqXunAp0GSmeH3Q .marker.cross{stroke:#333333;}#mermaid-svg-GbqXunAp0GSmeH3Q svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-GbqXunAp0GSmeH3Q .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-GbqXunAp0GSmeH3Q .cluster-label text{fill:#333;}#mermaid-svg-GbqXunAp0GSmeH3Q .cluster-label span{color:#333;}#mermaid-svg-GbqXunAp0GSmeH3Q .label text,#mermaid-svg-GbqXunAp0GSmeH3Q span{fill:#333;color:#333;}#mermaid-svg-GbqXunAp0GSmeH3Q .node rect,#mermaid-svg-GbqXunAp0GSmeH3Q .node circle,#mermaid-svg-GbqXunAp0GSmeH3Q .node ellipse,#mermaid-svg-GbqXunAp0GSmeH3Q .node polygon,#mermaid-svg-GbqXunAp0GSmeH3Q .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-GbqXunAp0GSmeH3Q .node .label{text-align:center;}#mermaid-svg-GbqXunAp0GSmeH3Q .node.clickable{cursor:pointer;}#mermaid-svg-GbqXunAp0GSmeH3Q .arrowheadPath{fill:#333333;}#mermaid-svg-GbqXunAp0GSmeH3Q .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-GbqXunAp0GSmeH3Q .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-GbqXunAp0GSmeH3Q .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-GbqXunAp0GSmeH3Q .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-GbqXunAp0GSmeH3Q .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-GbqXunAp0GSmeH3Q .cluster text{fill:#333;}#mermaid-svg-GbqXunAp0GSmeH3Q .cluster span{color:#333;}#mermaid-svg-GbqXunAp0GSmeH3Q div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-GbqXunAp0GSmeH3Q :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

稠密网络
目 录
Contents
mnist稠密网络
程序代码
运行结果
对比不同网络结构
训练结果
总 结

§01 稠密网络


1.1 mnist稠密网络

1.1.1 程序代码

import paddle
from paddle.vision.transforms import ToTensor# 加载数据集
train_dataset = paddle.vision.datasets.MNIST(mode='train', transform=ToTensor())
val_dataset =  paddle.vision.datasets.MNIST(mode='test', transform=ToTensor())# 模型组网
mnist = paddle.nn.Sequential(paddle.nn.Flatten(),paddle.nn.Linear(784, 512),paddle.nn.ReLU(),paddle.nn.Dropout(0.2),paddle.nn.Linear(512, 10)
)# 封装模型
model = paddle.Model(mnist)# 配置训练模型
model.prepare(paddle.optimizer.Adam(parameters=model.parameters()),paddle.nn.CrossEntropyLoss(),paddle.metric.Accuracy())# 模型训练
model.fit(train_dataset,epochs=5,batch_size=64,verbose=1)
# 模型评估
model.evaluate(val_dataset, verbose=0)# 模型测试
model.predict(val_dataset)# 模型保存
model.save('./model')

1.1.2 运行结果

(1)训练结果

  可以看到训练过程中,精度最终可以达到 0.986。通常任务这个精度只有施加有卷积层的时候才能够达到。对比上述网络,可以看到其中在网络结构中,存在着一个Dropout层。

▲ 图1.1.1 训练的结果

(2)网络结构

---------------------------------------------------------------------------Layer (type)       Input Shape          Output Shape         Param #
===========================================================================Flatten-15007   [[64, 1, 28, 28]]        [64, 784]              0       Linear-5         [[64, 784]]           [64, 512]           401,920    ReLU-3          [[64, 512]]           [64, 512]              0       Dropout-3        [[64, 512]]           [64, 512]              0       Linear-6         [[64, 512]]            [64, 10]            5,130
===========================================================================
Total params: 407,050
Trainable params: 407,050
Non-trainable params: 0
---------------------------------------------------------------------------
Input size (MB): 0.19
Forward/backward pass size (MB): 1.14
Params size (MB): 1.55
Estimated Total Size (MB): 2.88
---------------------------------------------------------------------------{'total_params': 407050, 'trainable_params': 407050}

1.1.3 对比不同网络结构

(1)去掉Dropout结构

  将原来代码中的 Dropout层去掉,进行同样的训练。

---------------------------------------------------------------------------Layer (type)       Input Shape          Output Shape         Param #
===========================================================================Flatten-39701   [[64, 1, 28, 28]]        [64, 784]              0       Linear-9         [[64, 784]]           [64, 512]           401,920    Dropout-5        [[64, 512]]           [64, 512]              0       Linear-10        [[64, 512]]            [64, 10]            5,130
===========================================================================
Total params: 407,050
Trainable params: 407,050
Non-trainable params: 0
---------------------------------------------------------------------------
Input size (MB): 0.19
Forward/backward pass size (MB): 0.89
Params size (MB): 1.55
Estimated Total Size (MB): 2.63
---------------------------------------------------------------------------{'total_params': 407050, 'trainable_params': 407050}

  下面是最终训练之后的结果,可以看到最终的训练精度只有0.9185。

▲ 图1.1.2 没有Dropout训练结果

  再次训练改网络,最终的精度为:0.9912。这说明Dropout并不是影响精度的因素。

▲ 图1.1.3 另一次没有Dropout训练的结果

(2)将中间层修改成sigmoid

mnist = paddle.nn.Sequential(paddle.nn.Flatten(),paddle.nn.Linear(784, 512),paddle.nn.Sigmoid(),paddle.nn.Linear(512, 10)
)model = paddle.Model(mnist)

▲ 图1.1.4 使用Sigmoid传递函数

---------------------------------------------------------------------------Layer (type)       Input Shape          Output Shape         Param #
===========================================================================Flatten-2     [[64, 1, 28, 28]]        [64, 784]              0       Linear-3         [[64, 784]]           [64, 512]           401,920    Sigmoid-1        [[64, 512]]           [64, 512]              0       Linear-4         [[64, 512]]            [64, 10]            5,130
===========================================================================
Total params: 407,050
Trainable params: 407,050
Non-trainable params: 0
---------------------------------------------------------------------------
Input size (MB): 0.19
Forward/backward pass size (MB): 0.89
Params size (MB): 1.55
Estimated Total Size (MB): 2.63
---------------------------------------------------------------------------{'total_params': 407050, 'trainable_params': 407050}

(3)去掉中间的非线性环节

mnist = paddle.nn.Sequential(paddle.nn.Flatten(),paddle.nn.Linear(784, 512),paddle.nn.Linear(512, 10)
)model = paddle.Model(mnist)

▲ 图1.1.5 没有非线性环节训练结果

---------------------------------------------------------------------------Layer (type)       Input Shape          Output Shape         Param #
===========================================================================Flatten-3     [[64, 1, 28, 28]]        [64, 784]              0       Linear-5         [[64, 784]]           [64, 512]           401,920    Linear-6         [[64, 512]]            [64, 10]            5,130
===========================================================================
Total params: 407,050
Trainable params: 407,050
Non-trainable params: 0
---------------------------------------------------------------------------
Input size (MB): 0.19
Forward/backward pass size (MB): 0.64
Params size (MB): 1.55
Estimated Total Size (MB): 2.38
---------------------------------------------------------------------------{'total_params': 407050, 'trainable_params': 407050}

(4)修改成单层网络

mnist = paddle.nn.Sequential(paddle.nn.Flatten(),paddle.nn.Linear(784, 10),
)model = paddle.Model(mnist)

▲ 图1.1.6 单层神经网络识别结果

---------------------------------------------------------------------------Layer (type)       Input Shape          Output Shape         Param #
===========================================================================Flatten-4     [[64, 1, 28, 28]]        [64, 784]              0       Linear-7         [[64, 784]]            [64, 10]            7,850
===========================================================================
Total params: 7,850
Trainable params: 7,850
Non-trainable params: 0
---------------------------------------------------------------------------
Input size (MB): 0.19
Forward/backward pass size (MB): 0.39
Params size (MB): 0.03
Estimated Total Size (MB): 0.61
---------------------------------------------------------------------------{'total_params': 7850, 'trainable_params': 7850}

1.2 训练结果

  将前面的训练结果总结如下:

【表1-2-1 不同结构的稠密网络训练结果】
网络结构 参数个数 训练精度
784/512+Relu+Dropout+512/10 407050 0.986
784/512+Relu+512/10 407050 0.9185
0.9982
784/512+Sigmoid 512/10 407050
784/512+512/10 407050 0.9205
784/10 7850 0.9228

  通过上面表格可以看出,对于MNIST数据集合,适用普通的稠密网络便可以达到很好的效果。特别是:

  • 是否增加 dropout对于结果没有特别明显的差异;
  • sigmoid, ReLu对于结果没有明显的差异;
  • 将网络中的非线性层去掉,甚至修改成单层网络,准确率下降至0.92左右,但这仍然是一个很高的数值。

※ 总  结 ※


  通过PaddlePaddle构造的简单神经网络对于MNIST数据库进行实验,可以看到使用普通的稠密网络,便可以达到很高的识别效果。

  训练结果存在一定的随机性。这取决于训练其实的条件。

  由于在Paddle下, AI Studio加载GPU版本的训练,但AI Studio提供环境CUDA的版本过低。还无法正常进行加速训练。


● 相关图表链接:

  • 图1.1.1 训练的结果
  • 图1.1.2 没有Dropout训练结果
  • 图1.1.3 另一次没有Dropout训练的结果
  • 图1.1.4 使用Sigmoid传递函数
  • 图1.1.5 没有非线性环节训练结果
  • 图1.1.6 单层神经网络识别结果
  • 表1-2-1 不同结构的稠密网络训练结果

MNIST数据集合在PaddlePaddle环境下使用简单神经网络识别效果相关推荐

  1. Ubuntu18.04环境下I219-LM网卡不能识别问题解决

    Ubuntu18.04环境下I219-LM网卡不能识别问题解决 背景介绍 硬件信息 驱动信息 解决过程 解决方案 注意事项 背景介绍 使用的某品牌的PC机,CPU型号为I5-1145G7(笔记本)或者 ...

  2. VS2010+OSG3.2+CEGUI0.8.4环境下实现简单的HelloWorld程序

    VS2010+OSG3.2+CEGUI0.8.4环境下实现简单的HelloWorld程序 写文章之前必须要先吐槽一下CEGUI的兼容性,好多函数改了名称换了命名空间,以致于花了好长时间查看自带的Dem ...

  3. linux python开发环境sql数据迁移到mysql_linux环境下python怎样操作mysql数据库

    展开全部 linux环境下python怎样操作mysql数据库呢?方法如下: 首先在Linux环境下安装mysql-python 1.下载mysql-python 打开终端: cd /usr/loca ...

  4. linux如何运行java程序,Linux环境下运行简单java程序

    一.安装java 1.下载jdk8 选择对应jdk版本下载.(Tips:可在Windows下载完成后,通过FTP或者SSH到发送到Linux上) 2. 登录Linux,切换到root用户 su roo ...

  5. Linux环境下实现简单进度条

    进度条是我们生活中可见的,但是大家却从来不知道其怎么实现的,下面就是linux环境下的进度条的简单实现 这里应该提一下缓冲区的概念: 计算机中的缓冲区: 缓冲器为暂时置放输出或输入资料的内存. 缓冲器 ...

  6. tensorflow环境下的识别食物_在win10环境下进行tensorflow物体识别(ObjectDetection)训练...

    安装ObjectDetection,CPU和GPU都需要 解压module.rar放到C:\TFWS\models目录 地址:https://github.com/tensorflow/models ...

  7. nginx集群_windows环境下搭建简单Nginx+Tomcat集群

    通俗点将,负载均衡就是因为访问流量太大,导致项目访问不流畅.甚至宕掉,所以通过一种分流的方式来缓解这种情况. 一. 工具 nginx-1.8.0 apache-tomcat-6.0.33 二. 目标 ...

  8. EfficientNet-B4-Ranger:自然复杂环境下温室黄瓜病害识别新方法(同时存在两种疾病)

    1.研究介绍 主要任务是***找到一种有效的方法来解决同一片叶子上发生的两种疾病以及外界光线的影响所引起的疾病相似性问题***.首先,在自然复杂的温室背景下获得了黄瓜叶片病害数据集,其中不仅包括白粉病 ...

  9. linux环境下最简单的C语言例子

    1.装好linux系统和配置GCC环境 给自己的电脑上安装linux系统,比如我用大的是ubuntu,然后在ubuntu上配置GCC环境,如果不知道配置,请百度"linux上怎么配置GCC环 ...

最新文章

  1. cad里面f命令用不了,CAD出现命令无效、失灵等问题?不用慌,两招帮你快速解决...
  2. Java编程基础25——多线程上
  3. Pyhton学习——Day25
  4. 网易资深Java架构师:疫情对java行业的影响分析
  5. 高并发秒杀——SpringBoot集成redis
  6. 转载 @html.ActionLink的几种参数格式
  7. Cocos2d-x--开发参考资料
  8. JS组件系列——又一款MVVM组件:Vue(一:30分钟搞定前端增删改查)
  9. Linux进入救援系统怎么恢复,Linux在rescue(救援)模式修复GRUB (引导菜单)
  10. scala 编程 ——类型限定与泛型编程
  11. Java开源J2EE框架
  12. 开篇 :直播软件分析.
  13. 关于纯前端excel上传、下载功能
  14. 2021 年 9 项优秀在线电话会议服务比较(带免费选项)
  15. BackTrack5(BT5)及BT5支持网卡列表
  16. AcWing每日一题 3565.完美矩阵(绝对值不等式)
  17. audio 应用-Python 分析工具
  18. .NET 中关于ImageList 图片锯齿问题
  19. 案例分析---我是如何在谷歌财经发现一个XSS漏洞
  20. ActiveX控件:设置控件属性和方法的一种简易办法(VS2013)

热门文章

  1. Cloud Foundry平台中国唯一云供应商,阿里云持续链接Cloud Foundry/Kubernetes生态
  2. Virtual Machine Remote Control Client Plus
  3. C# Windows基础拾遗01—线条绘制篇
  4. Grunt的配置和使用
  5. 线性模型和非线性模型的区别
  6. Hibernate智能化分页
  7. 在AWS Lambda上运行脚本语言:PHP、Ruby和Go(外文翻译)
  8. Docker----在Docker中部署Asp.net core2.1以及修改发布
  9. 软件工程第二次作业完整版
  10. C++14尝鲜:Generic Lambdas(泛型lambda)