Лучшие веса модели в нейронной сети при ранней остановке
Я обучаю модель с помощью следующего кода
model=Sequential()
model.add(Dense(100, activation='relu',input_shape=(n_cols,)))
model.add(Dense(100, activation='relu'))
model.add(Dense(2,activation='softmax'))
model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy'])
early_stopping_monitor = EarlyStopping(patience=3)
model.fit(X_train_np,target,validation_split=0.3, epochs=100, callbacks=[early_stopping_monitor])
Это сделано для остановки обучения, если значение параметра val_loss: не улучшится после 3 эпох. Результат показан ниже. Мой вопрос: остановится ли модель на весах эпохи 8 или 7. Поскольку производительность в эпоху 8 снизилась, она остановилась. Но модель продвинулась на 1 эпоху с плохим показателем производительности, поскольку более ранняя (эпоха 7) была лучше. Надо ли сейчас переучивать модель с 7 эпохами?
Train on 623 samples, validate on 268 samples
Epoch 1/100
623/623 [==============================] - 1s 1ms/step - loss: 4.0365 - accuracy: 0.5923 - val_loss: 1.2208 - val_accuracy: 0.6231
Epoch 2/100
623/623 [==============================] - 0s 114us/step - loss: 1.4412 - accuracy: 0.6356 - val_loss: 0.7193 - val_accuracy: 0.7015
Epoch 3/100
623/623 [==============================] - 0s 103us/step - loss: 1.4335 - accuracy: 0.6260 - val_loss: 1.3778 - val_accuracy: 0.7201
Epoch 4/100
623/623 [==============================] - 0s 106us/step - loss: 3.5732 - accuracy: 0.6324 - val_loss: 2.7310 - val_accuracy: 0.6194
Epoch 5/100
623/623 [==============================] - 0s 111us/step - loss: 1.3116 - accuracy: 0.6372 - val_loss: 0.5952 - val_accuracy: 0.7351
Epoch 6/100
623/623 [==============================] - 0s 98us/step - loss: 0.9357 - accuracy: 0.6645 - val_loss: 0.8047 - val_accuracy: 0.6828
Epoch 7/100
623/623 [==============================] - 0s 105us/step - loss: 0.7671 - accuracy: 0.6934 - val_loss: 0.9918 - val_accuracy: 0.6679
Epoch 8/100
623/623 [==============================] - 0s 126us/step - loss: 2.2968 - accuracy: 0.6629 - val_loss: 1.7789 - val_accuracy: 0.7425
2 ответа
Использовать restore_best_weights
с monitor
значение установлено на целевое количество. Таким образом, лучшие веса будут восстановлены после тренировки автоматически.
early_stopping_monitor = EarlyStopping(patience=3,
monitor='val_loss', # assuming it's val_loss
restore_best_weights=True )
Из документов:
restore_best_weights: восстанавливать ли веса модели из эпохи с лучшим значением отслеживаемой величины (
'val_loss'
Вот). ЕслиFalse
, используются веса модели, полученные на последнем шаге обучения (по умолчаниюFalse
).
Весь код, который я разместил, находится в TensorFlow 2.0.
- путь к файлу: строка, которая может иметь параметры форматирования, такие как номер эпохи. Например, это обычный путь к файлу (веса.{Epoch:02d}-{val_loss:.2f}.hdf5)
- монитор: (обычно это 'val_loss' или 'val_accuracy')
- режим: должен ли он минимизировать или максимизировать значение монитора (обычно либо 'min', либо 'max')
- save_best_only: если установлено значение true, то модель будет сохраняться только для текущей эпохи, если это значения метрики, лучше, чем то, что было раньше. Однако, если вы установите save_best_only в значение false, он будет сохранять каждую модель после каждой эпохи (независимо от того, была ли эта модель лучше предыдущих моделей или нет).
Код
model=Sequential()
model.add(Dense(100, activation='relu',input_shape=(n_cols,)))
model.add(Dense(100, activation='relu'))
model.add(Dense(2,activation='softmax'))
model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy'])
fname = "weights.{epoch:02d}-{val_loss:.2f}.hdf5"
checkpoint = tf.keras.callbacks.ModelCheckpoint(fname, monitor="val_loss",mode="min", save_best_only=True, verbose=1)
model.fit(X_train_np,target,validation_split=0.3, epochs=100, callbacks=[checkpoint])