Keras中Resizing层输出形状异常问题咨询
问题原因与解决方案
你的问题出在输入张量缺少通道维度,以及Keras Resizing 层对输入形状的预期上:
- 你的输入形状是
(None, 224, 224),仅包含批量、高度、宽度三个维度,缺少灰度图像应有的单通道维度(1)。 - Keras 的
Resizing层默认期望输入是带通道的标准图像格式:- 默认
channels_last格式下,输入应为(None, H, W, C); - 若用
channels_first格式,则为(None, C, H, W)。
- 默认
- 当输入没有通道维度时,
Resizing层会误将最后一个维度(原宽度224)当作通道数,同时将前两个维度调整为目标尺寸(50, 50),最终输出形状显示为(50, 50, 224)(层信息省略了批量维度None)。
解决方案1:给输入添加通道维度(推荐)
这是符合Keras图像输入规范的标准做法:
import numpy as np # 先给原始输入X扩展通道维度(假设X形状为(num_samples, height, width)) X = X[..., np.newaxis] # 转换为(num_samples, height, width, 1) height, width, _ = X.shape[1:] input = keras.Input(shape=(height, width, 1), name='Input') # 预处理函数无需修改 def definePreprocessing(trial): preprocessing = keras.Sequential(name='Preprocessing') preprocessing.add(keras.layers.Rescaling(name="Normalize", scale=1./255)) preprocessing.add(keras.layers.Resizing( 50, 50, interpolation="bilinear", name="Downsample")) return preprocessing # 构建模型 preprocessing = definePreprocessing(trial) preprocessed = preprocessing(input)
此时 Resizing 层会正确识别各维度,输出形状为 (None, 50, 50, 1),符合灰度图像的预期。
解决方案2:在预处理流程中补充通道维度
如果无法修改原始输入的形状,可以在预处理序列中加入 Reshape 层来补充通道:
def definePreprocessing(trial, height, width): preprocessing = keras.Sequential(name='Preprocessing') preprocessing.add(keras.layers.Rescaling(name="Normalize", scale=1./255)) # 补充单通道维度 preprocessing.add(keras.layers.Reshape((height, width, 1))) preprocessing.add(keras.layers.Resizing( 50, 50, interpolation="bilinear", name="Downsample")) return preprocessing # 调用时传入原始height和width preprocessing = definePreprocessing(trial, height, width) preprocessed = preprocessing(input)
调整后 Resizing 层会基于正确的维度进行尺寸缩放,输出形状为 (None, 50, 50, 1)。
内容的提问来源于stack exchange,提问作者André
相关产品推荐
相关产品推荐

