Keras: model.predict for a single image

You can load the image with desired width and height, convert it to a numpy array with the shape of (image_width, image_height, number_of_channels) and then change the shape of the array to (1, image_width, image_height, number_of_channels). (batch_size =1)

import numpy as np
from keras.preprocessing import image

img_width, img_height = 150, 150
img = image.load_img('image_path/image_name.jpg', target_size = (img_width, img_height))
img = image.img_to_array(img)
img = np.expand_dims(img, axis = 0)

model.predict(img)

Even though this doesn't solve your error, make sure and rescale your image if you have done that previously. For instance, my training generator looks like:

train_datagen = ImageDataGenerator(
   rotation_range=40,
   zoom_range=[0.7, 0.9],
   horizontal_flip=True,
   rescale=1./255
)

So when I go to predict a single image:

from PIL import Image
import numpy as np
from skimage import transform
def load(filename):
   np_image = Image.open(filename)
   np_image = np.array(np_image).astype('float32')/255
   np_image = transform.resize(np_image, (256, 256, 3))
   np_image = np.expand_dims(np_image, axis=0)
   return np_image

 image = load('my_file.jpg')
 model.predict(image)

I have to also rescale it by 255.


Since you trained your model on mini-batches, your input is a tensor of shape [batch_size, image_width, image_height, number_of_channels].

When predicting, you have to respect this shape even if you have only one image. Your input should be of shape: [1, image_width, image_height, number_of_channels].

You can do this in numpy easily. Let's say you have a single 5x5x3 image:

    >>> x = np.random.randint(0,10,(5,5,3))
    >>> x.shape
    >>> (5, 5, 3)
    >>> x = np.expand_dims(x, axis=0)
    >>> x.shape
    >>> (1, 5, 5, 3)

Now x is a rank 4 tensor!