Модель Keras рано останавливается, даже если условие min_delta не достигнуто

Я тренирую последовательную модель Keras следующим образом. Это для набора данных mnist для 5 чисел. На входе изображения размером 28x28 сглажены, а на выходе получается одна горячая нотация для класса, к которому они принадлежат.

model = keras.Sequential([
keras.layers.InputLayer(input_shape = (784, )),
keras.layers.Dense(32, activation='relu'),
keras.layers.Dense(15, activation='relu'),
keras.layers.Dense(3, activation='relu'),
keras.layers.Dense(5, activation='softmax')

])

optzr = keras.optimizers.SGD(learning_rate=0.001, momentum=0.0, nesterov=False)
es = keras.callbacks.EarlyStopping(monitor='loss', min_delta=0.0001, verbose=2)
model.compile(optimizer=optzr, loss='categorical_crossentropy', metrics=['accuracy'])
out = model.fit(xtrain, ytrain, validation_data=(xval, yval), batch_size=32, verbose=2, epochs=20, callbacks=[es])

При запуске модели вот что получается

Epoch 1/20
356/356 - 2s - loss: 1.7157 - accuracy: 0.1894 - val_loss: 1.6104 - val_accuracy: 0.1997 - 2s/epoch - 5ms/step
Epoch 2/20
356/356 - 1s - loss: 1.6094 - accuracy: 0.1946 - val_loss: 1.6102 - val_accuracy: 0.1997 - 1s/epoch - 3ms/step
Epoch 00002: early stopping

Здесь, несмотря на то, что потери уменьшились более чем на 0,1, модель объявляет выполнение условия для ранней остановки и прекращает обучение.

3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
0
20
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы должны установить patience на 1 в определении обратного вызова. Если вы этого не сделаете, по умолчанию будет 0.

es = keras.callbacks.EarlyStopping(monitor='loss', min_delta=1e-4, verbose=2, patience=1)

Keras реализует Ранняя остановка, сохраняя внутреннюю переменную с именем wait. Эта переменная увеличивается на единицу за эпоху, если производительность не улучшается на min_delta, и сбрасывается на 0 в противном случае. Затем обучение останавливается, если wait больше, чем или равныйpatience.

# Only check after the first epoch.
if self.wait >= self.patience and epoch > 0:
  self.stopped_epoch = epoch
  self.model.stop_training = True

Поскольку patience по умолчанию равен 0, self.wait >= self.patience всегда будет True, как только пройдет первая эпоха (как только epoch > 0).

Чтобы остановиться, как только производительность перестанет улучшаться, вы на самом деле хотите установить patience на 1, а не 0.

Другие вопросы по теме