使用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])
关键修正点
- 对齐训练集/验证集的特征与标签样本数,确保一一对应;
- 重新处理验证集数据,不再复用训练集内容;
- 统一所有数据集的形状为28x28x1,匹配模型输入要求;
- 修正模型输入形状为28x28x1,移除Dropout层无效参数;
- 训练时使用划分好的验证集而非测试集,符合机器学习训练规范。
内容的提问来源于stack exchange,提问作者Wafaa
相关产品推荐
相关产品推荐

