使用MNIST模型训练报错:形状(200,10,2)与(200,10)不兼容
MNIST分类中categorical_crossentropy形状不兼容问题解决
问题场景
在MNIST数字图像分类任务中,将图像调整为(pic_num, size, size, ?)格式(不清楚最后一维含义),为使用categorical_crossentropy损失函数,将一维标签转换为独热编码。
模型与编译代码
model=Sequential() model.add(Conv2D(32,kernel_size=(3,3),input_shape=(28,28,1),activation='relu')) model.add(Conv2D(64,(3,3),activation='relu')) model.add(MaxPooling2D(pool_size=(2,2))) model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(128,activation='relu')) model.add(Dropout(0.5)) model.add(Dense(10,activation='softmax')) model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])
训练代码
history=model.fit(x_train,y_train,validation_split=0.25,epochs=30, batch_size=200,verbose=0,callbacks=[early_stopping_callback,checkpointer])
报错信息
~ in categorical_crossentropy target.shape.assert_is_compatible_with(output.shape) Shapes (200, 10, 2) and (200, 10) are incompatible
尝试过调整Flatten层位置、修改训练数据和标签形状,但问题未解决。
问题分析与解决步骤
明确图像最后一维含义:
图像形状的最后一维是通道数,MNIST是灰度图像,通道数为1,所以x_train的正确形状应为(样本总数, 28, 28, 1)。你的模型input_shape已经设置为(28,28,1),只需确保x_train预处理后符合该格式即可。核心问题:标签形状不匹配
报错显示标签y_train的形状是(200,10,2),但模型输出是(200,10),说明独热编码过程中出现错误。正常MNIST独热编码标签应为(样本总数, 10)(对应10个数字类别)。- 检查独热编码代码,正确的处理方式应为:
y_train = keras.utils.to_categorical(y_train, num_classes=10) - 避免重复编码或错误添加额外维度,比如不要将标签转成
(样本数,1,10)后再错误扩展维度。
- 检查独热编码代码,正确的处理方式应为:
验证数据形状
训练前打印数据形状确认:print(x_train.shape) # 预期输出:(N, 28, 28, 1),N为样本数 print(y_train.shape) # 预期输出:(N, 10)确保两者样本数一致,且y_train无多余维度。
模型结构无需调整
你的模型是标准的MNIST卷积分类结构,Flatten层位置正确,无需修改。问题根源在数据预处理,而非模型本身。
内容的提问来源于stack exchange,提问作者user22213244
相关产品推荐
相关产品推荐

