使用GPU与CPU进行损耗计算时,我对损耗计算的差异有些困惑。
模型是6层CNN。
从检查点加载模型,并使用相同的数据运行它。先用CPU再用GPU计算损耗。
CPU丢失:0.4687191 GPU丢失:0.46873742
有人可以向我解释为什么这些损失的计算方式不同吗?
#WITH CPU! - testing cpu vs cpu optimizer calculations
import time
tf.reset_default_graph()
new_saver = tf.train.import_meta_graph('./graph/final.meta')
with tf.Session() as sess:
new_saver.restore(sess, tf.train.latest_checkpoint('./tmp'))
optimize = tf.get_default_graph().get_operation_by_name( "optimizer" )
c_loss = sess.run('loss:0', feed_dict={'x:0': x_train[0:128], 'y:0': y_train[0:128], 'is_training:0': True})
print('initial: c_loss', c_loss)
sess.run(optimize, feed_dict={'x:0': x_train[0:128], 'y:0': y_train[0:128], 'is_training:0': True})
c_loss = sess.run('loss:0', feed_dict={'x:0': x_train[0:128], 'y:0': y_train[0:128], 'is_training:0': True})
print('post: c_loss', c_loss)
输出:
首字母:c_loss 0.4687191
发布:c_loss 0.5455321
#WITH GPU! - testing cpu vs gpu optimizer calculations
import time
tf.reset_default_graph()
new_saver = tf.train.import_meta_graph('gdrive/My Drive/graph/final.meta')
with tf.Session() as sess:
new_saver.restore(sess, tf.train.latest_checkpoint('gdrive/My Drive/tmp'))
optimize = tf.get_default_graph().get_operation_by_name( "optimizer" )
c_loss = sess.run('loss:0', feed_dict={'x:0': x_train[0:128], 'y:0': y_train[0:128], 'is_training:0': True})
print('initial: c_loss', c_loss)
sess.run(optimize, feed_dict={'x:0': x_train[0:128], 'y:0': y_train[0:128], 'is_training:0': True})
c_loss = sess.run('loss:0', feed_dict={'x:0': x_train[0:128], 'y:0': y_train[0:128], 'is_training:0': True})
print('post: c_loss', c_loss)
输出:
缩写:c_loss 0.46873742
发布:c_loss 0.5432756
编辑: 也。想补充一点,我用两个不同的CPU会话加载了模型,发现上面的损耗计算是相同的。仅当我使用GPU计算损耗时,它们才会变化。
答案 0 :(得分:0)
如果您重新整理训练模型所依据的数据,它们可能会有所不同。尝试在代码上方修复numpy.random.seed(123)
(但在导入之后),然后禁用混洗,并且损失应该相同。
例如,tensorlayers
迷你批处理生成器允许您将shuffle参数设置为False。
import numpy as np
import tensorlayers as tl
X = np.asarray([['a','a'], ['b','b'], ['c','c'], ['d','d'], ['e','e'], ['f','f']])
y = np.asarray([0,1,2,3,4,5])
for batch in tl.iterate.minibatches(inputs=X, targets=y, batch_size=16, shuffle=False):
print(batch)