首页 > 解决方案 > 当我使用 model.evaluate() 时,为什么训练数据的结果不同?

问题描述

我使用 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]
)

model.fit()最佳模型在 epoch 27 之后保存。这是上次保存模型时的输出部分:

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()输出不同呢?

标签: pythontensorflowmachine-learningkerasdeep-learning

解决方案


推荐阅读