ResNet50V2传入(128,224,224,3)输入报维度不匹配如何解决
问题原因
不需要拆分单样本传入模型,报错是两处代码写法错误导致的维度不匹配:
- 输入层定义错误:Keras的
Input层shape参数仅需传入单样本的形状,批次维度由框架自动在最前端补充,不需要手动指定。你手动把BATCH_SIZE写入shape参数后,模型期望的输入形状就变成了5维(None, 128, 224, 224, 3),和报错信息完全吻合。 - 训练数据拼接错误:你用的
data_batch_loader每次迭代返回的i、j本身就是形状为(128,224,224,3)、(128, NUM_CLASSES)的批次数据,直接把每个批次append到列表后整体转numpy数组,会额外多出一维,最终x_train的形状变成(批次数量, 128, 224, 224, 3),和模型期望的4维输入完全不匹配。
修正方案
- 修改输入层定义,移除shape参数里的批次大小配置:
# 原错误写法 # x_in = tf.keras.Input(dtype=tf.float32, shape=(BATCH_SIZE,)+resnet_shape) # 修正后 x_in = tf.keras.Input(dtype=tf.float32, shape=resnet_shape)
- 修正训练数据拼接逻辑,避免多余维度:
# 原错误写法:直接append批次后转数组会多嵌套一层维度 # x_train = [] # y_train = [] # for i,j in gen: # x_train.append(i) # y_train.append(j) # x_train = np.array(x_train) # y_train = np.array(y_train) # 修正写法1:拼接所有批次,展平批次维度 x_train, y_train = [], [] for i, j in gen: x_train.append(i) y_train.append(j) x_train = np.concatenate(x_train, axis=0) # 最终形状(总样本数, 224, 224, 3) y_train = np.concatenate(y_train, axis=0) # 最终形状(总样本数, 类别数)
如果内存足够可以用上面的写法,更推荐直接把生成器传入fit,不需要提前把所有数据加载到内存:
# 删掉手动拼接x_train、y_train的代码,训练时直接传入生成器 history = resnet_model.fit(gen, epochs=10)
- 修正模型结构冗余问题:你设置
ResNet50V2(include_top=True)时,模型本身已经自带对应NUM_CLASSES数的全连接分类输出层,后面再接Flatten、全连接、softmax层属于重复结构,会引发维度错误。如果你的任务是8分类,二选一调整即可:- 方案A:把ResNet50V2的
classes参数直接设为8,删除后面自定义的Flatten、Dense层 - 方案B:设置
include_top=False,冻结卷积基权重后再接你自定义的Flatten、全连接分类头
- 方案A:把ResNet50V2的
内容的提问来源于stack exchange,提问作者genshinimpactpog
相关产品推荐
相关产品推荐

