CNN训练报InvalidArgumentError: Graph execution error排查
问题根因
该报错和Colab环境依赖、数据集本身无关,是三处代码配置不匹配直接导致的:
- 输入维度配置冲突:
ImageDataGenerator加载数据集时设置target_size=(256,256),即输入模型的实际张量尺寸为2562563,但模型第一层Conv2D错误配置input_shape=(128,1288,3)——这里1288属于明显笔误(多输入1个8),且和数据加载尺寸完全不一致,模型入口的张量预期和实际输入从训练一开始就错配。 - 标签格式与损失函数不匹配:设置
class_mode='categorical'时,数据生成器输出的是one-hot编码标签(6分类场景下标签形状为(batch_size, 6)),但编译时选用的sparse_categorical_crossentropy损失仅接收整数型类别索引标签(形状为(batch_size,)),二者混用会打乱张量维度计算逻辑。 - Flatten层报错为上述问题的直接表现:错误的输入尺寸经过多层Conv2D、MaxPooling2D、BatchNormalization传导后,输出到Flatten层的特征图元素总数,和层逻辑推导的预期形状倍数完全不匹配,最终触发
InvalidArgumentError: Graph execution error。
修复方案
按顺序调整以下配置即可解决问题:
- 统一全链路输入尺寸
二选一保持尺寸一致即可,同时修正笔误:- 若使用256*256分辨率训练:将第一层Conv2D的
input_shape参数改为(256,256,3) - 若使用128*128分辨率降低训练开销:将
ImageDataGenerator的target_size参数改为(128,128),删除input_shape中多打的数字8,不要保留1288这类无效尺寸值
- 若使用256*256分辨率训练:将第一层Conv2D的
- 统一标签格式与损失函数
二选一即可,不要混用:- 保留
class_mode='categorical'配置:将模型编译阶段的损失函数替换为categorical_crossentropy - 保留
sparse_categorical_crossentropy损失:将数据生成器的class_mode参数改为sparse
- 保留
- 前置校验避免维度错误
在调用fit()启动训练前,添加一行model.summary()打印模型各层输出维度,确认最后一层池化输出的特征图经过Flatten展平后的维度,和后续第一个Dense层的输入维度匹配,即可提前规避Reshape类报错。
类VGG结构堆叠注意:默认参数下MaxPooling2D步长为2,每经过一次池化特征图宽高减半,调整输入尺寸时要确认经过所有池化层后特征图宽高不会小于等于0,否则会触发额外的维度错误。
内容的提问来源于stack exchange,提问作者Dharmesh D
相关产品推荐
相关产品推荐

