При добавлении шага .cache()
в мой конвейер набора данных последующие эпохи обучения по-прежнему загружают данные из сетевого хранилища.
У меня есть набор данных в сетевом хранилище. Я хочу кэшировать его, но не повторять: эпоха обучения должна проходить через весь набор данных. Вот мой конвейер построения набора данных:
return tf.data.Dataset.list_files(
file_pattern
).interleave(
tf.data.TFRecordDataset,
num_parallel_calls=tf.data.experimental.AUTOTUNE
).shuffle(
buffer_size=2048
).batch(
batch_size=2048,
drop_remainder=True,
).cache(
).map(
map_func=_parse_example_batch,
num_parallel_calls=tf.data.experimental.AUTOTUNE
).prefetch(
buffer_size=32
)
Если я использую его как есть, набор данных загружается в каждую эпоху. Чтобы этого избежать, я должен добавить в конвейер шаг .repeat()
и использовать ключевое слово steps_per_epoch
функции model.fit
. Однако мне неизвестен размер полного набора данных, поэтому я не могу передать правильное значение steps_per_epoch
.
Как правильно кэшировать и использовать набор данных неизвестного размера?
Спасибо.
Редактировать
Читая некоторый код TF, я (повторно) обнаружил _7 _. Кажется, это именно то, что я ищу, то есть повторять несколько раз по одному и тому же набору данных (используя кеш после первой итерации). Однако это устарело и больше не является частью основного API в TF2.
Инструкция по обновлению состоит в том, чтобы вручную перебрать набор данных с помощью for ... in dataset
. Разве это не то, что делает функция keras.Model.fit
? Должен ли я писать цикл обучения вручную, чтобы получить преимущества кеширования?
Добрый.