我有多个文件,我希望以微小的块消费,直到EOF使用tf.data
,而不是每个文件使用tf.read_file
一次(因为某些文件比其他文件大得多)。
我不知道如何将管道子进程用作TensorFlow操作(tf.py_func
以某种方式?),而list_files
中的数据集元素仅在图执行期间已知,因此以下内容并非如此39;工作:
def stream(path, bytesize=2048):
args = f'my_program {path}'
with subprocess.Popen(args, stdout=subprocess.PIPE) as pipe:
while True:
buffer = pipe.stdout.read(bytesize)
yield np.frombuffer(buffer)
if len(buffer) < bytesize:
break
def map_func(path):
generator = functools.partial(stream, path)
dataset = tf.data.Dataset.from_generator(generator, tf.float32)
return dataset
dataset = (
tf.data.Dataset
.list_files('data/*')
.interleave(map_func, batch_size)
.batch(batch_size)
)
是否有某种方法可以将数据集元素的值转换为tf.data.Dataset.from_generator
所期望的迭代值,或者我是否采用了错误的方法?
相关:Can the map function supplied to `tf.data.Dataset.from_generator(...)` resolve a tensor object?
答案 0 :(得分:0)
TensorFlow刚刚获得tf.data中参数化生成器的支持!
def map_func(path):
dataset = tf.data.Dataset.from_generator(stream, tf.float32, args=(path,))
return dataset
pip install tf-nightly
或tf-nightly-gpu
尝试以上操作。