能否发布您的完整代码? 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 开始,您可以从索引中减去 1 以获得与您的图像对应的数字。