使用自定义损失函数时Keras绘制Epoch MSE遇KeyError的解决方法
解决Keras绘制训练MSE时出现KeyError: 'mse'的问题
首先看你代码里的一个明显问题:你用model.compile(...)配置了损失和指标,但训练的是model3.fit(...)——这两个模型对象如果不是同一个实例的话,model3根本没设置metrics=['mse'],它的训练历史里自然不会有'mse'这个键,这大概率是报错的根源!
先修正这个笔误:确保你编译和训练的是同一个模型,比如把编译语句改成model3.compile(loss=new_loss2, metrics=['mse'], optimizer=opt),或者统一模型变量名。
如果修正后还是出现这个错误,那就是Keras版本的指标键名差异导致的:在TensorFlow集成的Keras(也就是现在常用的tf.keras)中,当你指定metrics=['mse']时,训练历史里的键名其实是全称'mean_squared_error',而不是简写的'mse'。旧版独立的Keras可能用'mse'作为键名,但新版TF-Keras会使用指标的标准名称。
你可以先打印训练历史的所有键,确认正确的名称:
print(hist.history.keys())
输出应该类似这样:
dict_keys(['loss', 'mean_squared_error', 'val_loss', 'val_mean_squared_error'])
接下来就可以用正确的键名绘制MSE曲线了,比如同时绘制训练集和验证集的MSE:
import matplotlib.pyplot as plt # 绘制训练集MSE plt.plot(hist.history['mean_squared_error']) # 绘制验证集MSE(如果有验证集的话) plt.plot(hist.history['val_mean_squared_error']) plt.title('Model Mean Squared Error') plt.ylabel('MSE') plt.xlabel('Epoch') plt.legend(['Train', 'Validation'], loc='upper right') plt.show()
总结一下报错的两个核心原因:
- 编译和训练的模型对象不一致,导致指标未被配置
- TF-Keras中指标简写会被映射为全称键名,而非简写
内容的提问来源于stack exchange,提问作者Hajar Elhammouti
相关产品推荐
相关产品推荐

