【发布时间】:2016-01-21 10:20:50
【问题描述】:
我有一些代码可以从张量记录中读取图像,对它们进行预处理(裁剪、应用随机色调/饱和度等,全部通过 tensorflows 自己的方法),然后使用 shuffle_batch_join 生成批次。
with tf.variable_scope('dump_reader'):
all_files = glob.glob(dump_file + '*')
filename_queue = tf.train.string_input_producer(all_files, num_epochs=epochs)
example_list = [read_tensor_record(filename_queue, image_size)
for _ in range(read_threads)]
return tf.train.shuffle_batch_join(example_list, batch_size=batch_size,
capacity=min_queue_size + batch_size * 16,
min_after_dequeue=min_queue_size)
这很有效,并且在将所有操作放在 gpu 上时会导致网络收敛。但是,这现在是我的代码的瓶颈,我想通过将此块包装在 with tf.device('/cpu:0'): 中来将其放在 cpu 上来加速它。有了这个,我有更快的迭代(大约 1/5),但网络在大约 10 次迭代后发散,导致 NaN 丢失。目视检查张量板中创建的样本时,没有明显差异。
为什么 cpu 和 gpu 的收敛行为不同?我该如何进一步调查这种奇怪的行为?
【问题讨论】:
-
这很奇怪。我的猜测是其中一个图像处理操作的 GPU 和 CPU 实现存在错误(或不一致)。为了进行调查,我建议:(1) 使用
tf.Session(config=tf.ConfigProto(log_device_placement=True))构建您的会话,以查看在工作版本中哪些操作实际上安排在 GPU 上,然后有选择地将它们移动到 CPU 以查看哪些操作可能是造成这种情况的原因。 -
@mrry 好主意,我会这样做,并在我找到一些东西后在 github 上打开一个问题。
-
你有没有设法本地化这个问题?我遇到了类似的问题(使用 TF 0.8.0),我的管道在 GPU 上运行良好,但在 CPU 上它开始非常频繁地生成 NaN。
标签: python tensorflow