Беда с ранней остановкой в ​​tf.keras - PullRequest
1 голос
/ 11 марта 2020

Я тренирую свою первую перенесенную модель обучения (ууу!), И у меня возникают проблемы с тем, чтобы заставить модель прекратить обучение, когда потеря проверки не изменилась более чем на 0,1 более чем за 3 эпохи.

Вот соответствующий блок кода

early_stopping = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=3, min_delta = 0.1)

model.compile(optimizer='adam',
          loss='sparse_categorical_crossentropy',
          metrics=['accuracy'],
          callbacks=[early_stopping])

EPOCHS = 100

history = model.fit(training_batches,
                epochs=EPOCHS,
                validation_data=validation_batches)

А вот несколько журналов:

    Epoch 32/100
    155/155 [==============================] - 21s 134ms/step - loss: 0.0042 - accuracy: 0.9998 - val_loss: 0.3407 - val_accuracy: 0.9012
    Epoch 33/100
    155/155 [==============================] - 21s 133ms/step - loss: 0.0040 - accuracy: 0.9998 - val_loss: 0.3443 - val_accuracy: 0.9000
    Epoch 34/100
    155/155 [==============================] - 21s 134ms/step - loss: 0.0037 - accuracy: 0.9998 - val_loss: 0.3393 - val_accuracy: 0.9019
    Epoch 35/100
    155/155 [==============================] - 21s 135ms/step - loss: 0.0031 - accuracy: 1.0000 - val_loss: 0.3396 - val_accuracy: 0.9000
    Epoch 36/100
    155/155 [==============================] - 21s 134ms/step - loss: 0.0028 - accuracy: 1.0000 - val_loss: 0.3390 - val_accuracy: 0.9000
    Epoch 37/100
    155/155 [==============================] - 21s 133ms/step - loss: 0.0026 - accuracy: 1.0000 - val_loss: 0.3386 - val_accuracy: 0.9025
    Epoch 38/100
    155/155 [==============================] - 21s 133ms/step - loss: 0.0024 - accuracy: 1.0000 - val_loss: 0.3386 - val_accuracy: 0.8994
    Epoch 39/100
    155/155 [==============================] - 21s 133ms/step - loss: 0.0022 - accuracy: 1.0000 - val_loss: 0.3386 - val_accuracy: 0.9019

Вопросы:

  • Почему тренировка не остановилась в Эпохе 37, когда у меня установлен обратный вызов EarlyStopping для мониторинга val_loss?
  • Могу ли я сделать более сложные обратные вызовы EarlyStopping? Что-то вроде «If val_accuracy> 0.90 && val_loss не изменилось более чем на 0,1 в 3 эпохах». Если я могу, могу ли я получить ссылку на учебник?

Ответы [ 2 ]

1 голос
/ 11 марта 2020

РЕДАКТИРОВАТЬ

Не работает, потому что вы поместили параметр callback в неправильный вызов метода. (и на самом деле я получил недопустимую ошибку аргумента при подборе модели с callbacks, переданным compile. Поэтому я не уверен, почему ваша модель скомпилирована без проблем.)

Она должна быть внутри вашей fit метод, как показано ниже. Обратите внимание, что в конфигурации ранней остановки рекомендуется установить verbose = 1, чтобы распечатать журнал ранней остановки.

early_stopping = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=3, min_delta = 0.1, verbose = 1)

model.compile(optimizer='adam',
          loss='sparse_categorical_crossentropy',
          metrics=['accuracy'])

EPOCHS = 100

history = model.fit(training_batches,
                epochs=EPOCHS,
                callbacks=[early_stopping], # call back should be here!
                validation_data=validation_batches)

По второму вопросу возможен пользовательский обратный вызов, вы можете обратиться к пример из документации здесь . По сути, вы должны определить свою логику раннего останова c в on_epoch_end.

Кстати, я думаю, вам не следует рано останавливаться на нескольких метриках, выберите тот, который имеет значение (то есть метрику c что вы оптимизируете - val_accuracy) и просто следите за этим. Есть даже источники, которые препятствуют ранней остановке, и вместо этого рассматривают эпоху как настраиваемый гиперпараметр. Смотрите эту ветку обсуждения на Reddit , что я нашел полезным.

0 голосов
/ 11 марта 2020

Уменьшите patience=3 до менее, например 1 или 2 и посмотрите, что произойдет.

Он говорит Керасу, как сильно вы хотите попробовать. терпение = небольшое число скажет Керасу прекратить тренировку рано. С другой стороны, если вы используете большое число, он скажет Keras подождать, пока не будет достигнута значительная точность

терпение: количество эпох, которые произвели контролируемое количество без улучшений, после чего обучение будет остановлено , Количества проверки могут быть произведены не для каждой эпохи, если частота проверки (model.fit (validation_freq = 5)) больше единицы

...