TensorFlow保存模型加载后预测异常、损失暴涨问题求助
解决TensorFlow模型保存后加载评估损失暴涨的问题
核心问题分析
训练完成后模型测试表现正常,但保存再加载后损失值异常飙升,大概率是输入数据分布不一致或模型状态未正确保存/恢复导致,以下是针对性的排查和解决方法:
1. 强制确保数据预处理逻辑完全一致
EfficientNet预训练权重要求输入图像遵循特定的预处理规则(如tf.keras.applications.efficientnet.preprocess_input,将像素值转换为[-1,1]范围),如果训练时应用了该预处理,但测试生成器未同步处理,会直接导致输入分布完全偏离,引发预测崩溃。
- 检查
CustomDataGen的实现,确保训练、验证、测试阶段的图像归一化、尺寸裁剪、通道顺序等逻辑完全一致; - 验证方法:取同一张测试图片,分别输出训练生成器和测试生成器处理后的像素值,确认两者数值范围一致。
2. 排查BatchNormalization层的状态
训练时BatchNormalization会实时更新移动均值和方差,推理时需使用训练好的统计值。如果加载模型后层状态未正确切换到推理模式,可能导致预测异常:
- 加载模型后显式设置推理模式:
model = tf.keras.models.load_model("best_model.keras") model.trainable = False # 强制切换到推理模式 model.evaluate(test_generator) - 确认EarlyStopping的
restore_best_weights=True生效:训练结束后,先执行一次model.evaluate(test_generator)验证效果,确认权重为最佳状态后再保存模型。
3. 换用权重保存/加载方式验证
.keras格式保存可能因版本兼容问题丢失部分状态,尝试单独保存权重再加载:
# 训练完成后保存权重 model.save_weights("best_weights.h5") # 加载时先重建模型结构,再加载权重 model = create_model() model.compile(optimizer=Adam(learning_rate=0.001), loss="mse", metrics=['mae']) model.load_weights("best_weights.h5") model.evaluate(test_generator)
也可尝试SavedModel格式保存(文件夹形式):
model.save("best_saved_model") loaded_model = tf.keras.models.load_model("best_saved_model")
4. 验证测试生成器的标签处理
如果训练时对标签做了归一化(如除以某个系数),但测试时生成器未同步还原标签范围,会导致计算损失时数值差距过大:
- 取测试生成器的一个batch,打印标签值,确认其范围与训练时的标签范围一致;
- 检查生成器中是否存在标签缩放、编码的逻辑漏洞。
快速排查步骤
- 对比输入数据:取同一张图片,分别输出训练/测试生成器处理后的像素值,确认分布一致;
- 对比模型权重:保存前和加载后,提取某一层(如最后一个Dense层)的权重,检查是否完全相等:
pre_save_weights = model.layers[-1].get_weights() model.save("best_model.keras") loaded_model = tf.keras.models.load_model("best_model.keras") post_load_weights = loaded_model.layers[-1].get_weights() print(np.array_equal(pre_save_weights[0], post_load_weights[0])) - 单样本预测对比:用保存前后的模型对同一个样本预测,查看输出结果是否一致:
img, label = next(test_generator) pred_pre = model.predict(img[:1], verbose=0) pred_post = loaded_model.predict(img[:1], verbose=0) print(f"保存前预测:{pred_pre},保存后预测:{pred_post},真实标签:{label[:1]}")
内容的提问来源于stack exchange,提问作者Matheus Peixoto
相关产品推荐
相关产品推荐

