Python Numpy中张量流张量的预处理

Python Numpy中张量流张量的预处理,python,numpy,tensorflow,Python,Numpy,Tensorflow,我在Tensorflow建立了一个CNN,在那里我用TFRecordReader读取数据。它工作得很好,但我想做一些比tf.image函数提供的更多的预处理和数据扩充。我特别想做一些随机缩放 可以在Numpy中处理张量流张量吗?或者我需要删除TFRecordReader,而是使用feed_dict在Numpy和feed数据中进行所有预处理?我怀疑feed_dict方法在对图像进行训练时速度很慢,但我可能错了?如果您可以创建一个自定义I/O管道,使用一个或多个线程从TensorFlow获取中间结果

我在Tensorflow建立了一个CNN,在那里我用TFRecordReader读取数据。它工作得很好,但我想做一些比
tf.image
函数提供的更多的预处理和数据扩充。我特别想做一些随机缩放


可以在Numpy中处理张量流张量吗?或者我需要删除TFRecordReader,而是使用feed_dict在Numpy和feed数据中进行所有预处理?我怀疑feed_dict方法在对图像进行训练时速度很慢,但我可能错了?

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


如果您愿意的话,有一个实验性的功能可能会使这更容易

如果已经使用TensorFlow ops构建了预处理管道,那么添加一些自定义Python代码的最简单方法是使用操作符,该操作符获取
Tensor
对象的列表,以及将一个或多个NumPy数组映射到一个或多个NumPy数组的Python函数

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

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])

feed_dict
py_func
使用单线程
memcpy
在TF和Python运行时之间复制数据,因此您可以获得2GB/s的传输速率,这不应该成为像ImageNet这样的数据集的瓶颈。这种缓慢更可能发生在定制的预处理阶段!仅针对其他读者:为了能够进行进一步的处理,例如通过
tf.train.shuffle\u batch
,我必须重塑
tf.py\u func
的结果,这很有意义。嗯,现在我在提取函数的结果时遇到了一些问题。我把它叫做
n1,n2,n3=tf.py\u func(get\u三元组,[orig\u张量,truth\u张量],[tf.float32,tf.float32,tf.float32])
,我检查了它是否进入函数,它返回3个float32 NumPy数组,但是,在
tf.py_func
完成之前,我得到了错误
tensorflow/python/lib/core/py_func.cc:299]未实现:不支持的numpy类型17
。有什么想法吗?嗯,我想我已经解决了,我需要从Python函数返回
[n1,n2,n3]
。@mrry如果有多个线程为队列工作,py_func会被多线程执行吗?给定Python有一个全局解释器lock@MinLin如果图中有多个
py_func()
操作,它们可能由不同的TensorFlow线程并发调度,但每个线程将在调用Python之前获取GIL。如果调用一个释放GIL()的API,在这种情况下仍然可能得到并行加速。