0

我已经运行了一个具有 4 个 epoch 并使用early_stopping.

early_stopping = EarlyStopping(monitor='val_loss', mode='min', patience=2, restore_best_weights=True)
history = model.fit(trainX, trainY, validation_data=(testX, testY), epochs=4, callbacks=[early_stopping])

Epoch 1/4
812/812 [==============================] - 68s 13ms/sample - loss: 0.6072 - acc: 0.717 - val_loss: 0.554 - val_acc: 0.7826
Epoch 2/4
812/812 [==============================] - 88s 11ms/sample - loss: 0.5650 - acc: 0.807 - val_loss: 0.527 - val_acc: 0.8157
Epoch 3/4
812/812 [==============================] - 88s 11ms/sample - loss: 0.5456 - acc: 0.830 - val_loss: 0.507 - val_acc: 0.8244
Epoch 4/4
812/812 [==============================] - 51s 9ms/sample - loss: 0.658 - acc: 0.833 - val_loss: 0.449 - val_acc: 0.8110

最高的val_ac对应于第三个纪元,并且是0.8244。但是,该accuracy_score函数将返回最后一个 val_acc 值,即0.8110.

yhat = model.predict_classes(testX)
accuracy = accuracy_score(testY, yhat)

可以在调用时指定 epochpredict_classes以获得最高精度(在这种情况下,对应于第三个 epoch)?

4

1 回答 1

0

看起来提前停止没有被触发,因为您只训练了 4 个 epoch,并且您已将提前停止设置为在 val_loss 没有减少超过两个 epoch 时触发。如果您查看每个 epoch 的 val_loss,您会发现即使在第四个 epoch 时它仍在减少。

简而言之,您的模型只是运行完整的四个 epoch 而不使用提前停止,这就是为什么它使用在 epoch 4 中学习的权重,而不是在val_acc.

要解决此问题,请设置monitor='val_acc'并运行几个 epoch。val_acc仅在 epoch 3 之后才开始减少,因此 earlystopping 最早要到 epoch 5 才会触发。

或者,您可以设置patience=1它只检查一个时代。

于 2021-04-14T13:09:44.083 回答