我正在尝试实现一个程序来测试 GPU 设备上的 Tensorflow 性能。
数据测试是MNIST数据,使用多层感知器(神经网络)进行监督训练。
我跟着这个简单的例子 http://gist.github.com/nishidy/8176548ecf37b8fab5c028aab8776b8f但我将性能批量梯度的数量更改为10000
for i in range(10000) :
batch_xs, batch_ys = mnist.train.next_batch(100)
sess.run(train_step,feed_dict={x : batch_xs, y_ : batch_ys})
if i % 500 == 0:
print(i)
最终,当我使用此代码检查预测准确性时
correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction,"float"))
print(sess.run(accuracy,feed_dict={x:mnist.test.images,y_:mnist.test.labels}))
print(tf.convert_to_tensor(mnist.test.images).get_shape())
事实证明,CPU 和 GPU 的准确率不同:GPU 返回的准确率约为 0.9xx,而 CPU 仅返回 0.3xx。
有谁知道原因吗?或者为什么会发生这个问题?
造成这种行为的主要原因有两个(除了错误之外)。
数值稳定性
事实证明,数字相加并不完全像看起来那么容易。假设我想将一万亿个 2 加在一起。正确答案是二万亿。但是,如果您在字长仅为(例如 32 位)的机器上以浮点形式将它们加在一起,一段时间后,您的答案将陷入较小的值。原因是一段时间后,您添加的 2 低于浮点和尾数的最小位。
这类问题在数值计算中比比皆是,这种特殊的差异在 TensorFlow 中是已知的(1 https://github.com/tensorflow/tensorflow/issues/5527,2 https://github.com/tensorflow/tensorflow/issues/3775,仅举几例)。您可能正在看到这种效果。
初始条件
训练神经网络是一个随机过程,因此,它取决于您的初始条件。有时,特别是如果你的超参数没有调整得很好,你的网络会陷入一个糟糕的局部最小值附近,最终你会得到平庸的行为。调整优化器参数(或者更好,使用像 Adam 这样的自适应方法)可能会有所帮助。
当然,尽管如此,这是一个相当大的差异,所以我会仔细检查你的结果,然后再将其归咎于底层数学包或运气不好。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)