简 介: 通过PaddlePaddle构造的简单神经网络对于MNIST数据库进行实验,可以看到使用普通的稠密网络,便可以达到很高的识别效果。训练结果存在一定的随机性。这取决于训练其实的条件。由于在Paddle下, AI Studio加载GPU版本的训练,但AI Studio提供环境CUDA的版本过低。还无法正常进行加速训练。
关键词
: paddle,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 训练结果
将前面的训练结果总结如下:
网络结构 | 参数个数 | 训练精度 |
---|---|---|
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的版本过低。还无法正常进行加速训练。
● 相关图表链接: