You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

加载Keras U-Net模型h5文件后预测输入形状不兼容问题

U-Net模型加载权重后预测报错排查

问题概况

接手公司任务,加载旧项目训练好的U-Net模型,权重已成功加载,但调用predict()时持续报错。模型加载权重后的summary()输出如下:

Model: "model"
__________________________________________________________________________________________________
 Layer (type)                   Output Shape         Param #     Connected to                     
==================================================================================================
 input_1 (InputLayer)           [(None, 640, 512, 1  0           []                               
                                )]                                                                  
                                                                                                    
 conv2d (Conv2D)                (None, 640, 512, 64  640         ['input_1[0][0]']                 
                                )                                                                  
                                                                                                    
 conv2d_1 (Conv2D)              (None, 640, 512, 64  36928       ['conv2d[0][0]']                  
                                )                                                                  
                                                                                                    
 max_pooling2d (MaxPooling2D)   (None, 320, 256, 64  0           ['conv2d_1[0][0]']                
                                )                                                                  
                                                                                                    
 conv2d_2 (Conv2D)              (None, 320, 256, 12  73856       ['max_pooling2d[0][0]']           
                                8)                                                                 
                                                                                                    
 conv2d_3 (Conv2D)              (None, 320, 256, 12  147584      ['conv2d_2[0][0]']                
                                8)                                                                 
                                                                                                    
 max_pooling2d_1 (MaxPooling2D)  (None, 160, 128, 12  0          ['conv2d_3[0][0]']                
                                8)                                                                 
                                                                                                    
 conv2d_4 (Conv2D)              (None, 160, 128, 25  295168      ['max_pooling2d_1[0][0]']         
                                6)                                                                 
                                                                                                    
 conv2d_5 (Conv2D)              (None, 160, 128, 25  590080      ['conv2d_4[0][0]']                
                                6)                                                                 
                                                                                                    
 max_pooling2d_2 (MaxPooling2D)  (None, 80, 64, 256)  0          ['conv2d_5[0][0]']                
                                                                                                    
 conv2d_6 (Conv2D)              (None, 80, 64, 512)  1180160     ['max_pooling2d_2[0][0]']         
                                                                                                    
 conv2d_7 (Conv2D)              (None, 80, 64, 512)  2359808     ['conv2d_6[0][0]']                
                                                                                                    
 max_pooling2d_3 (MaxPooling2D)  (None, 40, 32, 512)  0          ['conv2d_7[0][0]']                
                                                                                                    
 conv2d_8 (Conv2D)              (None, 40, 32, 1024  4719616     ['max_pooling2d_3[0][0]']         
                                )                                                                  
                                                                                                    
 conv2d_9 (Conv2D)              (None, 40, 32, 1024  9438208     ['conv2d_8[0][0]']                
                                )                                                                  
                                                                                                    
 up_sampling2d (UpSampling2D)   (None, 80, 64, 1024  0           ['conv2d_9[0][0]']                
                                )                                                                  
                                                                                                    
 concatenate (Concatenate)      (None, 80, 64, 1536  0           ['up_sampling2d[0][0]',           
                                )                                  'conv2d_7[0][0]']                
                                                                                                    
 conv2d_10 (Conv2D)             (None, 80, 64, 512)  7078400     ['concatenate[0][0]']             
                                                                                                    
 conv2d_11 (Conv2D)             (None, 80, 64, 512)  2359808     ['conv2d_10[0][0]']               
                                                                                                    
 up_sampling2d_1 (UpSampling2D)  (None, 160, 128, 51  0          ['conv2d_11[0][0]']               
                                2)                                                                 
                                                                                                    
 concatenate_1 (Concatenate)    (None, 160, 128, 76  0           ['up_sampling2d_1[0][0]',         
                                8)                                 'conv2d_5[0][0]']                
                                                                                                    
 conv2d_12 (Conv2D)             (None, 160, 128, 25  1769728     ['concatenate_1[0][0]']           
                                6)                                                                 
                                                                                                    
 conv2d_13 (Conv2D)             (None, 160, 128, 25  590080      ['conv2d_12[0][0]']               
                                6)                                                                 
                                                                                                    
 up_sampling2d_2 (UpSampling2D)  (None, 320, 256, 25  0          ['conv2d_13[0][0]']               
                                6)                                                                 
                                                                                                    
 concatenate_2 (Concatenate)    (None, 320, 256, 38  0           ['up_sampling2d_2[0][0]',         
                                4)                                 'conv2d_3[0][0]']                
                                                                                                    
 conv2d_14 (Conv2D)             (None, 320, 256, 12  442496      ['concatenate_2[0][0]']           
                                8)                                                                 
                                                                                                    
 conv2d_15 (Conv2D)             (None, 320, 256, 12  147584      ['conv2d_14[0][0]']               
                                8)                                                                 
                                                                                                    
 up_sampling2d_3 (UpSampling2D)  (None, 640, 512, 12  0          ['conv2d_15[0][0]']               
                                8)                                                                 
                                                                                                    
 concatenate_3 (Concatenate)    (None, 640, 512, 19  0           ['up_sampling2d_3[0][0]',         
                                2)                                 'conv2d_1[0][0]']                
                                                                                                    
 conv2d_16 (Conv2D)             (None, 640, 512, 64  110656      ['concatenate_3[0][0]']           
                                )                                                                  
                                                                                                    
 conv2d_17 (Conv2D)             (None, 640, 512, 64  36928       ['conv2d_16[0][0]']               
                                )                                                                  
                                                                                                    
 conv2d_18 (Conv2D)             (None, 640, 512, 1)  65          ['conv2d_17[0][0]']               
                                                                                                    
