【问题标题】:Preprocess a Tensorflow tensor in Numpy在 Numpy 中预处理 Tensorflow 张量
【发布时间】:2016-04-28 19:40:07
【问题描述】:

我在 Tensorflow 中设置了一个 CNN,我在其中使用 TFRecordReader 读取我的数据。它工作得很好,但我想做比tf.image 函数提供的更多的预处理和数据增强。我特别想做一些随机缩放。

是否可以在 Numpy 中处理 Tensorflow 张量?或者我是否需要删除 TFRecordReader,而是在 Numpy 中进行所有预处理并使用 feed_dict 提供数据?我怀疑训练图像时 feed_dict 方法很慢,但我可能错了?

【问题讨论】:

  • feed_dictpy_func 使用单线程 memcpy 在 TF 和 Python 运行时之间复制数据,因此您可能会获得 2GB/s 的传输速率,这对于像 ImageNet 这样的数据集来说不应该是瓶颈.缓慢更可能发生在自定义预处理阶段

标签: python numpy tensorflow


【解决方案1】:

如果您可以创建一个自定义 I/O 管道,该管道使用一个或多个线程从 TensorFlow 获取中间结果,应用任意 Python 逻辑,然后将它们输入队列以进行后续处理。生成的程序会稍微复杂一些,但我建议您查看threading and queues HOWTO 以获取有关如何开始的信息。


如果您install from source,有一个实验性功能可能会使这更容易。

如果您已经使用 TensorFlow ops 构建了预处理管道,添加一些自定义 Python 代码的最简单方法是使用 tf.py_func() 运算符,该运算符采用 Tensor 对象的列表,以及映射一个对象的 Python 函数一个或多个 NumPy 数组到一个或多个 NumPy 数组。

例如,假设您有这样的管道:

reader = tf.TFRecordReader(...)
image_t = tf.image.decode_png(tf.parse_single_example(reader.read(), ...))

...您可以使用tf.py_func() 应用一些自定义 NumPy 处理,如下所示:

from scipy import ndimage
def preprocess(array):
  # `array` is a NumPy array containing.
  return ndimage.rotate(array, 45)

image_t = tf.py_func(preprocess, [image_t], [tf.float32])

【讨论】:

  • 谢谢!仅针对其他读者:为了能够进行进一步处理,例如通过tf.train.shuffle_batch,我必须重塑tf.py_func 的结果,这是有道理的。
  • 嗯,现在我在提取函数的结果时遇到了一些麻烦。我把它称为n1, n2, n3 = tf.py_func(get_triplet, [orig_tensor, truth_tensor], [tf.float32, tf.float32, tf.float32]),我检查了它是否进入了函数,它返回了3个float32 NumPy数组,但是在tf.py_func完成之前我得到了错误tensorflow/python/lib/core/py_func.cc:299] Unimplemented: Unsupported numpy type 17。有什么想法吗?
  • 好吧,我想我明白了,我需要从我的 Python 函数中返回 [n1, n2, n3]
  • @mrry 如果队列中有多个线程工作,py_func 是否会多线程执行?鉴于 Python 有一个全局解释器锁
  • @MinLin 如果图中有多个 py_func() 操作,它们可能会被不同的 TensorFlow 线程同时调度,但每个线程都会在调用 Python 之前获取 GIL。如果您调用释放 GIL (such as NumPy) 的 API,在这种情况下您仍可能获得并行加速。
猜你喜欢
  • 2020-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-09
  • 1970-01-01
  • 2021-07-22
  • 2019-06-17
相关资源
最近更新 更多