Показать прогресс проверки модели с помощью Keras model.fit () - PullRequest
1 голос
/ 11 февраля 2020

Я обучаю модель CNN, используя tf.keras, проходя обучение и проверку генераторов следующим образом:

model.fit(
    x=training_data_generator,
    validation_data=validation_data_generator,
    epochs=n_epochs,
    use_multiprocessing=False,
    max_queue_size=100,
    workers=50
)

Генераторы основаны на tf.keras.Sequence.

Проблема в том, что мой набор данных огромен. Обучение на одну эпоху занимает около дня (несмотря на обучение на двух GPU Titan RTX), а проверка после каждой эпохи занимает несколько часов.

Во время обучения я вижу отображаемый прогресс, но во время проверки все, что я вижу, - последнее снимок индикатора хода обучения:

130339/130340 [==============================] - 147432s 1s/step

до тех пор, пока проверка не закончится и, наконец, я увижу свою точность проверки, потери и т. д. c.

Is Есть ли способ отобразить индикатор выполнения для проверки?

Я думаю сделать что-то вроде этого:

for epoch in range(n_epochs):
    model.fit(
        x=training_data_generator,
        epochs=1,
        use_multiprocessing=False,
        max_queue_size=100,
        workers=50
    )
    validation_results = model.evaluate(
        x=validation_data_generator,
        use_multiprocessing=False,
        max_queue_size=100,
        workers=50
    )
    print(validation_results)

Другой вариант, который я рассматривал, - это создать собственный обратный вызов это проверяет модель on_epoch_end, но это кажется очень нестандартным.

Есть ли лучший подход к этому?

1 Ответ

0 голосов
/ 23 апреля 2020

Вы можете установить steps_per_epoch в методе подгонки.
На основании документации : Общее количество шагов (партий образцов) до объявления одной эпохи законченной и начала следующей эпохи. При обучении с входными тензорами, такими как тензоры данных TensorFlow, значение по умолчанию Нет равно количеству выборок в вашем наборе данных, разделенному на размер пакета, или 1, если это невозможно определить. Если x является набором данных tf.data, а значение steps_per_epoch равно None, эпоха будет работать до тех пор, пока не будет исчерпан входной набор данных. Этот аргумент не поддерживается для входных данных массива.

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

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

history = model.fit(x_train, y_train,
                    batch_size=2,
                    epochs=30,
                    steps_per_epoch=1000,
                    # We pass some validation for
                    # monitoring validation loss and metrics
                    # at the end of each epoch
                    validation_data=(x_val, y_val)) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...