Вопросы о наборе данных Tensorflow о .shuffle, .batch и .repeat - PullRequest
1 голос
/ 09 июля 2019

У меня был вопрос об использовании batch, repeat и shuffle с tf.Dataset.

Мне не совсем ясно, как используются repeat и shuffle.Я понимаю, что .batch будет диктовать, сколько примеров обучения будет стохастическим градиентным спуском, использование .repeat и .shuffle мне до сих пор не ясно.

Первый вопрос

Даже после просмотра здесь и здесь , .repeat используется для повторения набора данных после выброса tf.errors.OutOfRangeError.Следовательно, в моем коде это означает, что мне больше не нужно реализовывать:

try:
    while True:
        _ = sess.run(self.optimizer)

except tf.errors.OutOfRangeError:
        pass

, потому что .repeat будет автоматически повторять набор данных после его исчерпания?Когда это останавливается?или он никогда не остановится, и вам нужно будет просто выйти из цикла «True» по истечении определенного количества партий (скажем, 1000)?

Второй вопрос

Во-вторых, использование .shuffle не имеет смысла для меня.Означает ли .shuffle.batch(), что я имею, скажем, 100 000 сэмплов, случайно помещаю 1000 в буфер с .shuffle, а затем, скажем, 100 из них с .batch().Насколько я понимаю, следующая партия будет использовать 999 из этих образцов и поместит 1 новый в буфер.Так что, если мои образцы не имеют порядка для них, тогда .shuffle следует избегать всего вместе?И если .batch используется, он все равно будет пакет 100 из этих 999 + 1 в буфере?

Третий вопрос

И, наконец, если я используюотдельный td.dataset объект для тестирования, какой порядок .shuffle.batch() мне следует учитывать?Прямо сейчас я использую:

sess.run(self.test_init)
try:
    while True:
        accuracy_batch = sess.run(self.accuracy)

except tf.errors.OutOfRangeError:
    pass

С:

test_data = self.test_dataset.shuffle(self.batch_size).batch(self.batch_size)

В моем распоряжении более 110 000 учебных примеров, поэтому self.batch_size установит количество образцов, которые я хочу использоватьпроверь мою точностьИтак, если бы я хотел просто протестировать весь набор тестовых данных, я бы не использовал .batch?Но так как он повторяется по всему набору данных с while True, это не имеет значения?С использованием .shuffle я заметил, что мои точности изменились, но без этого они были очень похожи.Это заставляет меня думать, что .shuffle рандомизирует партию и может повторно использовать обучающие примеры?

1 Ответ

0 голосов
/ 09 июля 2019

Первый вопрос:

Это правильно - если вы подаете набор данных, вам больше не нужно ловить OutOfRangeError.

repeat() принимает необязательный аргумент для количества повторений.Это означает, что repeat(10) будет перебирать весь набор данных 10 раз.Если вы решите опустить аргумент, то он будет повторяться бесконечно

Второй вопрос

Shuffle() (если используется) должен вызываться до batch() - мы хотим перемешивать записи, а не пакеты.

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

Если у вас есть что-то вроде

ds.shuffle(1000).batch(100)

, то для возврата одного пакета этот последний шаг повторяется 100 раз (поддерживая буфер в 1000).Пакетирование - это отдельная операция.

Третий вопрос

Обычно мы вообще не тасуем набор теста - только тренировочный набор (Мы оцениваем, используя весь набор тестовв любом случае, верно? Так зачем тасовать?).

Итак, если бы я хотел просто протестировать весь набор тестовых данных, я бы не использовал .batch

Хмм- не так (по крайней мере, не всегда).Вам, безусловно, потребуется использовать пакет, если весь набор тестовых данных не помещается в память - обычное явление.Вы хотели бы протестировать весь набор данных, но запустить числа в управляемых кусочках!

...