Необходимо ли вызывать Dataset.repeat()?

#tensorflow

#тензорный поток

Вопрос:

В руководстве по tensorflow я видел, что набор данных просто перетасован, как

 AUTOTUNE = tf.data.experimental.AUTOTUNE
train_ds = train_ds.cache().shuffle(1000).prefetch(buffer_size=AUTOTUNE)
  

Но я также вижу чужие коды, такие как:

 ds = ds.cache()
ds = ds.repeat() # ds is a dataset 
ds = ds.shuffle(buffer_size=1000)
  

Я предполагаю, что технически набор данных будет использоваться после каждой эпохи обучения и должен быть повторен для загрузки в буфер перемешивания для следующей эпохи.

Но почему первое руководство работает без повтора? Должен ли я вызывать ds repeat явно или нет?

Ответ №1:

Итак, основываясь на документации, repeat определяет, сколько раз выборки могут быть повторены в данном наборе данных.

 dataset = tf.data.Dataset.from_tensor_slices([1, 2, 3])
dataset = dataset.repeat(3)
list(dataset.as_numpy_iterator())
[1,2,3,1,2,3,1,2,3]
  

В идеале в вашем случае вам не придется повторять набор данных. Только если вы хотите просмотреть несколько его выборок, это имеет значение. И в соответствии с вашим shuffle, он просто перетасует набор данных после его повторения. И, пожалуйста, укажите какой-нибудь аргумент или значение в repeat() , не оставляйте его None.

Комментарии:

1. Спасибо, но я не вижу в документации формулировки типа «в данную эпоху или при прохождении обучения»?

2. Я использовал тренировочный проход или эпоху, потому что это в конечном итоге зависит от того, как используется набор данных. Если вы производите перетасовку в каждую эпоху или после нее и не хотите никакого увеличения, вам не нужно будет использовать repeat . И не используйте repeat с пустым значением count, так как он будет продолжать создавать повторяющиеся экземпляры до тех пор, пока размер буфера не будет заполнен. Также я удалю given epoch or training pass , поскольку это может сбивать с толку