Как правильно использовать tf.data для обучения моделей Keras в tenorflow v2? - PullRequest
0 голосов
/ 12 мая 2019

Мне неясно, как оптимально использовать tf.data для обучения моделей Keras в tenorflow v2:

Я выбрал следующий подход:

dataset = tf.data.TFRecordDataset("filename.tfrecords").shuffle(total_size)
validation_size = int(validation_size_split_ratio * total_size)

validation_dataset = dataset.take(validation_size)
validation_dataset = validation_dataset.map(preprocess_function, num_parallel_calls=tf.data.experimental.AUTOTUNE)
validation_dataset = validation_dataset.shuffle(validation_size)
# validation_dataset = validation_dataset.cache()
# validation_dataset = validation_dataset.repeat()
validation_dataset = validation_dataset.batch(batch_size)
validation_dataset = validation_dataset.prefetch(buffer_size=tf.data.experimental.AUTOTUNE)

train_dataset = dataset.skip(validation_size)
train_dataset = train_dataset.map(preprocess_function, num_parallel_calls=tf.data.experimental.AUTOTUNE)
train_dataset = train_dataset.shuffle(total_size - validation_size)
# train_dataset = train_dataset.repeat()
train_dataset = train_dataset.batch(batch_size)
train_dataset = train_dataset.prefetch(buffer_size=tf.data.experimental.AUTOTUNE)

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

training_history = model.fit(train_dataset, validation_data=validation_dataset, epochs=epochs)

, в этом случае каждая эпоха будет соответствовать новому проходу через весь объект набора данных.В качестве альтернативы, мы могли бы раскомментировать приведенные выше «повторные» утверждения, а затем обучить модель следующим образом:

training_history = model.fit(train_dataset, steps_per_epoch=total_size // batch_size, epochs=epochs, validation_data=validation_dataset, validation_steps=500)

Какой оптимальный подход и почему?Должны ли мы использовать повторяющиеся операции, как во втором подходе.На практике я обнаружил, что первый подход имеет лучшее время для тренировки ... но тогда, когда нужно использовать операцию "повторить".Кажется также, что когда Keras заканчивает обучение эпохам, а затем запускает набор проверки, наступает долгая пауза.Я буквально вижу снижение использования графического процессора с 95% до 0 ... какие-либо предложения по этому поводу?Спасибо!

Используя первый подход, описанный выше, я также вижу это сообщение после каждой эпохи:

Filling up shuffle buffer (this may take a while)

Нужно ли заполнять буфер перемешивания после каждой эпохи?

и я также вижу это, чего я не понимаю:

Encountered a stop event that was not preceded by a start event.

В частности, я вижу, что использование графического процессора снизилось до 0 после этого сообщения

...