TensorFlow中使用model.fit()训练CNN时出现维度不匹配错误的求助
TensorFlow中使用model.fit()训练CNN时出现维度不匹配错误的求助
别着急,这个问题其实是输出层设置、损失函数和分类任务类型不匹配导致的,我来一步步帮你解决:
错误核心原因
从报错信息ValueError: Arguments 'target' and 'output' must have the same rank (ndim). Received: target.shape=(None,), output.shape=(None, 10)可以看出:
- 你的数据集是2分类任务(控制台显示
Found 440 images belonging to 2 classes),但你设置的输出层是Dense(units=10, activation='softmax')(对应10分类) - 同时你用了
class_mode='binary'(二分类标签格式,输出一维标签),但损失函数用了categorical_crossentropy(要求标签是和输出同维度的one-hot编码),三者完全不匹配,所以维度对不上。
具体修改方案(针对你的2分类任务)
你只需要调整三个地方,代码就能正常运行:
1. 修改模型输出层
把最后一层的10个输出单元改成1个,激活函数换成sigmoid(二分类专用):
# 原来的错误代码 # model.add(Dense(units=10, activation='softmax')) # 修改后 model.add(Dense(units=1, activation='sigmoid')) # 二分类用1个输出单元+sigmoid
2. 修改损失函数
把categorical_crossentropy换成二分类专用的binary_crossentropy:
# 原来的错误代码 # model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) # 修改后 model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
3. 确认生成器的class_mode设置
你当前的class_mode='binary'是正确的,不需要修改,它会为二分类任务生成一维的标签数组,和修改后的输出层维度匹配。
可选:如果想尝试多分类格式(其实没必要,二分类用上面的方案更简洁)
如果你非要用categorical_crossentropy,那需要把整个流程改成多分类格式:
- 输出层改成
Dense(units=2, activation='softmax')(对应2个类别) - 损失函数保持
categorical_crossentropy - 生成器的
class_mode改成'categorical',这样生成的标签是二维的one-hot编码,和输出层维度匹配
额外小提示
你的代码里有些注释拼写错误(比如filtesr→filters、intager→integer),虽然不影响运行,但后续可以修正,方便自己阅读~
修改完上面的内容后,再重新运行代码,应该就能正常训练啦!
备注:内容来源于stack exchange,提问作者Tifanny Blort
相关产品推荐
相关产品推荐

