Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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)

code:

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)

lenet.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:

ValueError: Error when checking : expected conv2d_1_input to have 4      dimensions, but got array with shape (28, 28)

HELP!!!

like image 298
thisisbhavin Avatar asked Mar 28 '17 17:03

thisisbhavin


People also ask

Can we use CNN for prediction?

We see that the CNN model is able to identify the pattern and is able to predict the next steps. Full code is available at this Github link and you are free to use it. Also, code for multiple steps in the future is also included which you can use with stock price data.


1 Answers

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.

like image 72
Marcin Możejko Avatar answered Oct 06 '22 14:10

Marcin Możejko