Я пытаюсь управлять большим набором данных изображений, который не помещается в памяти, но требует определенных вычислений. В настоящее время мой код выглядит так:
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-й эпохой и последующими не наблюдается.
- Во время процесса не создается файл кеша, хотя раздел подкачки почти заполнен (~ 90%)
Создает ли функция cache()
файл только тогда, когда и память, и раздел подкачки заполнены? Более того, я ожидаю, что буду читать только batch_size
файла за раз. Однако кажется, что все файлы читаются сразу на этапе сопоставления. Стоит ли вместо этого использовать interleave()
в сочетании с from_generator()
? Или, может быть, мне сначала нужно сгруппировать файлы, а затем сопоставить их?