一、开发环境
开发语言 : python 3.6.13
使用框架 :TensorFlow 2.5.0 + Keras 2.5.0
开发工具 :PyCharm 2020.2.2 x64
二、项目目录说明
此次复现的主要代码文件有:
-
simpleDemo.py
参考了书目《Python 深度学习》,是一个最简单的数字识别。
从 Kears 的 datasets 中导入 mnist, 并使用简单的隐藏层进行训练。
-
complexDemo.py
添加多层神经网络的较复杂数字之别。
从 Keras 的 datasets 中导入 mnist,并使用带有均值池化的卷积神经网络方法训练。
-
finalDemo.py
最终的数字识别。
为了验证算法的可行性以及最终的正确性,这里采用了 Kaggle 比赛中 Digit Recognizer 题目所提供的的 mnist 测试集 test.csv 和训练集 train.csv, 并采用带有最大池化的卷积神经网络,以及避免过拟合的方法进行训练。
-
input 文件夹
存放从 finalDemo 中读取的文件,训练集 train.csv 和测试集 test.csv。
-
output 文件夹
存放 finalDemo.py 最终生成的 CSV 文件。
三、代码与算法流程结果分析
首先需要将二维的数据一维化
-
simpleDemo.py
最简单的程序
- 搭建神经网络
- 算法分析
(1)使用 Sequential()函数作为模型。
(2)建立一个有 15 个神经元,并采用 relu 函数作为激活函数的全连接层。这里不使用其他函数的原因为防止梯度弥散。
(3)建立一个有 10 个神经元,并采用 softmax 函数作为激活函数的一个输入层。
-
complexDemo.py
稍复杂的程序
- 搭建神经网络
- 算法分析
使用卷积神经网络进行训练
(1)添加三个卷积层
(2)每个卷积层之间添加了一个均值池化。
(3)添加一个 Flatten 层,用于由卷积层向全连接层过渡。
(4)最后添加一个全连接层
-
finalDemo.py
最终程序
- 搭建神经网络
- 算法分析
同样使用卷积神经网络进行训练
(1)添加四个卷积层
(2)采用两个最大池化层
(3)添加 Dropout 层防止过拟合
(4)添加 Flatten 层,用于由卷积层向全连接层过渡。
(5)添加了梯度下降优化器。
四、结果分析
epochs=50
三个 Demo 均采用 50 个回合进行训练
test_loss, test_accuracy = network.evaluate(test_images, test_labels)
print("test_loss:", test_loss, " test_accuracy:", test_accuracy)
采用 network.evaluate()评估函数输出 测试集损失和测试集准确率,训练集损失以及训练集准确率。
-
simpleDemo.py
可以发现 simpleDemo 的预测准确性并不是很高,仅有 92% 左右。
-
complexDemo.py
预测准确性可以达到 99% 左右,但是仍然存在着过拟合的情况。
-
finalDemo.py
在 Kaggle 提供的测试集和训练集上训练效果较好,测试集上的准确性能够达到 99.55% 左右,最终在 Kaggle 上的效果也证明了此算法较好。