使用tf.data

时间:2018-05-02 09:09:46

标签: python tensorflow

我有多个文件,我希望以微小的块消费,直到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?

1 个答案:

答案 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-nightlytf-nightly-gpu尝试以上操作。