TensorFlow加载预训练.h5模型报错:输入形状不匹配求助
问题原因与解决方法
1. 预测输入形状不匹配报错
原因
模型训练时接收的是4D张量输入:(batch_size, 256, 256, 3),其中None代表任意批量大小。而你传入model.predict的输入形状为(32, 256, 3),说明:
- 若为单张图片输入,缺少了批量维度(正确形状应为
(1,256,256,3)); - 若为批量图片输入,每个样本的形状错误(应为
(256,256,3),实际却为(256,3),缺失宽度维度)。
另外,自定义dice_coeff函数中的Flatten是无效代码(仅写了类名未调用),属于笔误,虽不影响运行但需清理。
解决方法
修正输入形状:
单张图片输入时,先扩展批量维度:import numpy as np # 假设image原始形状为(256,256,3) image_input = np.expand_dims(image, axis=0) # 转换为(1,256,256,3) mask = model.predict(image_input)批量图片输入时,检查每个样本形状是否为
(256,256,3),确保整体输入形状为(N,256,256,3)(N为样本数量)。清理无效代码:删除
dice_coeff函数中的Flatten行。
2. 变量浏览器无法查看加载的模型
原因
- 代码逻辑错误:你注释了
model = load_model(...)语句,直接调用model.load_weights(...)会导致model未定义(除非你之前已定义过同结构模型); - Spyder变量浏览器对Keras模型的显示依赖完整的模型对象初始化,
compile=False可能导致部分元数据未加载,无法被识别; - 变量浏览器未及时刷新,导致加载后的模型未显示。
解决方法
正确加载模型:使用完整的
load_model语句,确保自定义对象全部传入:loaded_model = tf.keras.models.load_model( r'D:\Preprocesamiento\FASE_III\ResdANet_org.h5', custom_objects={'dice_coeff': dice_coeff, 'dice_loss': dice_loss}, compile=False )注意:路径用原始字符串
r''避免转义字符问题,custom_objects需包含所有自定义函数(包括dice_loss)。刷新变量浏览器:加载模型后,点击Spyder变量浏览器的刷新按钮,或重启内核后重新运行代码。
可选:编译后查看:执行
loaded_model.compile(...)后,模型结构更完整,变量浏览器更易识别。
额外注意事项
- 预测结果处理:
model.predict返回的mask是4D张量(如(1,256,256,1)),可视化时需取出单张掩码并压缩多余维度:ax[1].imshow(mask[0].squeeze())
内容的提问来源于stack exchange,提问作者JPSuarezQ
相关产品推荐
相关产品推荐

