ValueError: Input 0 of layer dense is incompatible with the layer: expected axis -1 of input shape

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框架搭建神经网络模型,在使用模型分类时报错:
    • 报错的部分代码
    • 分析错误原因
    • 验证想法
    • 解决办法
    • 总结

使用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))	#预测样本

运行结果:
ValueError: Input 0 of layer dense is incompatible with the layer: expected axis -1 of input shape_第1张图片
程序成功运行,模型训练完成。

总结

今天训练了这个比较简单的数字识别的模型,便于后续做毕设。

针对这个相似的报错的问题,基本只有两种原因:
①维度不匹配
②维度匹配但这一维度的变量数不匹配,导致无法输入到模型中去
有这类报错的小伙伴,可以按照我示意的方式检查并调整自己的代码,这个问题就不再是个问题啦~

<后续还会继续整理【神经网络与深度学习】相关内容,如果需要,可持续关注我哦~>

<整理不易,留个赞或评论支持一下我吧^^>

如有疑问,欢迎批评指正^^

你可能感兴趣的:(神经网络与深度学习,神经网络,python,深度学习,机器学习,tensorflow)