我开始使用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
他们(和他们的平均值)不断变化。
答案 0 :(得分:0)
这是非常正常的,甚至在许多论文中被利用。
首先要注意的是,你是从随机初始化的权重开始的。如果你训练很多次,你会发现你的结果的均值和方差,通常在常见的分类问题上有很多准确度差异。多次训练并选择最佳结果是很正常的。您应该知道,这样做会使您的模型过度拟合您的测试数据(您选择的是那个可能在该特定测试数据上获得幸运的最佳模型,并且没有承诺它会推广到其他看不见的数据)。这就是您使用训练/验证/测试数据的原因。训练train
数据,通过许多训练迭代验证validation
数据上的参数,然后仅发布未在1次以上迭代中使用的test
数据的结果。
您还注意到不同批次大小的差异。我在自己的实验中发现,批量大小实际上是一个正规化器。如果我有大量数据并且没有过度拟合问题,当我尝试不同的批量大小时,最佳结果来自大批量。然而,当我的数据很少而且需要更加规范化时,较低的批量大小往往会产生更好的结果。原因是:较小的批量大小会在优化过程中产生更多随机性,从而更容易逃避局部最小值,较大的批量大小可以更好地逼近真实梯度(您更有可能在每个步骤中朝着正确的方向前进)。
利用此问题的一种方法: 您可以找到描述投票技巧的学术论文,人们将多次训练神经网络,并将每一个作为单一投票,这些通常都做得非常好。更进一步,你可能会选择能产生独特错误的网络,以获得最佳的网络集合。
请注意,在LeCun页面上列出的MNIST手写数据集的最佳结果中,有一个由35个投票卷积神经网络组成的委员会。