CNN классификации изображений сохраняет лучшие параметры с помощью ModelCheckpoint - PullRequest
0 голосов
/ 03 августа 2020

Я делаю классификацию изображений с помощью CNN.

Вот моя модель:

model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(200, 200, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))


model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(4, activation='softmax'))

model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy'])
history = model.fit(x_train,y_train,epochs=16,batch_size=64,validation_data=(x_val,y_val))

Результаты эпохи выглядят так:

Epoch 1/16
416/416 [==============================] - 832s 2s/step - loss: 0.7742 - accuracy: 0.8689 - val_loss: 0.5149 - val_accuracy: 0.8451
Epoch 2/16
416/416 [==============================] - 825s 2s/step - loss: 0.5608 - accuracy: 0.8585 - val_loss: 0.3776 - val_accuracy: 0.8808
Epoch 3/16
416/416 [==============================] - 775s 2s/step - loss: 0.1926 - accuracy: 0.9338 - val_loss: 0.3328 - val_accuracy: 0.9066
Epoch 4/16
416/416 [==============================] - 587s 1s/step - loss: 0.0984 - accuracy: 0.9650 - val_loss: 0.3163 - val_accuracy: 0.9388
Epoch 5/16
416/416 [==============================] - 578s 1s/step - loss: 0.0606 - accuracy: 0.9798 - val_loss: 0.3584 - val_accuracy: 0.9357
Epoch 6/16
416/416 [==============================] - 511s 1s/step - loss: 0.0457 - accuracy: 0.9860 - val_loss: 0.5067 - val_accuracy: 0.9360
Epoch 7/16
416/416 [==============================] - 476s 1s/step - loss: 0.3649 - accuracy: 0.8912 - val_loss: 0.4446 - val_accuracy: 0.8645
Epoch 8/16
416/416 [==============================] - 476s 1s/step - loss: 0.3108 - accuracy: 0.9006 - val_loss: 0.6096 - val_accuracy: 0.8681
Epoch 9/16
416/416 [==============================] - 477s 1s/step - loss: 0.2397 - accuracy: 0.9158 - val_loss: 0.4061 - val_accuracy: 0.9042
Epoch 10/16
416/416 [==============================] - 502s 1s/step - loss: 0.1334 - accuracy: 0.9532 - val_loss: 0.3673 - val_accuracy: 0.9281
Epoch 11/16
416/416 [==============================] - 478s 1s/step - loss: 0.2787 - accuracy: 0.9184 - val_loss: 0.6745 - val_accuracy: 0.9039
Epoch 12/16
416/416 [==============================] - 481s 1s/step - loss: 0.7476 - accuracy: 0.8649 - val_loss: 0.4643 - val_accuracy: 0.8777
Epoch 13/16
416/416 [==============================] - 488s 1s/step - loss: 0.2187 - accuracy: 0.9271 - val_loss: 0.3347 - val_accuracy: 0.9102
Epoch 14/16
416/416 [==============================] - 483s 1s/step - loss: 4.0347 - accuracy: 0.9171 - val_loss: 0.6267 - val_accuracy: 0.7980
Epoch 15/16
416/416 [==============================] - 476s 1s/step - loss: 0.5838 - accuracy: 0.8095 - val_loss: 0.4481 - val_accuracy: 0.8663
Epoch 16/16
416/416 [==============================] - 492s 1s/step - loss: 0.4916 - accuracy: 0.8520 - val_loss: 1.0406 - val_accuracy: 0.6113

My Первый вопрос заключается в том, что, поскольку mode.fit сохранит результат последней эпохи, но мой результат последней эпохи не самый лучший (эпоха 4/16 - лучший результат на основе min val_loss)

Следовательно, мне интересно как я могу построить модель, используя параметр эпохи 4/16?

Примечание: я сохранил модель.

Я понимаю, что если я добавлю ModelCheckpoing в model.fit, то min val_loss можно сохранить. Однако, поскольку на запуск кода у меня уходит много времени, я думаю, можно ли извлечь результат min val_loss непосредственно из модели, которую я сохранил, без повторного запуска кода?

Мой второй вопрос: не понимаю, как работает ModelCheckpoint, поскольку я понимаю, что ModelCheckpoint остановится в лучшую эпоху.

если у меня есть ModelCheckpoint, как показано ниже:

mc = ModelCheckpoint('best_model.h5', monitor='val_loss', mode='min', save_best_only=True)

Если эпоха 16 и min val_loss произошло в эпоху 4/16, затем использование ModelCheckpoing остановит выполнение кода в эпоху 4/16 и сохранит параметры. Но он не работает с остальной частью эпох с 5 по 16, откуда ему знать, что эпоха 4 является лучшей? или на самом деле, используя ModelCehckpoint, код по-прежнему будет запускать 16 эпох и просто сохранять лучшую (эпоху 4)?

Спасибо !!

1 Ответ

0 голосов
/ 03 августа 2020

ModelCheckpoint не останавливает обучение. После каждой эпохи он сравнивает результат с текущим лучшим и выбирает лучший из двух в соответствии с этим кодом документа , тогда вам нужно только перезагрузить сохраненную модель, чтобы получить этот лучший вес.

...