【问题标题】:Tensorflow network diverges if reading/preprocessing is done on cpu如果在 cpu 上完成读取/预处理,Tensorflow 网络会发散
【发布时间】: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


【解决方案1】:

我遇到了一个非常相似的问题。在我的例子中,我将图像转换操作固定在 GPU 上,但数据是从 CPU 上的队列中提供的。对我来说,将操作固定到 GPU 是一个错误,所以我使用 with tf.device('/cpu:0') 将它们固定到 CPU,我的数值不稳定问题就消失了。

值得注意的是,我之前也在 GPU 上运行了这些图像预处理步骤,但没有使用队列来加载数据。我只是通过占位符将数据直接提供给 GPU,一切运行良好。

只有当我开始使用队列并从独立线程加载这些队列时,我才开始看到这个问题(当我没有从单独的线程加载队列时,我能够按顺序使用队列)。

我还没有关于发生了什么的确切答案,但确保数据和图像预处理操作始终放置在同一设备上似乎确实非常关键。

【讨论】:

    猜你喜欢
    • 2018-05-26
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    • 2018-06-18
    • 1970-01-01
    • 2020-07-20
    • 2018-10-10
    • 2011-01-17
    相关资源
    最近更新 更多