Keras ImageDataGenerator.fit调用时数组reshape维度报错排查
LeNet项目ImageDataGenerator维度报错修复
报错根因
你遇到的三类报错本质是两个核心问题:
- 硬编码reshape维度值和数组实际元素总数不匹配
- 传入
ImageDataGenerator.fit()的张量缺少通道维度,不满足接口的4阶张量要求
具体对应错误说明:
- 首次报错:你写的目标形状
(704,227,227)总元素量为704*227*227=36276416,但训练集xtrain实际总元素量为36070300,数值不匹配导致reshape失败 - 第一次调整参数后报错:目标形状包含固定值704,验证集
x_val总元素量仅为4946784,远小于形状要求的元素总数,reshape失败 - 第二次调整参数后报错:输出形状
(704,227,227)是3阶张量(维度顺序为样本数、图像高度、图像宽度),但ImageDataGenerator.fit()强制要求输入为4阶张量,维度顺序必须为(样本数, 图像高度, 图像宽度, 通道数),缺少通道维度触发接口校验错误。
额外说明:你当前给测试集也配置了旋转、翻转、缩放类数据增强是错误用法,测试集仅需做归一化处理,不需要加随机增强扰动。
修复方案
不要硬编码样本总数,reshape时样本数位置传-1让numpy自动计算,末尾补充对应通道数(灰度图通道数为1,RGB彩色图通道数为3)即可。
修正后代码:
from keras.preprocessing.image import ImageDataGenerator # 数据增强配置:测试集移除随机增强参数,仅保留归一化 # 如果已提前做过像素归一化,可删除rescale参数 train_datagen = ImageDataGenerator(rotation_range=2, horizontal_flip=True, zoom_range=.1, rescale=1/255.) val_datagen = ImageDataGenerator(rotation_range=2, horizontal_flip=True, zoom_range=.1, rescale=1/255.) test_datagen = ImageDataGenerator(rescale=1/255.) # 维度适配:自动计算样本数,补充通道维度 channel = 1 # RGB三通道数据集将该值改为3 img_h, img_w = 227, 227 xtrain = xtrain.reshape(-1, img_h, img_w, channel) x_val = x_val.reshape(-1, img_h, img_w, channel) xtest = xtest.reshape(-1, img_h, img_w, channel) # 拟合增强配置 train_datagen.fit(xtrain) val_datagen.fit(x_val) test_datagen.fit(xtest)
如果执行上述代码仍报元素数不匹配错误,先打印核对数组尺寸:
执行print(f"训练集总元素数:{xtrain.size}, 单样本元素数:{img_h*img_w*channel}"),若总元素数无法被单样本元素数整除,说明你实际加载的图像尺寸不是227*227,替换为真实的图像高宽值即可。
内容的提问来源于stack exchange,提问作者Josh
相关产品推荐
相关产品推荐

