Keras分类CSV格式MNIST数据集报形状不兼容错误如何解决?
报错原因
- 全连接
Dense层默认仅对输入张量的最后一个维度执行全连接计算,你当前输入到模型的x_train形状为(60000, 28, 28),第一层Dense的输入形状设置为(28,28),因此每经过一层Dense,输出形状都会保留前两个维度,到最后输出层时输出形状为(None, 28, 10) - 你的标签
y_train是独热编码后的(None, 10)形状,二者维度不匹配,因此损失函数计算时报错
修正方案
方案1:在输入层后添加展平层(最简便)
在模型第一层之前添加Flatten层,把二维的28*28图像展平为一维的784维向量,修正后的模型定义部分代码如下:
model = Sequential() # 新增Flatten层,将(28,28)的二维输入展平为(784,)的一维向量 model.add(layers.Flatten(input_shape=(x_train.shape[1:]))) model.add(Dense(units=32, activation='sigmoid')) model.add(Dense(units=64, activation='sigmoid')) model.add(Dense(units=10,activation='softmax'))
方案2:提前对训练数据做维度压缩
在加载数据后直接将x的形状从(60000,28,28)修改为(60000, 784),对应修改模型输入形状即可:
# 加载数据后新增代码 x_train = x_train.reshape(x_train.shape[0], -1) x_test = x_test.reshape(x_test.shape[0], -1) # 模型输入层对应修改为 model.add(Dense(units=32, activation='sigmoid',input_shape=(784,)))
额外优化建议
你可以对输入像素值做归一化处理,模型收敛速度会明显提升:
x_train = x_train / 255.0 x_test = x_test / 255.0
内容的提问来源于stack exchange,提问作者ELI
相关产品推荐
相关产品推荐

