首页 > 解决方案 > 图像分类 CNN 使用 ModelCheckpoint 保存最佳参数

问题描述

我正在用 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 的结果如下:

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

我的第一个问题是因为 mode.fit 会保留最后一个 epoch 结果,但我最后一个 epoch 结果不是最好的(epoch 4/16 是基于 min val_loss 的最佳结果)

因此,我想知道如何使用 epoch 4/16 参数构建模型?

注意:我已经保存了模型。

我意识到如果我在 model.fit 中添加 ModelCheckpoing,那么 min val_loss 可能会被保存。但是,因为我运行代码需要很长时间,所以我认为是否可以直接从我保存的模型中提取 min val_loss 结果而无需再次运行代码?

我的第二个问题是我不明白 ModelCheckpoint 是如何工作的,因为我的理解是 ModelCheckpoint 将在最佳时期停止。

如果我有一个如下所示的 ModelCheckpoint:

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

如果 epoch 是 16 并且 min val_loss 发生在 epoch 4/16,那么使用 ModelCheckpoing 将在 epoch 4/16 停止运行代码并保存参数。但是它不运行 5 到 16 的剩余时间,它怎么知道 4 是最好的呢?或者实际上,使用 ModelCehckpoint,代码仍然会运行 16 个 epoch 并只保存最好的一个(epoch 4)?

谢谢!!

标签: machine-learningconv-neural-network

解决方案


ModelCheckpoint 不会停止训练。在每个 epoch 之后,它会将结果与当前最好的结果进行比较,并根据此文档代码在两者之间选择最好的,然后您只需重新加载保存的模型即可获得最佳权重。


推荐阅读