我要从TensorFlow开始了。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)例如,我遭受了以下损失:
0.024675447或0.030844312当batch_size == 2,num_epochs == 2 0.020562874或0.030844312当batch_size == 4,num_epochs == 2 0.015422156或0.030844312当batch_size == 4,num_epochs == 1
这种现象正常吗?我不明白背后的原则。
同样的情况发生在没有再培训的情况下,就像在next_batch中一样。运行以下单元格时:
# 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
他们(和他们的平均水平)一直在变化。
发布于 2017-05-02 16:31:27
这是很正常的,甚至在许多报纸上都有报道。
首先要注意的是,你是从随机初始化的权重开始的。如果你训练了很多次,你会发现你的结果的平均值和方差,在常见的分类问题上往往有很多的精度差异。这是非常正常的训练多次和选择最好的结果。您应该意识到,这样做会使您的模型适合您的测试数据(您选择的最好的测试数据可能只是在特定的测试数据上获得了幸运,而没有承诺它也会推广到其他未见的数据)。这就是为什么您使用列车/验证/测试数据。对train数据进行培训,使用多次训练迭代来验证validation数据上的参数,然后只在不超过一个迭代中使用的test数据上发布结果。
您还注意到不同批处理大小的差异。我在自己的实验中发现,批次大小实际上是一个正则化器。当我有大量的数据并且没有过度拟合的问题时,当我尝试不同的批次大小时,最好的结果来自于大批大小。然而,当我有很少的数据和更多的需要规范采摘,较低的批次大小往往会产生更好的结果。原因是:在优化过程中,较小的批处理会导致更多的随机性,使得避免局部最小值变得更容易,而较大的批处理大小在逼近真正的梯度时做得更好(您更有可能在每一步都朝着正确的方向前进)。
这个问题被利用的一种方式:你可以找到描述投票技术的学术论文,在这里人们会多次训练一个神经网络,并把每一个神经网络当作一张选票,这些都做得很好。再往前走一步,你可能会选择犯不同错误的网络来获得最好的网络集合。
请注意,在MNIST手写数据集上列出的最佳结果之一是一个由35名投票决定的卷积神经网络组成的委员会。
http://yann.lecun.com/exdb/mnist/
https://stackoverflow.com/questions/43742281
复制相似问题