2017-04-05 213 views
0

我想实现一个程序来测试GPU设备上的Tensorflow性能。 数据测试是MNIST数据,使用多层感知器(神经网络)进行有监督的训练。 我跟着this simple example但我改变性能批次梯度的数量为10000Tensorflow相同的代码,但从CPU设备获取不同的结果到GPU设备

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。 有谁知道原因?或者为什么会发生这个问题?

+0

TensorBoard可用于调试此问题。 –

回答

3

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

数值稳定性

事实证明,将这些数字并不完全,因为它看起来那么简单。比方说,我想一起增加一万亿2。正确的答案是两万亿。但是,如果您将这些数据以浮点形式添加到只有32位字的机器上,那么过了一段时间后,您的答案会卡住一个较小的值。原因是过了一段时间,你添加的2就低于浮点和的尾数的最小位。

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

初始条件

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

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

+0

我同意你的第一条陈述,非常有用。我认为这个问题通常不会经常发生。 然而事实证明,我的问题是不正确初始化 – Hunter

+0

为了获得可重复的结果,一个可以把 '''np.random.seed(1) 从tensorflow进口set_random_seed set_random_seed(2)''' 代码。 – bio

相关问题