==================================================================================================
Total params: 31,377,793
Trainable params: 31,377,793
Non-trainable params: 0
__________________________________________________________________________________________________

核心问题

加载图片后得到形状为(640, 512, 1)的numpy数组(与模型输入层形状匹配),执行以下代码时报错:

from tensorflow.keras.preprocessing.image import load_img, img_to_array

img_size = (640,512)
color_mode = "grayscale" 
image = img_to_array(load_img(image_path, target_size=self.image_size, color_mode=self.color_mode))
image = image/255.0
print(image.shape)
# 输出:(640, 512, 1)

# unet是封装好的类,内部包含上述模型
# unet.load_weights('../../models/unet_model_i_04.h5')
unet.model.predict(image)

第一次报错信息:

ValueError: 输入层"model"的输入0与该层不兼容:预期形状=(None, 640, 512, 1),实际形状=(32, 512, 1)

尝试将输入图像尺寸改成320x256(根据旧笔记推测训练时的尺寸),报错变为:

ValueError: 输入层"model"的输入0与该层不兼容:预期形状=(None, 320, 256, 1),实际形状=(32, 256, 1)

问题原因及解决办法

两个关键问题

  1. 缺少批量维度:Keras的predict()方法要求输入必须是4维张量(批量大小, 高度, 宽度, 通道数),你传入的是3维单张图片,模型会把第一个维度(640)当成批量大小,剩下的(512,1)当成空间维度,因此出现形状不匹配错误。
  2. 尺寸参数可能传错:代码里定义了img_size=(640,512),但load_img用的是self.image_size,有可能self.image_size的值并非你预期的640x512,导致实际输入尺寸错误。

修正后的代码

from tensorflow.keras.preprocessing.image import load_img, img_to_array
import numpy as np

# 明确指定模型要求的输入尺寸
img_size = (640, 512)
color_mode = "grayscale" 
# 直接使用img_size,避免self.image_size带来的不确定问题
image = img_to_array(load_img(image_path, target_size=img_size, color_mode=color_mode))
image = image / 255.0
print(image.shape)  # (640, 512, 1)

# 给输入增加批量维度,变为(1, 640, 512, 1)
image = np.expand_dims(image, axis=0)

# 执行预测
prediction = unet.model.predict(image)
# 若要获取单张图片的预测结果,去掉批量维度即可
prediction_single = np.squeeze(prediction, axis=0)

额外提醒

  • 模型输入层的(None, 640, 512, 1)中,None表示批量大小可变,因此必须传入4维张量。
  • 以加载后的模型summary()显示的输入尺寸为准,不要仅凭旧笔记盲目修改输入尺寸,除非你确认当前加载的权重对应320x256尺寸的模型。

内容的提问来源于stack exchange,提问作者J. Maria

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 14:09:52