Keras ImageDataGenerator调用flow报x与y长度不一致ValueError
报错根因
你调用ImageDataGenerator.flow()方法时传参错位,把验证集的图像数组错传给了训练生成器的标签参数位置。
从报错信息就能直接定位问题:
- 报错里的
x长度为27455,刚好是你训练集的样本量,形状是标准的4维图像张量格式 - 报错里的
y长度为7172,刚好是你验证集的样本量,形状同样是4维图像张量——而正常的分类标签应该是2维(one-hot编码,形状为(样本数, 类别数))或者1维(整数编码,形状为(样本数,)),不可能是图像格式
你之前调整维度无效是因为维度操作本身完全正确:给灰度图在axis=3位置扩充通道维度的写法,完全符合CNN对输入张量的格式要求,问题和维度设置无关。
这个坑基本都是复制代码时漏改变量导致的:写完训练集生成器的flow调用后,直接复制整行改datagen和生成器变量名,没把参数里的训练集变量替换成验证集对应变量,甚至直接把验证集图像塞到了训练生成器的y参数位。
修复步骤
- 逐行检查两个生成器的
flow方法传参,严格保证x、y和所属数据集匹配:
训练集生成器参考写法:
验证集生成器参考写法:train_generator = train_datagen.flow( x=training_images, y=training_labels, batch_size=32 # 替换为你作业要求的batch_size值 )validation_generator = validation_datagen.flow( x=validation_images, y=validation_labels, batch_size=32 # 替换为你作业要求的batch_size值 ) - 传参前可先打印标签数组形状做校验:
training_labels第一维长度必须等于27455,validation_labels第一维长度必须等于7172,二者都不能是4维结构。 - 尽量用关键字方式传参,不要按位置顺手写参数,能很大程度避免参数顺序错位的问题。
补充:这个是Coursera CNN手语识别作业的高频报错,不用怀疑你之前的维度扩充逻辑,查传参就能解决。
内容的提问来源于stack exchange,提问作者Abhisek Ganguly
相关产品推荐
相关产品推荐

