多次执行评估会在TensorFlow中产生不同的损失

时间:2017-05-02 15:53:10

标签: testing tensorflow regression evaluation loss

我开始使用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

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

---以下添加了

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

# 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}))

我得到了

A)

测试精度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

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

1 个答案:

答案 0 :(得分:0)

这是非常正常的,甚至在许多论文中被利用。

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

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

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

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

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