我找不到有关如何使用tensorflow中的分发策略进行动态文件加载的文档或示例代码。我看到许多使用keras flow_from_directory的示例,这似乎非常好,因为它依赖于生成器并且可以实时缩放等,因此不需要一次加载成千上万张图像。但是分发策略示例(镜像策略等)都显示了预加载整个数据集,然后使用数据集.from_tensor_slices()并将其加载到strategy.experimental_distribute_dataset()。对于超出内存的大数据,这是不可行的。我试图将上述来自keras的动态加载方法与分布式批处理结合起来,但是似乎没有简单的方法可以将一些flow_from_directory输出转换为与strategy.experimental_distribute_dataset()期望的兼容,因此这两个功能可能与另一个。
通过分布式培训还有其他方法吗?
我可能可以在培训期间手动编码动态文件加载,但是与生成器和流提供的内容相比,这将是非常缓慢且基本的。如果TF2尚未包含此功能以进行分布式培训,我会感到非常惊讶。
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)