检查输入时出错:预期conv2d_1_input具有形状(28,28,1)但是具有形状的数组(3,224,224)

时间:2018-06-14 14:44:15

标签: python keras deep-learning convolutional-neural-network

我该如何解决? 我使用的代码显示在下面

这是用于将图像转换为矢量

import cv2
import numpy as np

file = cv2.imread('17316.png')
file = cv2.resize(file, (224, 224))
file = cv2.cvtColor(file, cv2.COLOR_BGR2RGB)
file = np.array(file).reshape((1, 3, 224, 224))
print(file.shape[0])

这是由我应用的卷积神经网络的一部分导致该错误我该怎么做,如何解决它请建议我更改代码以便我可以对我的数据集进行适当的预测?

model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),
                 activation='relu',
                 input_shape=input_shape))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))

2 个答案:

答案 0 :(得分:1)

从错误信息中可以看出,模型期望图像形状为(28,28,1)。因此,在将图像输入模型之前,请尝试调整图像大小。

file = cv2.imread('17316.png')
file = cv2.resize(file, (28, 28))
file = cv2.cvtColor(file, cv2.COLOR_BGR2GRAY)
file = file.reshape((-1, 28, 28,1))

这将解决问题。

答案 1 :(得分:0)

请发贴您的完整代码? input_shape的价值是多少?我认为你应该把它设置为(3,224,224)。显然,您的data_format是channels_first,根据Keras conv2d documentation,默认值为channels_last。所以,我建议您使用第一个卷积层

model.add(Conv2D(32, kernel_size = (3, 3),
                 activation = 'relu',
                 input_shape = (3, 224, 224), 
                 data_format = "channels_first")

更新:根据您的代码,以下内容应该有效,但可能无法生成您想要的结果。您正在训练mnist数据集,该数据集需要28x28x1格式的图像,因此您必须调整大小,如Mitiku的答案所示。我希望这会有所帮助。

import keras
import cv2 
import numpy as np 
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten 
from keras.layers import Conv2D, MaxPooling2D 
from keras import backend as K 

batch_size = 128 
num_classes = 10 
epochs = 1 
img_rows, img_cols = 28, 28
(x_train, y_train), (x_test, y_test) = mnist.load_data() 

if K.image_data_format() == 'channels_first': 
    x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols) 
    x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols) 
    input_shape = (1, img_rows, img_cols) 
else: 
    x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1) 
    x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1) 
    input_shape = (img_rows, img_cols, 1) 
    x_train = x_train.astype('float32')

x_test = x_test.astype('float32') 
x_train /= 255 
x_test /= 255 
print('x_train shape:', x_train.shape) 
print(x_train.shape[0], 'train samples') 
print(x_test.shape[0], 'test samples') 
y_train = keras.utils.to_categorical(y_train, num_classes) 
y_test = keras.utils.to_categorical(y_test, num_classes)

model = Sequential() 
model.add(Conv2D(32, kernel_size=(3, 3), activation='relu',\
                 input_shape = input_shape))
model.add(Conv2D(64, (3, 3), activation='relu')) 
model.add(MaxPooling2D(pool_size=(2, 2))) 
model.add(Dropout(0.25)) 
model.add(Flatten()) 
model.add(Dense(128, activation='relu')) 
model.add(Dropout(0.5)) 
model.add(Dense(num_classes, activation='softmax')) 
model.compile(loss=keras.losses.categorical_crossentropy, \
              optimizer=keras.optimizers.Adadelta(), \
              metrics=['accuracy'])

model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, \
          verbose=1, validation_data=(x_test, y_test)) 
score = model.evaluate(x_test, y_test, verbose=0) 

print('Test loss:', score[0]) 
print('Test accuracy:', score[1]) 

file = cv2.imread('17316.png') 
file = cv2.resize(file, (28, 28))
file = cv2.cvtColor(file, cv2.COLOR_BGR2GRAY)
file = file.reshape((28, 28,1))

model.predict(np.expand_dims(file, axis = 0))

更新2: mnist数据集有10个类。您有二进制分类问题。您的输出将图像分类为类8,它对应于数字7,因为mnist数据集类是0到9之间的数字。我们必须知道类是如何编码的 - 这是特定于问题的。在这种情况下,要返回您可以执行的操作:

prediction = model.predict(np.expand_dims(file, axis = 0))
prediction = np.squeeze(prediction)
index = np.where(prediction == 1)[0]
number = (index - 1).item()
print("predicted number for my image: ", number)

最后一行返回预测包含1的索引,并且索引从1开始,您可以从索引中减去一个以获得与您的图像对应的数字。