Keras中加载与训练输入尺寸不同的图像问题求助
解决Keras超分辨率CNN处理大尺寸图像的问题
我明白你遇到的困扰——训练时用41x41的图像块,预测却要处理更大尺寸的图像,设置input_shape=(None, None, ...)后加载权重还是行不通。这其实是Keras模型加载和结构定义的常见问题,我给你几个针对性的解决方案:
核心问题:训练模型的固定输入尺寸被固化在模型结构中
如果你训练时用的是固定(41,41,3)的输入,直接保存的模型会带着这个固定维度。哪怕你后来改了输入形状,直接加载整个模型(load_model)还是会沿用原来的固定尺寸。正确的做法是重新定义可变输入的模型结构,再单独加载权重:# 1. 重新构建模型,使用可变输入形状 from tensorflow.keras.layers import Input, Conv2D from tensorflow.keras.models import Model def build_variable_input_model(): # 这里把输入形状设为(None, None, 3),适配任意尺寸的RGB图像 inputs = Input(shape=(None, None, 3)) # 完全复制你训练时的模型层结构,不要修改层的参数(比如卷积核数量、大小) x = Conv2D(64, (3,3), activation='relu', padding='same')(inputs) # ... 这里添加你模型的其他卷积、上采样等层,和训练时完全一致 outputs = Conv2D(3, (3,3), padding='same')(x) # 输出和输入通道数一致 model = Model(inputs=inputs, outputs=outputs) return model # 2. 加载训练好的权重 model = build_variable_input_model() model.load_weights('your_training_weights.h5') # 注意是加载权重,不是整个模型检查模型中是否存在固定尺寸的层
如果你的模型里有Flatten、Dense这类依赖输入尺寸的层,哪怕设置了可变输入也没用——这些层的权重形状是固定的,无法适配不同大小的输入。解决办法是:- 替换成全卷积的替代方案,比如用
GlobalAveragePooling2D代替Flatten + Dense(如果涉及分类任务,但超分辨率场景一般不会用到这类层,不过还是要仔细检查) - 确保所有层都是卷积、池化、上采样这类不依赖固定输入尺寸的层(池化只要步幅固定,就能处理任意尺寸的输入,只要输出尺寸为整数即可)
- 替换成全卷积的替代方案,比如用
验证可变输入是否生效
你可以用一张大尺寸图像测试:import numpy as np import cv2 # 读取并预处理大图像 img = cv2.imread('large_test_image.jpg') img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) / 255.0 img = np.expand_dims(img, axis=0) # 增加batch维度 # 预测 super_res_img = model.predict(img) # 处理输出,比如去掉batch维度,转成0-255的图像 super_res_img = np.squeeze(super_res_img) * 255.0 super_res_img = super_res_img.astype(np.uint8)
这样应该就能解决你遇到的问题了——关键是要先构建可变输入的模型结构,再加载训练好的权重,而不是直接加载原来的固定尺寸模型。
内容的提问来源于stack exchange,提问作者Fawaz
相关产品推荐
相关产品推荐

