我使用 keras 训练带有模型检查点的神经网络。这是模型摘要:
Model: "sequential_1"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense_7 (Dense) (None, 128) 2304
_________________________________________________________________
dropout_3 (Dropout) (None, 128) 0
_________________________________________________________________
dense_8 (Dense) (None, 64) 8256
_________________________________________________________________
dropout_4 (Dropout) (None, 64) 0
_________________________________________________________________
dense_9 (Dense) (None, 32) 2080
_________________________________________________________________
dropout_5 (Dropout) (None, 32) 0
_________________________________________________________________
dense_10 (Dense) (None, 16) 528
_________________________________________________________________
dense_11 (Dense) (None, 8) 136
_________________________________________________________________
dense_12 (Dense) (None, 4) 36
_________________________________________________________________
dense_13 (Dense) (None, 1) 5
=================================================================
Total params: 13,345
Trainable params: 13,345
Non-trainable params: 0
_________________________________________________________________
这是训练代码:
history = model.fit(
data['X_train_scaled'], data['y_train'],
validation_data=(data['X_val_scaled'], data['y_val']),
epochs=epochs,
batch_size=batch_size,
verbose=2,
callbacks=[checkpoint, early_stopping]
)
最好的模型在 epoch 27 之后保存。
以下是上次保存模型时 model.fit()
的输出部分:
Epoch 00027: val_loss improved from 0.50037 to 0.49198, saving model to saved-model\best-model
16/16 - 0s - loss: 0.3800 - accuracy: 0.8792 - val_loss: 0.4920 - val_accuracy: 0.8627
当我使用 model.load_weights()
加载保存的模型,然后使用 model.evaluate()
在训练和验证数据上评估模型时,我得到了完全相同的验证数据结果。然而,训练数据的结果总是不同的。
代码:
model.load_weights('saved-model/best-model')
print(model.evaluate(data['X_train_scaled'], data['y_train'])) # Different results
print(model.evaluate(data['X_val_scaled'], data['y_val'])) # Same results
输出:
32/32 [==============================] - 0s 2ms/step - loss: 0.3284 - accuracy: 0.9222
[0.32835641503334045, 0.9221556782722473]
11/11 [==============================] - 0s 3ms/step - loss: 0.4920 - accuracy: 0.8627
[0.4919773042201996, 0.8626865744590759]
那么为什么训练数据的 model.evaluate()
给出的结果与 model.fit()
的输出不同?