python - 如果在 cpu 上完成读取/预处理,Tensorflow 网络会发散

标签 python tensorflow

我有一些代码可以从张量记录中读取图像,对其进行预处理(裁剪、应用随机色调/饱和度等,全部通过 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 上时,这很有效并导致网络融合。但是,现在这是我代码的瓶颈,我想通过将此 block 包装在 with tf.device('/cpu:0'):。有了这个我有更快的迭代(大约 1/5),但网络在大约 10 次迭代后发散,导致 NaN 丢失。目视检查在 tensorboard 中创建的样本时,没有明显差异。

为什么 cpu 和 gpu 上的收敛行为不同?我该如何进一步调查这种奇怪的行为?

最佳答案

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

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

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

对于发生的事情,我还没有确切的答案,但确保数据和图像预处理操作一致地放置在同一台设备上似乎确实非常关键。

关于python - 如果在 cpu 上完成读取/预处理,Tensorflow 网络会发散,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34920998/

相关文章:

python - 获取softmax层之前CNN最后一层获得的向量

python - 如何对排序文件进行分组并保留组顺序

python - 为什么python的itertools排列有很多重复的元素?

Python 无法正确排序 Unicode

linux - Tensorflow 结果具有以下形式 <tf.Tensor 'Add:0' shape=() dtype=int32>

python - 在Tensorflow中,LSTMCell中状态元组(c,h)返回的 'output'和 'h'有什么区别?

python - 通过@property中的字段列表获取相关对象的值

python - 尝试使用 python 安装 cassandra-driver 时出错

python - Tensorflow Keras 输出样式

tensorflow - tensorflow hub : Table not initialized 的问题