pythontensorflowtensorflow-datasets

Input image is not compatible with tensorflow model input shape


I was building a model and I wanted to test its performance, thus I imported a local file and load it and try to predict its label with the following code:

from tensorflow.preprocessing import image
# Other imports for tensorlfow etc.

#...

# Sample image
img_path = "./Model/data/brain/train/Glioma/images/gg (2).jpg"
img = image.load_img(img_path,target_size=(256,256))
arr = image.img_to_array(img)
t_img = tf.convert_to_tensor(arr)
print(t_img.shape) # Returns (256,256,3)
# Client testing
client = Client("brain") # Custom Class. Contains model: Sequential (compiled and trained)
client.predict(img=t_img) # Calls self.model.predict(t_img)

However I get the following error:

Invalid input shape for input Tensor("data:0", shape=(32, 256, 3), dtype=float32). Expected shape (None, 256, 256, 3), but input has incompatible shape (32, 256, 3)

I have an input layer in the trained model which has input_shape=[256,256,3] (comes from image width, height, and rgb values)

Can you help me understand the issue and solve it?


Solution

  • Dr. Snoopy already gave the answer in the comments, but for the sake of completeness a short solution copied from the TF load_image page:

    image = keras.utils.load_img(image_path)
    input_arr = keras.utils.img_to_array(image)
    input_arr = np.array([input_arr])  # Convert single image to a batch.
    predictions = model.predict(input_arr)
    

    model.predict() expects batches of images. This solultion would transform your (256, 256, 3) shape to (1, 256, 256, 3). There are also other solutions, e.g. with tf.expand_dims(image, 0) if you rather want to work with tensors directly instead of arrays.