我有一个不平凡的输入管道from_generator
非常适合...
dataset = tf.data.Dataset.from_generator(complex_img_label_generator,
(tf.int32, tf.string))
dataset = dataset.batch(64)
iter = dataset.make_one_shot_iterator()
imgs, labels = iter.get_next()
Where complex_img_label_generator
动态生成图像并返回一个代表图像的 numpy 数组(H, W, 3)
图像和一个简单的string
标签。我不能将处理表示为从文件中读取并且tf.image
运营。
我的问题是如何并行化生成器?我如何让 N 个这些生成器在它们自己的线程中运行。
一种想法是使用dataset.map
with num_parallel_calls
处理线程;但地图是在张量上运行的...另一个想法是创建多个生成器,每个生成器都有自己的prefetch
并以某种方式加入它们,但我不知道如何加入 N 个生成器流?
我可以遵循任何典型的例子吗?
原来我可以使用Dataset.map
如果我使生成器超轻量级(仅生成元数据),然后将实际的重型照明移至无状态函数中。这样我就可以将繁重的部分与.map
用一个py_func
.
作品;但感觉有点笨拙...如果能够添加就太好了num_parallel_calls
to from_generator
:)
def pure_numpy_and_pil_complex_calculation(metadata, label):
# some complex pil and numpy work nothing to do with tf
...
dataset = tf.data.Dataset.from_generator(lightweight_generator,
output_types=(tf.string, # metadata
tf.string)) # label
def wrapped_complex_calulation(metadata, label):
return tf.py_func(func = pure_numpy_and_pil_complex_calculation,
inp = (metadata, label),
Tout = (tf.uint8, # (H,W,3) img
tf.string)) # label
dataset = dataset.map(wrapped_complex_calulation,
num_parallel_calls=8)
dataset = dataset.batch(64)
iter = dataset.make_one_shot_iterator()
imgs, labels = iter.get_next()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)