感谢这个博客和老师的指导书=-=
https://www.cnblogs.com/qiuhlee/p/9866222.html#_caption_0
另外此代码仅限运行于tensorflow_1.9及以下,不能在tensorflow_2.0
一、Mnist数据载入
1.Mnist数据集下载
2.使用tensorflow分别载入Mnist数据的训练集和测试集,代码截图如下:
1 | #****************导入mnist的训练集和测试集**************** |
3.将一张训练集中的手写数字图片可视化结果如下:
二、设置CNN结构
使用tensorflow设置CNN结构识别手写数字图片,代码截图如下:
1 | #把x更改为4维张量,第1维代表样本数量,第2维和第3维代表图像长宽, 第4维代表图像通道数 |
三、CNN的训练与测试
1.更改学习度,采用梯度下降法训练CNN并测试,代码截图如下:
本算法利用AdamOptimizer优化器,学习度设置为0.0001,即:1e-41
2
3
4
5
6
7
8
9
10
11
12# *************** 训练和评估模型 *************** #
# 为训练过程指定最小化误差用的损失函数,即目标类别和预测类别之间的交叉熵
cross_entropy = -tf.reduce_sum(y*tf.log(y_conv))
# 使用反向传播,利用优化器使损失函数最小化
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)#计算梯度
# 检测我们的预测是否真实标签匹配(索引位置一样表示匹配)
# tf.argmax(y_conv,dimension), 返回最大数值的下标 通常和tf.equal()一起使用,计算模型准确度
# dimension=0 按列找 dimension=1 按行找
correct_prediction = tf.equal(tf.argmax(y_conv,1), tf.argmax(y,1))
# 统计测试准确率, 将correct_prediction的布尔值转换为浮点数来代表对、错,并取平均值。
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
saver = tf.train.Saver() # 定义saver
在训练1000轮,每100轮打印一次的情况下,训练结果:1
2
3
4
5
6
7
8
9
10第0轮,训练准确率为14%
第100轮,训练准确率为84%
第200轮,训练准确率为94%
第300轮,训练准确率为96%
第400轮,训练准确率为94%
第500轮,训练准确率为94%
第600轮,训练准确率为98%
第700轮,训练准确率为94%
第800轮,训练准确率为96%
第900轮,训练准确率为96%
2.在测试集下测试之后的输出结果截图如下:
在测试集当中,我们选取最后weight与bias调整结果,drop设置不损失,导入全部的测试集,即:5000张。1
2test_accuracy = accuracy.eval(feed_dict={x: mnist_test_image, y: mnist_test_labels, keep_prob: 1.0})
print("测试集的准确率为%g%%"%(test_accuracy*100))
测试的最后结果为:1
测试集的准确率为96.33%
四、模型优化
在本网络当中的测试集为直接采用weight与bias最后的值,总而言之,这些值还仅仅只是个局部变量,当我们要测试其他的数据时,需要从新训练网络,故设计一个文本存储功能,把最后的训练结果存在上面。1
2
3
4#可以先定义
saver = tf.train.Saver() # 定义saver
#然后保存
saver.save(sess, './save/model') #模型储存位置
附录(代码):
1 | #coding="utf-8" |