TensorFlow训练模型时报Data cardinality数据基数歧义错误如何解决
问题定位
Data cardinality报错的核心原因是输入到model.fit()的训练特征train_X和训练标签train_Y的样本数量不一致,从报错信息可知train_X有12000个样本,train_Y仅640个样本,对应你给出的代码,存在两个直接导致该问题的错误:
- 遗漏了数据集拆分逻辑:你调用
read_patches读取数据得到X和Y后,没有执行train_test_split拆分代码,直接使用了未定义的train_X、train_Y变量,大概率是漏写了拆分代码,或者拆分时参数顺序写错,导致特征和标签的拆分结果数量不匹配。 - reshape逻辑错误:你直接对
train_X执行reshape(-1, 32, 32, 1),如果读取到的原始图片尺寸不是3232,reshape操作会自动将单张大图拆分为多个3232的样本,导致特征的样本量倍增,和标签数量完全不匹配,这是你当前报错的最直接诱因。
另外你的代码还存在隐性问题:当前仅读取了标签为1的good类数据,且模型最后一层是输出10类的softmax,和任务的标签规则不匹配,后续也会触发报错。
解决步骤
- 补全数据集读取和拆分逻辑,如果你有多类数据需要先合并所有类的特征和标签,再执行拆分,示例代码如下:
# 读取所有类别的数据(示例为2分类,包含good类和bad类,根据你的实际分类数调整) X_good, Y_good = read_patches("C:\\works\\data\\image_source_01\\good", 1) X_bad, Y_bad = read_patches("C:\\works\\data\\image_source_01\\bad", 0) # 合并所有数据 X = np.concatenate([X_good, X_bad], axis=0) Y = np.concatenate([Y_good, Y_bad], axis=0) # 拆分训练集测试集,注意参数顺序:特征在前,标签在后,返回值顺序是train_X, test_X, train_Y, test_Y train_X, test_X, train_Y, test_Y = train_test_split(X, Y, test_size=0.2, random_state=42) # 拆分后先校验数量匹配 print(f"训练特征数:{train_X.shape[0]}, 训练标签数:{train_Y.shape[0]}") print(f"测试特征数:{test_X.shape[0]}, 测试标签数:{test_Y.shape[0]}")
- 修正reshape逻辑:在reshape前先确认原始图片的尺寸,如果不是3232,先通过
cv2.resize把所有图片统一缩放到3232,再执行reshape,避免样本量异常变化:
# 示例:统一缩放图片到32*32,放在read_patches函数里读取图片后执行 patch = cv2.resize(gray, (32, 32)) # 之后再执行reshape就不会改变样本数量 train_X = train_X.reshape(-1, 32, 32, 1) test_X = test_X.reshape(-1, 32, 32, 1)
- 修正模型输出层:根据你的实际分类数调整最后一层Dense的units参数,比如2分类就设置为2,不要用不匹配的10:
# 2分类示例 tf.keras.layers.Dense(units=2, activation='softmax')
- 启动训练前再次校验
train_X.shape[0]和train_Y.shape[0]数值完全一致后,再执行model.fit即可。
内容的提问来源于stack exchange,提问作者chobab
相关产品推荐
相关产品推荐

