3

我正在尝试实现一个程序来测试 GPU 设备上的 Tensorflow 性能。数据测试是 MNIST 数据,使用多层感知器(神经网络)进行监督训练。我遵循了这个简单的示例,但我将性能批次梯度的数量更改为 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 时。有谁知道原因?或者为什么会发生这个问题?

4

1 回答 1

7

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

数值稳定性

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

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

初始状态

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

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

于 2017-04-06T19:41:52.097 回答