[英]how to predict my own image using cnn in keras after training on MNIST dataset
I have made a convolutional neural.network to predict handwritten digits using MNIST dataset but now I am stuck at predicting my own image as input to cnn,I have saved weights after training cnn and want to use that to predict my own image (NOTE: care is taken that my input image is 28x28)我已经制作了一个卷积神经网络来使用 MNIST 数据集预测手写数字,但现在我坚持预测我自己的图像作为 cnn 的输入,我在训练 cnn 后保存了权重并想用它来预测我自己的图像(注意:注意我的输入图像是 28x28)
code:代码:
new_mnist.py: new_mnist.py:
ap = argparse.ArgumentParser()
ap.add_argument("-s", "--save-model", type=int, default=-1,
help="(optional) whether or not model should be saved to disk")
ap.add_argument("-l", "--load-model", type=int, default=-1,
help="(optional) whether or not pre-trained model should be loaded")
ap.add_argument("-w", "--weights", type=str,
help="(optional) path to weights file")
args = vars(ap.parse_args())
# fix random seed for reproducibility
seed = 7
numpy.random.seed(seed)
# load data
print("[INFO] downloading data...")
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# reshape to be [samples][pixels][width][height]
X_train = X_train.reshape(X_train.shape[0], 1, 28, 28).astype('float32')
X_test = X_test.reshape(X_test.shape[0], 1, 28, 28).astype('float32')
print(X_test.shape[0])
# normalize inputs from 0-255 to 0-1
X_train = X_train / 255
X_test = X_test / 255
# one hot encode outputs
y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)
num_classes = y_test.shape[1]
# build the model
print("[INFO] compiling model...")
model = LeNet.build(num_classes = num_classes,weightsPath = args["weights"] if args["load_model"] > 0 else None)
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
if args["load_model"] < 0:
# Fit the model
print("[INFO] training...")
model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=1, batch_size=200, verbose=2)
# Final evaluation of the model
print("[INFO] evaluating...")
scores = model.evaluate(X_test, y_test, verbose=0)
print("Baseline Error: %.2f%%" % (100-scores[1]*100))
elif args["load_model"] > 0:
im = imread("C:\\Users\\Divyesh\\Desktop\\mnist.png")
im = im/255
pr = model.predict_classes(im)
print(pr)
# check to see if the model should be saved to file
if args["save_model"] > 0:
print("[INFO] dumping weights to file...")
model.save_weights(args["weights"], overwrite=True)
l.net.py: l.net.py:
class LeNet:
@staticmethod
def build(num_classes,weightsPath = None):
# create model
model = Sequential()
model.add(Convolution2D(30, 5, 5, border_mode='valid', input_shape=(1, 28, 28), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Convolution2D(15, 3, 3, activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.2))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(50, activation='relu'))
model.add(Dense(num_classes, activation='softmax'))
# Compile model
#model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
if weightsPath is not None:
model.load_weights(weightsPath)
return model
in new_mnist.py I have called predict(im) in which im is 28x28 image but after running this program I get error as:在 new_mnist.py 中,我调用了 predict(im),其中 im 是 28x28 图像,但在运行该程序后出现错误:
ValueError: Error when checking : expected conv2d_1_input to have 4 dimensions, but got array with shape (28, 28)
HELP!!!帮助!!!
Try: 尝试:
pr = model.predict_classes(im.reshape((1, 1, 28, 28)))
Here : first dimension comes from examples (you need to specify it even if you have only one example), second comes from channels (as it seems that you use Theano
backend) and rest are spatial dimensions. 这里:第一个维度来自示例(即使您只有一个示例,也需要指定它),第二个来自通道(因为它似乎使用
Theano
后端),其余是空间维度。
It should be noted that the images must be uploaded in grayscale.需要注意的是,上传的图片必须是灰度的。
im = im[:,:,0]
import cv2
im = cv2.imread('C:\\Users\\Divyesh\\Desktop\\mnist.png', cv2.IMREAD_GRAYSCALE)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.