Keras保存Sequential模型报CustomMaskWarning加载后预测错误如何解决
问题根因
- 代码缺少
import tensorflow as tf导入语句,调用tf.keras.applications.ResNet50时会触发未定义错误,同时影响模型序列化逻辑 - 定义ResNet50时
pooling=max写法错误,应为字符串格式的"max",非法参数会导致序列化时配置异常 - 使用HDF5(.h5)格式保存包含预训练基础模型的组合模型时,Keras无法完整序列化ResNet50的内部配置,加载时层参数丢失导致预测结果异常
- 保存时触发的
CustomMaskWarning是因为序列化过程无法正确识别基础模型内部掩码层的配置,加载时配置不全进一步导致输出错误
正确保存与加载方案
方案1:使用TensorFlow SavedModel格式(优先推荐)
SavedModel是TensorFlow官方原生支持的模型格式,会完整保存模型的计算图、结构、权重,无需额外处理自定义对象,兼容性最好:
# 保存模型(路径不需要加.h5后缀,会自动生成对应目录) model.save("/media/TOSHIBA EXT/trained_model/UAV_01_savedmodel") # 加载模型 model = keras.models.load_model("/media/TOSHIBA EXT/trained_model/UAV_01_savedmodel")
方案2:必须使用H5格式的处理方法
首先修正模型定义的两处错误:
# 首先补全导入 import tensorflow as tf # 修正ResNet50的pooling参数 base_model = tf.keras.applications.ResNet50( include_top=False, weights="imagenet", input_shape=(1134,1134,3), pooling="max", )
之后可选择两种加载方式:
方式A:加载时传入自定义对象
# 保存模型 model.save("/media/TOSHIBA EXT/trained_model/UAV_01.h5") # 加载模型,指定custom_objects参数传入ResNet50类 model = keras.models.load_model( "/media/TOSHIBA EXT/trained_model/UAV_01.h5", custom_objects={"ResNet50": tf.keras.applications.ResNet50} )
方式B:结构与权重分开保存(最稳妥)
# 保存阶段:分别存储模型结构和权重 model_json = model.to_json() with open("/media/TOSHIBA EXT/trained_model/model_structure.json", "w") as f: f.write(model_json) model.save_weights("/media/TOSHIBA EXT/trained_model/model_weights.h5") # 加载阶段:先加载结构再加载权重 from tensorflow.keras.models import model_from_json with open("/media/TOSHIBA EXT/trained_model/model_structure.json", "r") as f: loaded_model_json = f.read() model = model_from_json(loaded_model_json, custom_objects={"ResNet50": tf.keras.applications.ResNet50}) model.load_weights("/media/TOSHIBA EXT/trained_model/model_weights.h5")
加载完成后可先调用
model.summary()核对结构与保存前一致,再用之前测试正常的单张图片做预测,验证输出结果是否匹配。
内容的提问来源于stack exchange,提问作者user123
相关产品推荐
相关产品推荐

