错误的输入形状到神经网络层

时间:2017-07-02 11:45:24

标签: python-3.x opencv keras conv-neural-network

我正在尝试使用MNIST数据集对手写数字进行分类来训练我的模型。我的模型训练成功,准确率达到98.9%。但是当我尝试输入自定义图像时,它会显示以下错误:

Error when checking : expected conv2d_4_input to have shape (None, 28, 28, 1) but got array with shape (1, 1, 28, 28)

这是第一个卷积层,即输入层。 我该怎么做才能解决这个问题? 这是我的卷积神经网络:

conv_model = Sequential()
conv_model.add(Conv2D(filters, kernel_size[0], input_shape=(28 , 28 , 1)))
conv_model.add(Activation(act))
conv_model.add(Conv2D(filters, kernel_size[0]))
conv_model.add(Activation(act))
conv_model.add(MaxPool2D(pool_size=(2,2)))
conv_model.add(Dropout(0.25))
conv_model.add(Flatten())
conv_model.add(Dense(128))
conv_model.add(Activation(act))
conv_model.add(Dropout(0.5))
conv_model.add(Dense(10))
conv_model.add(Activation('softmax'))
#conv_model.summary()

编制细节:

conv_model.compile(loss='categorical_crossentropy', optimizer='adadelta', metrics=['accuracy'])

完整的源代码: https://github.com/tanmay-edgelord/HandwrittenDigitRecognition

图片: enter image description here 如果需要任何进一步的细节,请发表评论。

2 个答案:

答案 0 :(得分:1)

错误信息很简单:

  • 您的第一层是期待具有形状的数据(无,28,28,1),其中“无”可以是任何数字(它是批量大小,您有多少个示例)。
  • 另一方面,您的数据具有形状(1,1,28,28)。

混淆在我看来很常见:Keras将频道放在最后一个维度,而你的数据在第一个维度中有通道。

<强>解决方案:

只需以正确的格式重塑您的数据:(1,28,28,1)。

但是你想把整个图像交给模特吗???如果是这样,它将无法很好地工作,它期望28 x 28像素的图像。

您必须将不同的28 x 28图像中的每个数字分开。而且你必须考虑到你的图像被反转的可能性是什么是黑色和什么是白色。通常,MNIST数据具有黑色背景(0值),具有白色数字(1个值)。

答案 1 :(得分:0)

通过将其传递给具有正确输入大小的重塑函数

来解决问题
roi2 = roi.reshape(1,28,28,1)