ValueError: Input 0 of layer dense is incompatible with the layer: expected axis -1 of input shape to have value 784 but received input with shape [None, 28]
使用Keras的Sequential框架搭建神经网络模型,在使用模型分类时报错:
ValueError: Input 0 of layer dense is incompatible with the layer: expected axis -1 of input
shape to have value 784 but received input with shape [None, 28]
有相似报错的小伙伴都可以尝试我的方法,触类旁通。
报错的部分代码
#变量test_x:(10000, 28, 28)的numpy数组
X_test = tf.cast(test_x/255.0,tf.float32) #将test_x归一化处理,并转换为tensor张量,数据类型为float32
model = tf.keras.Sequential() #建立Sequential模型,命名为model
#模型搭建及训练过程省略
num=1
y_pred = np.argmax(model.predict([[X_test[num]]])) #使用训练好的模型预测第num个测试集数据
结果报错:
ValueError: Input 0 of layer dense is incompatible with the layer: expected axis -1 of input
shape to have value 784 but received input with shape [None, 28]
分析错误原因
报错内容的大致意思为:第0层全连接层的输入与该层不兼容(该模型的第0层采用的Flatten层),期望输入的最后那个维度的形状有784个变量,但是实际接收到的输入的形状是 [None, 28]
分析:很明显,这个错误是维度上的问题。
起初,在X_test[num]左右两侧添加两个中括号[[ ]],即[[X_test[num]]],就是为了使其输入模型的维度与X_test保持一致.。但结果报错表明,这样改变维度使不奏效的。
检查:
因为X_test在测试模型和评估模型时作为输入均没有问题,说明X_test的形状才是可以作为模型输入的正确的形状。
那么首先,检查X_test和X_test[num]的形状:
#检查X_test和X_test[num]的形状
print('X_test.shape:'+str(X_test.shape))
print('X_test[num].shape:'+str(X_test[1].shape))
打印结果:
X_test.shape:(10000, 28, 28)
X_test[num].shape:(28, 28)
从结果中可以看出,从测试集本身有三个维度,从测试集中取出一个样本,变成了两个维度,所以才会报错。
验证想法
如果是对测试集进行切片,取出多个样本,这样的维度就不会改变了,是不是就可以正常运行了呢?
代码如下:
y_pred = np.argmax(model.predict(X_test[0:5]),axis=1) #对数据集切片取出前五个样本,并预测其结果
print('X_test[0:5].shape: %s'%(X_test[0:5].shape)) #打印切片后的形状
print('y_pred: %s'%(y_pred)) #打印预测结果
打印结果:
X_test[0:5].shape: (5, 28, 28)
y_pred: [7 2 1 0 4]
结果和所预想的一样,切片没有改变数据集的维度,以它作为模型输入可以正常运行。
解决办法
那么,我们仍不想对数组切片,只想取出一个样本作为模型输入怎么办呢?
改变数组的维度
demo = tf.reshape(X_test[num],(1,28,28)) #增加数组维度,将维度变为(1,28,28)
y_pred = np.argmax(model.predict(demo)) #预测样本
运行结果:
程序成功运行,模型训练完成。
总结
今天训练了这个比较简单的数字识别的模型,便于后续做毕设。
针对这个相似的报错的问题,基本只有两种原因:
①维度不匹配
②维度匹配但这一维度的变量数不匹配,导致无法输入到模型中去
有这类报错的小伙伴,可以按照我示意的方式检查并调整自己的代码,这个问题就不再是个问题啦~
<后续还会继续整理【神经网络与深度学习】相关内容,如果需要,可持续关注我哦~> |
<整理不易,留个赞或评论支持一下我吧^^>
如有疑问,欢迎批评指正^^