【问题标题】:Tensorflow same code but get different result from CPU device to GPU deviceTensorflow 相同的代码,但从 CPU 设备到 GPU 设备得到不同的结果
【发布时间】:2017-04-05 04:18:13
【问题描述】:

我正在尝试实现一个程序来测试 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。 有谁知道原因?或者为什么会发生这个问题?

【问题讨论】:

  • TensorBoard 可用于调试此问题。

标签: python tensorflow gpu cpu multi-layer


【解决方案1】:

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

数值稳定性

事实证明,添加数字并不像看起来那么容易。假设我想将一万亿个 2 相加。正确答案是两万亿。但是,如果你在一台机器上以浮点形式将这些加在一起,字长仅为 32 位,那么一段时间后,你的答案将停留在一个较小的值上。原因是一段时间后,您添加的 2 低于浮点和的尾数的最小位。

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

初始条件

训练神经网络是一个随机过程,因此,它取决于您的初始条件。有时,特别是如果你的超参数没有很好地调整,你的网络会卡在一个糟糕的局部最小值附近,你最终会得到平庸的行为。调整优化器参数(或者更好的是,使用像 Adam 这样的自适应方法)可能会有所帮助。

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

【讨论】:

  • 我同意你的第一句话,非常有用。我认为这个问题通常不会经常发生。然而事实证明我的问题是初始化不正确
  • 为了获得可重现的结果,可以在代码中输入np.random.seed(1) from tensorflow import set_random_seed set_random_seed(2)
  • 数值稳定性!我明白了!
猜你喜欢
  • 1970-01-01
  • 2015-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-06
  • 2017-05-21
相关资源
最近更新 更多