阅读多个图像,将它们处理为一个图像并通过模型

时间:2017-04-05 21:56:06

标签: python tensorflow keras

有没有办法在Tensorflow中构建以下图表:

  1. 使用TF队列和TF图像阅读器加载一些N图像(N可以因每组而异)。
  2. 处理这些图像以获得固定大小的图像并准备批次。
  3. 通过CNN模型提供这些批次
  4. 一些问题/信息:

    1. 我正在尝试在TF中构建数据加载部分而不是Python函数和feed_dict。我想,与python和feed_dict相比,TF数据加载可以更快地训练模型。是对的吗 ?
    2. 构建小N(N <5)的图很容易。为N中的每个图像定义独占节点并对其进行处理。 (工作)
    3. 我可以使用TF&#34; while_loop&#34;构建这样的功能来读取N个图像??
    4. Keras是否支持此类功能?
    5. 感谢您的建议。

1 个答案:

答案 0 :(得分:2)

我上周刚做过这个!这太棒了,我用tf.map_fntf.cond之类的东西学到了很多关于张量流的知识。它起作用了。

本周我只是重构了我的代码以消除所有这些,因为这是一个坏主意。

我遇到的问题:

  1. 在tensorflow中进行预处理是很麻烦的。做正确的TDD肯定会对你有所帮助,但仍然不会特别漂亮或易于调试。
  2. 将预处理卸载到CPU并离开GPU(假设你正在使用它)进行训练。更好的方法是只有一个队列并从专用于预处理任务的线程/类加载它。在numpy / scikit / scikit-image中完成工作将更容易配置和测试。
  3. 我以为自己太聪明了,把我所有的代码都集中到一个模型中。但是预处理的复杂性意味着我的模型很难迭代,它必须很快就是严格的代码 - 例如,当我添加我的测试集评估时,预处理要求略有不同。突然间,我不得不在我的模型中添加大部分条件代码,而且很快就会变得难看。
  4. 话虽这么说,我的预处理步骤可能比你的更复杂。如果您坚持简单的事情,只需应用一些简单的图像预处理步骤,那么您可能更容易采用这种方法。

    具体回答您的问题:

    1. 我知道,队列不会比feed_dict带来任何好处。您仍然遇到将数据从CPU上的TF队列移动到GPU内存的问题,每次迭代都与feed_dict相同,如果您关心该主题,请观看此线程,GPU队列即将到来:https://github.com/tensorflow/tensorflow/issues/7679

    2. 您应该从队列中dequeue_many,将其作为批处理。如果您需要对每个单独的图像执行某些操作,请使用tf.map_fn,这将删除第一个维度并将单个3D图像传递到指定的函数。但是当你走这条路时,请注意我上面的警告 - 你可能会更乐意在一个单独的线程中这样做。

    3. 已在#2中回答,使用tf.map_fn批量迭代多个图像。它实际上很容易使用。

    4. 我不认识Keras。