0

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

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

4

1 回答 1

0

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

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

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

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

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

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

于 2017-05-02T16:31:27.723 回答