Tensorflow相同的代码,但从CPU设备到GPU设备获得不同的结果

时间:2017-04-05 04:18:14

标签: python tensorflow gpu cpu multi-layer

我正在尝试实现一个程序来测试GPU设备上的Tensorflow性能。 数据测试是MNIST数据,使用多层感知器(神经网络)进行监督训练。 我跟着this simple example,但我将性能批量渐变的数量更改为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时。 有谁知道原因?或者为什么会出现这个问题?

1 个答案:

答案 0 :(得分:5)

此类行为有两个主要原因(除了错误)。

数值稳定性

事实证明,添加数字并不像看起来那么容易。假设我想在一起增加一万亿。正确的答案是两万亿。但是如果你在一个只有字数大小的机器上以浮点形式将它们加在一起,比如32位,过了一会儿,你的答案就会卡在一个较小的值上。原因是,经过一段时间后,你要添加的2是低于浮点和的尾数的最小位。

这些问题在数值计算中比比皆是,而且这种特殊的差异在TensorFlow中已知(12,仅举几例)。你可能会看到这种效果。

初始条件

训练神经网络是一个随机过程,因此,它取决于您的初始条件。有时候,特别是如果您的超参数调整得不好,您的网络将会陷入可怜的本地最小值,并且您最终会遇到平庸的行为。调整优化器参数(或更好,使用像Adam这样的自适应方法)可能会有帮助。

当然,尽管如此,这是一个相当大的差异,所以在将其归咎于基础数学包或运气不好之前,我会仔细检查你的结果。