作者:手机用户2502914387 | 来源:互联网 | 2023-09-13 13:59
本文是《TensorFlow从浅入深》系列之第7篇
TensorFlow从浅入深系列之一 -- 教你如何设置学习率(指数衰减法)
TensorFlow从浅入深系列之二 -- 教你通过思维导图深度理解深层神经网络
TensorFlow从浅入深系列之三 -- 教你如何对MNIST手写识别
TensorFlow从浅入深系列之四 -- 教你深入理解过拟合问题(正则化)
TensorFlow从浅入深系列之五 -- 教你详解滑动平均模型
TensorFlow从浅入深系列之六 -- 教你深入理解经典损失函数(交叉熵、均方误差)
在(TensorFlow从浅入深系列之三 -- 教你如何对MNIST手写识别)使用神经网络解决MNIST问题的程序中,开始的位置设置了初始学习率、学习率衰减率、隐藏层节点数、迭代轮数等7中不同的参数。一般情况下,配置神经网络的这些参数都是需要通过实验来调整的。
因为神经网络是对未知数据提供判断,所以我们不能直接通过模型在测试数据上的效果来选择参数,这样容易导致神经网络模型过度拟合测试数据,从而失去对未知数据的预判能力。
所以,为了顾及模型在未知数据上的效果,需要保证测试数据在训练过程中是不可见的。
因此,为了评测神经网络模型在不同参数下的效果,一般会从训练数据中抽取一部分作为验证数据。使用验证数据评判不同参数取值下的表现。有时也可以采用交叉验证的方式来验证模型效果,但是采用交叉验证会花费大量时间。所以在海里数据的情况下,一般更多地采用验证数据集的形式来评判模型的效果。
在(TensorFlow从浅入深系列之三 -- 教你如何对MNIST手写识别)加入以下代码,得到每1000轮迭代后,使用滑动平均的模型在验证数据和测试数据上的正确率。
# 计算滑动平均模型在测试数据和验证数据上的正确率
validate_acc = sess.run(accuracy, feed_dict=validate_feed)
test_acc = sess.run(accuracy, feed_dict=test_feed)# 输出正确率信息。
print('After %d training step(s), validation accuracy using average model is %g, ' 'test accuracy using average model is %g' % (i, validate_acc, test_acc))
图5-2给出了通过上面代码得到的每1000轮滑动平均模型在不同数据集上的正确率曲线。其中灰色曲线表示随着迭代轮数的增加,模型在验证数据上的正确率;黑色的曲线表示在测试数据上的正确率。从图中可以看出,虽然这两条曲线不会完全重合,但是这两条曲线的趋势基本一样,而且他们的相关系数大于0.999。说明,在MNIST问题上,完全可以通过模型在验证数据上的表现来判断一个模型的优劣。
以上结论是针对MNIST数据集的,对于其他问题,需要具体问题具体分析。一般来说,验证数据分布越接近测试数据分布,模型在验证数据上的表现可以体现模型在测试数据上的表现。神经网络在验证数据上的效果来选取模型的参数是一个可行的方案。