聊一聊model.fit()与model.evaluate()指标值不同的坑
提示:最近在使用tensorflow.keras进行回归模型的训练,遇到了一点问题如下。
一、fit()训练过程的值与model.evaluate()的值相差很大
1.部分训练过程如下
代码如下(示例):
Epoch 63/100
12182/12182 - 7s - loss: 2218672.4850 - mse: 2218671.5000 - RMSE: 1445.7142 - mae: 1102.8094 - val_loss: 6981241.4427 - val_mse: 6981241.5000 - val_RMSE: 2340.7271 - val_mae: 2175.6528
Epoch 64/100
12182/12182 - 5s - loss: 2061400.8190 - mse: 2061399.8750 - RMSE: 1398.1644 - mae: 1070.7137 - val_loss: 62601254.5411 - val_mse: 62601256.0000 - val_RMSE: 7257.8809 - val_mae: 7141.2192
Epoch 65/100
12182/12182 - 5s - loss: 2187660.4353 - mse: 2187660.5000 - RMSE: 1435.8937 - mae: 1098.1290 - val_loss: 330649278.9154 - val_mse: 330649248.0000 - val_RMSE: 16415.5371 - val_mae: 16445.8516
Epoch 66/100
12182/12182 - 7s - loss: 2053245.3059 - mse: 2053245.1250 - RMSE: 1385.2153 - mae: 1059.9854 - val_loss: 9686156.0783 - val_mse: 9686157.0000 - val_RMSE: 2942.7732 - val_mae: 2712.3650
Epoch 67/100
12182/12182 - 8s - loss: 2172847.3127 - mse: 2172847.0000 - RMSE: 1424.4069 - mae: 1089.1759 - val_loss: 69302169.7549 - val_mse: 69302168.0000 - val_RMSE: 7887.9683 - val_mae: 7707.4131
Epoch 68/100
12182/12182 - 8s - loss: 2085539.7928 - mse: 2085540.3750 - RMSE: 1399.4995 - mae: 1062.7623 - val_loss: 135029237.0560 - val_mse: 135029264.0000 - val_RMSE: 10862.0469 - val_mae: 10757.3652
Epoch 69/100
12182/12182 - 7s - loss: 2048575.7949 - mse: 2048575.7500 - RMSE: 1390.2236 - mae: 1068.1414 - val_loss: 79998649.2958 - val_mse: 79998656.0000 - val_RMSE: 7897.0049 - val_mae: 7833.5410
Wall time: 7min 26s
2.采用model.evaluate()的结果
这里由于权重的覆盖,所以最终模型是最后一步:
scores = Model.evaluate(x_train,y_train, verbose=2, batch_size=32)
12182/1 - 1s - loss: 4461230.6247 - mse: 8907411.0000 - RMSE: 2501.3462 - mae: 2289.9673
下面是测试集:
scores = Model.evaluate(x_test,y_test, verbose=2, batch_size=32)
2375/1 - 0s - loss: 41310416.8979 - mse: 79998656.0000 - RMSE: 7897.0049 - mae: 7833.5410
可以看出测试集上没有变化,这是因为其不参与梯度更新,但是训练集的差距“非常之大”
总结
请教了大神后了解到:
1.模型的BatchNormalization,Dropout,LayerNormalization等优化手段只在fit时,对训练集有用;
2.在进行evaluate()的时候,这些优化都会失效,因此,再次进行evaluate(x_train,y_train),就算添加了batchsize,也不能达到相同的评估计算结果。