【发布时间】:2020-11-07 15:02:42
【问题描述】:
我正在尝试管理一个不适合内存的大型图像数据集,同时需要一些特定的计算。目前,我的代码如下所示:
files = [str(f) for f in self.files]
labels = self.categories
batch_size= 32
dataset = tf.data.Dataset.from_generator(
lambda: zip(files, labels),
output_types=(tf.string, tf.uint8),
output_shapes=(tf.TensorShape([]), tf.TensorShape([]))
)
dataset = dataset.map(
lambda x, y: tf.py_function(_parser, [x, y, category_count], [tf.float32, tf.uint8]),
num_parallel_calls=tf.data.experimental.AUTOTUNE,
deterministic=False)
dataset.cache(filename='/tmp/dataset.tmp')
if mode == tf.estimator.ModeKeys.TRAIN:
dataset = dataset.shuffle(buffer_size=10*batch_size, reshuffle_each_iteration=True)
dataset = dataset.batch(batch_size=batch_size, drop_remainder=False)
if mode == tf.estimator.ModeKeys.TRAIN:
dataset.repeat(None)
else:
dataset.repeat(1)
dataset = dataset.prefetch(tf.data.experimental.AUTOTUNE)
_parser() 函数打开一个图像文件,进行一系列转换,并返回一个张量和一个 1-hot 编码向量。但是,缓存步骤似乎无法正常工作:
- 在第 1 个 epoch 和后续 epoch 之间的计算时间没有显着改善
- 在此过程中未创建缓存文件,尽管交换分区几乎已满 (~90%)
cache() 函数是否只有在内存和交换分区都已满时才创建文件?此外,我希望一次只读取batch_size 文件。但是,似乎在映射步骤中一次读取了所有文件。我应该考虑使用interleave() 与from_generator() 结合使用吗?或者我应该先批量处理文件,然后再映射它们?
【问题讨论】:
标签: tensorflow2.0 tensorflow-datasets