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