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

本文通过PaddlePaddle搭建了针对MNIST数据集的稠密网络模型,探讨了网络结构对识别效果的影响。实验显示,即使不包含卷积层,仅使用简单的全连接层也能达到高精度。比较了不同配置如去除Dropout层、替换激活函数和简化网络结构后的训练结果,发现Dropout层并非决定性因素,而网络的非线性部分对模型性能有显著影响。此外,由于AIStudio环境的CUDA版本限制,无法充分利用GPU加速训练。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

关键词 paddleMNIST稠密网络

稠密网络
目 录
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  训练的结果

▲ 图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训练结果

▲ 图1.1.2 没有Dropout训练结果

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

▲ 图1.1.3 另一次没有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传递函数

▲ 图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 没有非线性环节训练结果

▲ 图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 单层神经网络识别结果

▲ 图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/104070500.986
784/512+Relu+512/104070500.9185
0.9982
784/512+Sigmoid512/10407050
784/512+512/104070500.9205
784/1078500.9228

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

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

 

  结 ※


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

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

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


● 相关图表链接:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卓晴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值