TensorFlow训练MNIST CNN触发ValueError数据适配器错误如何修复?
报错原因
你在循环构造模型的代码中错误加入了x_train = x_train.shape[0:]语句,原本x_train是存储手写数字图像的numpy数组,被这行代码覆盖为了存储数组维度的整数元组,导致model.fit读取训练输入时类型不匹配,触发数据适配器报错。
同时你的代码还存在几处不符合MNIST 10分类任务、不符合CNN输入要求的逻辑问题,也会导致后续训练失败,需要一并修复。
修复步骤
- 删除循环内部的错误赋值语句
x_train = x_train.shape[0:],避免覆盖原始训练数据 - 给MNIST数据集添加通道维度,适配Conv2D层要求的4维输入格式(样本数, 高度, 宽度, 通道数),在数据归一化代码后添加如下代码:
# 增加单通道维度,适配灰度图输入要求 x_train = x_train.reshape(-1, 28, 28, 1) x_test = x_test.reshape(-1, 28, 28, 1)
- 修正卷积层的输入形状参数,输入形状不需要包含样本数维度,将第一层Conv2D的参数改为:
model.add(Conv2D(layer_size, (3,3), input_shape = (28,28,1)))
- 修正输出层和损失函数,适配10分类任务:
- 将输出层的全连接节点数从1改为10:
model.add(Dense(10)) - 将输出层的激活函数从
sigmoid改为softmax:model.add(Activation("softmax")) - 将编译时的损失函数从
binary_crossentropy改为sparse_categorical_crossentropy(匹配y_train的整数标签格式,无需额外做onehot编码)
- 将输出层的全连接节点数从1改为10:
- 可选优化:在
model.fit中加入你定义的TensorBoard回调和验证集,方便调参:
model.fit(x_train, y_train, batch_size = 30, epochs = 10, validation_data=(x_test, y_test), callbacks=[tensorboard])
注意事项
你当前的三重循环会遍历所有超参数组合,每次循环都会覆盖之前的model变量,最终保存的只是最后一组超参数训练得到的模型,如果需要保存所有实验结果或者择优保存,需要自行添加模型存储的判断逻辑。
内容的提问来源于stack exchange,提问作者filthycasual
相关产品推荐
相关产品推荐

