Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 神经网络层的错误输入形状_Python 3.x_Opencv_Keras_Conv Neural Network - Fatal编程技术网

Python 3.x 神经网络层的错误输入形状

Python 3.x 神经网络层的错误输入形状,python-3.x,opencv,keras,conv-neural-network,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 = Sequen

我正在尝试使用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'])
完整的源代码:

图像:
如果需要任何进一步的详细信息,请发表评论。

错误消息非常直接:

  • 您的第一层需要具有形状的数据(None、28、28、1),其中“None”可以是任何数字(这是批量大小,您有多少个示例)
  • 另一方面,您的数据具有形状(1、1、28、28)
在我看来,这种混淆很常见:Keras将通道放在最后一个维度,而您的数据将通道放在第一个维度

解决方案:

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


但是你是想把整个图像都给模特吗???如果是这样的话,它将不能很好地工作,它需要28 x 28像素的图像


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

错误消息非常简单:

  • 您的第一层需要具有形状的数据(None、28、28、1),其中“None”可以是任何数字(这是批量大小,您有多少个示例)
  • 另一方面,您的数据具有形状(1、1、28、28)
在我看来,这种混淆很常见:Keras将通道放在最后一个维度,而您的数据将通道放在第一个维度

解决方案:

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


但是你是想把整个图像都给模特吗???如果是这样的话,它将不能很好地工作,它需要28 x 28像素的图像


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

通过将问题传递给具有正确输入大小的整形函数,问题得以解决

roi2 = roi.reshape(1,28,28,1)

通过将其传递给具有正确输入大小的整形函数,问题得以解决

roi2 = roi.reshape(1,28,28,1)

我正在使用cv2.resize函数为函数cv2.contour找到的每个轮廓调整图像大小(在这种情况下,每个轮廓都是一个数字)。此外,我还尝试将大小1、28、28、1输入到cv2.resize,但它给了我一个错误,即只需要2个参数。我强烈建议您检查performRecognition代码我在后端正常使用tensorflow cv2,稍后再重新塑造结果。准备好后,在使用
模型之前重塑
roi
。预测。如果
roi
是一个numpy数组,那么它就像
roi=roi.重塑((1,28,28,1))
一样简单。如果没有,则将其设置为numpy数组:
roi=np.array(roi)
。是的,我做了,没有roi=np.array(roi)它工作得很好。我正在使用cv2.resize函数为函数cv2.contour找到的每个轮廓调整图像大小(在这种情况下,每个轮廓都是一个数字)。此外,我还尝试将大小1、28、28、1输入到cv2.resize,但它给了我一个错误,即只需要2个参数。我强烈建议您检查performRecognition代码我在后端正常使用tensorflow cv2,稍后再重新塑造结果。准备好后,在使用
模型之前重塑
roi
。预测。如果
roi
是一个numpy数组,那么它就像
roi=roi.重塑((1,28,28,1))
一样简单。如果没有,就让它成为一个numpy数组:
roi=np.array(roi)
。是的,没有roi=np.array(roi),它工作得很好