You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Keras与TensorFlow训练Fashion MNIST遇数据基数不匹配错误

解决Fashion MNIST训练时的数据维度不匹配错误

错误提示ValueError: Data cardinality is ambiguous: x sizes: 50000 y sizes: 60000的核心原因是训练集的特征与标签样本数不一致,同时代码中存在多个关键问题,逐一梳理并修正如下:

问题分析

  • 训练集与标签样本数不匹配:你取了前50000张训练图像,但直接使用了完整的60000个训练标签,导致特征和标签数量不对应;验证集标签也未匹配划分好的10000个验证样本。
  • 验证集数据赋值错误:误将训练集数据直接赋值给验证集,完全混淆了训练/验证数据。
  • 模型输入形状不匹配:Fashion MNIST是28x28单通道灰度图,模型却设置为32x32三通道输入;测试集被错误展平为一维数组,与卷积层需要的二维输入形状冲突。
  • Dropout层参数无效:Dropout层额外设置的input_shape=(256,)既多余又与实际数据维度不符。

修正后的完整代码

import tensorflow as tf
from tensorflow.keras.utils import np_utils
from tensorflow.keras.optimizers import RMSprop

# 加载Fashion MNIST数据集
(train_and_validation_images, train_and_validation_labels), (test_images, test_labels) = tf.keras.datasets.fashion_mnist.load_data()

# 正确划分训练集与验证集
validation_images = train_and_validation_images[-10000:, :, :]
validation_labels = train_and_validation_labels[-10000:]  # 匹配验证集图像的标签

train_images = train_and_validation_images[:50000, :, :]
train_labels = train_and_validation_labels[:50000]  # 匹配训练集图像的标签

# 统一调整数据形状为(batch, 28, 28, 1),适配卷积层输入
train_images_flatten = train_images.reshape((train_images.shape[0], 28, 28, 1))
validation_images_flatten = validation_images.reshape((validation_images.shape[0], 28, 28, 1))
test_images_flatten = test_images.reshape(test_images.shape[0], 28, 28, 1)

# 归一化处理
train_images_model = train_images_flatten.astype("float32") / 255.0
validation_images_model = validation_images_flatten.astype("float32") / 255.0
test_images_model = test_images_flatten.astype("float32") / 255.0

# 标签转为独热编码
train_labels_categ = np_utils.to_categorical(train_labels, 10)
validation_labels_categ = np_utils.to_categorical(validation_labels, 10)
test_labels_categ = np_utils.to_categorical(test_labels, 10)

batch_size = 128
num_classes = 10 
epochs = 40

# 构建适配数据的模型
model = tf.keras.Sequential([
    tf.keras.layers.InputLayer(input_shape=(28,28,1)),
    tf.keras.layers.Dropout(0.2),
    tf.keras.layers.Conv2D(32, (3, 3), padding='same', activation='relu'),
    tf.keras.layers.MaxPooling2D(pool_size=(2, 2), strides=(2,2)),
    tf.keras.layers.Flatten(), 
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dense(10, activation='softmax')
])
model.summary()

# 编译模型并训练:使用正确的验证集数据
model.compile(loss='categorical_crossentropy', optimizer=RMSprop(), metrics=['accuracy'])
history = model.fit(
    train_images_model, train_labels_categ,
    batch_size=batch_size,
    epochs=epochs,
    verbose=1,
    validation_data=(validation_images_model, validation_labels_categ)
)

# 评估测试集性能
score = model.evaluate(test_images_model, test_labels_categ, verbose=0)
print('Test accuracy:', score[1])

关键修正点

  1. 对齐训练集/验证集的特征与标签样本数,确保一一对应;
  2. 重新处理验证集数据,不再复用训练集内容;
  3. 统一所有数据集的形状为28x28x1,匹配模型输入要求;
  4. 修正模型输入形状为28x28x1,移除Dropout层无效参数;
  5. 训练时使用划分好的验证集而非测试集,符合机器学习训练规范。

内容的提问来源于stack exchange,提问作者Wafaa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 07:45:33