【问题标题】:Multiple executions of the evaluation gives different losses in TensorFlow多次执行评估会在 TensorFlow 中产生不同的损失
【发布时间】:2017-09-30 05:40:41
【问题描述】:

我开始使用 TensorFlow。 https://www.tensorflow.org/get_started/

当我多次评估以了解如何提供数据时, 我发现损失会随着执行而变化。

eval_input_fn = tf.contrib.learn.io.numpy_input_fn({"x":x}, y, batch_size=4,
                                          num_epochs=1)
estimator.evaluate(input_fn = eval_input_fn)

例如,我有以下损失:

当 batch_size == 2, num_epochs == 2 时为 0.024675447 或 0.030844312

当 batch_size == 4、num_epochs == 2 时为 0.020562874 或 0.030844312

当 batch_size == 4、num_epochs == 1 时为 0.015422156 或 0.030844312

这种现象正常吗? 我不明白它背后的原理。

---添加以下内容

当我使用 next_batch 和 eval() 而不像 https://www.tensorflow.org/get_started/mnist/pros 那样重新训练时,也会发生同样的事情。当我运行以下单元格时:

# mnist.test.labels.shape: (10000, 10)
for i in range(10):
    batch = mnist.test.next_batch(1000)
    print("test accuracy %g"%accuracy.eval(feed_dict={
        x: batch[0], y_: batch[1], keep_prob: 1.0}))

我明白了

一)

测试准确度 0.99

测试准确度 0.997

测试精度 0.986

测试准确度 0.993

测试精度 0.994

测试准确度 0.993

测试精度 0.995

测试精度 0.995

测试准确度 0.99

测试准确度 0.99

b)

测试准确度 0.99

测试准确度 0.997

测试准确度 0.989

测试精度 0.992

测试准确度 0.993

测试精度 0.992

测试精度 0.994

测试准确度 0.993

测试准确度 0.993

测试准确度 0.99

他们(和他们的平均水平)不断变化。

【问题讨论】:

    标签: testing tensorflow regression evaluation loss


    【解决方案1】:

    这很正常,甚至在许多论文中都被利用了。

    首先要注意的是,您从随机初始化的权重开始。如果您训练多次,您会发现结果的均值和方差,通常是常见分类问题中的许多准确度差异点。多次训练并选择最好的结果是很正常的。您应该意识到,这样做会使您的模型过度拟合您的测试数据(您选择的最佳模型可能只是在该特定测试数据上很幸运,但没有保证它也会推广到其他看不见的数据)。这就是您使用训练/验证/测试数据的原因。在 train 数据上进行训练,通过多次训练迭代验证 validation 数据上的参数,然后仅在超过 1 次迭代中未使用的 test 数据上发布结果。

    您还注意到不同批次大小的差异。我在自己的实验中发现批量大小实际上是一个正则化器。在我有大量数据并且没有过度拟合问题的情况下,当我尝试不同的批量大小时,最好的结果来自大批量大小。但是,当我的数据很少并且需要规范化时,选择较小的批量往往会产生更好的结果。原因:较小的批量会在优化过程中产生更多的随机性,从而更容易摆脱局部最小值,较大的批量可以更好地逼近真实梯度(您更有可能在每一步都朝着正确的方向前进)。

    利用此问题的一种方式: 你可以找到描述投票技术的学术论文,人们将多次训练一个神经网络并将它们中的每一个作为一个单一的投票,这些通常做得很好。更进一步,您可能会选择犯独特不同错误的网络以获得最佳的网络集合。

    请注意,LeCun 页面上列出的 MNIST 手写数据集的最佳结果之一是由 35 个投票卷积神经网络组成的委员会。

    http://yann.lecun.com/exdb/mnist/

    【讨论】:

    • 感谢您的回答,但我认为存在误解。我将评估阶段与拟合阶段分开,因此只执行一次训练。只有这条线 estimator.evaluate(input_fn = eval_input_fn) 被执行多次,然后无论我给出的批量大小或时期数,我都会有不同的损失。实际上,我不明白为什么我们在评估中有批量大小和时期数。
    猜你喜欢
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    • 1970-01-01
    • 2018-03-10
    • 2019-04-28
    • 2018-06-11
    相关资源
    最近更新 更多