Keras训练报InvalidArgumentError输入深度与卷积核深度不匹配问题
错误根源定位与修复方案
直接报错原因
你遇到的InvalidArgumentError: input depth must be evenly divisible by filter depth: 3 vs 6报错,核心原因是喂入模型的实际输入通道数和模型定义的输入通道数不匹配:你定义模型输入为6通道,但实际加载的数据是默认的3通道RGB图像。
代码中所有待修复的问题
- 输入数据与模型要求不匹配
flow_from_directory接口默认读取的是3通道RGB图像,输出张量形状为(batch_size, 128, 128, 3),和你定义的模型输入(100,100,6)尺寸、通道数均不匹配。 - 模型结构维度不兼容
你在2D卷积Conv2D后直接拼接1D卷积Conv1D:Conv2D输出为4维张量(batch, height, width, channels),而Conv1D要求输入为3维张量(batch, step, channels),运行时会触发维度错误。 - 冗余参数与缺失输出层
只有模型第一层需要指定input_shape参数,后续卷积层重复添加该参数属于冗余操作;同时你要做6分类任务,模型末尾缺少对应6个类别的输出层,无法正常计算分类损失。 - 冗余训练调用
你连续调用了两次model.fit,第二次会在第一次训练后的权重基础上继续训练,若不是刻意设计增量训练属于多余操作。
修复方案
- 修正输入匹配逻辑
- 如果你确实需要使用6通道输入:放弃
flow_from_directory接口,自行编写数据加载逻辑读取6通道数据,保证输入尺寸统一为100*100 - 如果你是误将3通道设置为6通道:将模型输入形状修改为
input_shape=(128,128,3),和flow_from_directory的target_size参数对齐
- 如果你确实需要使用6通道输入:放弃
- 调整模型结构
删除冗余的Conv1D层,补充6分类输出层,示例修正后的模型结构:
input_shape=(128,128,3) # 或根据你的实际数据调整为(100,100,6) model = keras.Sequential() model.add(Conv2D(32, 3, padding='same', activation='relu', input_shape=input_shape)) model.add(MaxPooling2D(pool_size=2)) model.add(Dropout(0.2)) model.add(Conv2D(64, 3, padding='same', activation='relu')) model.add(MaxPooling2D(pool_size=2)) model.add(Dropout(0.2)) model.add(Conv2D(128, 3, padding='same', activation='relu')) model.add(MaxPooling2D(pool_size=2)) model.add(Dropout(0.2)) model.add(Flatten()) model.add(Dense(128, activation='relu')) model.add(Dropout(0.2)) model.add(Dense(6, activation='softmax')) # 补充6分类输出层
- 统一训练逻辑
保留单次model.fit调用即可,根据你的训练需求调整epoch数值。
内容的提问来源于stack exchange,提问作者Raxz
相关产品推荐
相关产品推荐

