是否可以在分布式培训(镜像策略)中使用keras flow_from_directory?

问题描述 投票:1回答:1

我找不到有关如何使用tensorflow中的分发策略进行动态文件加载的文档或示例代码。我看到许多使用keras flow_from_directory的示例,这似乎非常好,因为它依赖于生成器并且可以实时缩放等,因此不需要一次加载成千上万张图像。但是分发策略示例(镜像策略等)都显示了预加载整个数据集,然后使用数据集.from_tensor_slices()并将其加载到strategy.experimental_distribute_dataset()。对于超出内存的大数据,这是不可行的。我试图将上述来自keras的动态加载方法与分布式批处理结合起来,但是似乎没有简单的方法可以将一些flow_from_directory输出转换为与strategy.experimental_distribute_dataset()期望的兼容,因此这两个功能可能与另一个。

通过分布式培训还有其他方法吗?

我可能可以在培训期间手动编码动态文件加载,但是与生成器和流提供的内容相比,这将是非常缓慢且基本的。如果TF2尚未包含此功能以进行分布式培训,我会感到非常惊讶。

tensorflow distributed-computing
1个回答
0
投票

dataset.from_tensor_slices()不会立即将整个数据加载到您的内存中。它可能看起来像那样,但是如果配置正确,它会使用批处理,预取,缓存等。

看我如何使用tf.data管道的小例子。 map函数在训练或预取过程中而不是在开始时执行。因此,并非所有数据都同时加载到您的内存中。

def parse_img(label, path):
    img = tf.io.read_file(path)
    img = tf.image.decode_png(img, channels=0, dtype=tf.uint8)
    img = tf.image.convert_image_dtype(img, tf.float32)
    return img, label

ds_train = tf.data.Dataset.from_tensor_slices((list_labels_train,
                                               list_paths_train))

ds_train = ds_train.map(parse_img, num_parallel_calls=AUTOTUNE)
ds_train = ds_train.cache()
ds_train = ds_train.shuffle(len(list_paths_train), seed=42,
                            reshuffle_each_iteration=True)
ds_train = ds_train.batch(BATCH_SIZE)
ds_train = ds_train.repeat()
ds_train = ds_train.prefetch(buffer_size=AUTOTUNE)
© www.soinside.com 2019 - 2024. All rights reserved.