title: How to predict input image using trained model in Keras?
body: <p>I'm only beginning with keras and machine learning in general.</p>
  
  <p>I trained a model to classify images from 2 classes and saved it using <code>model.save()</code>. Here is the code I used:</p>
  
  <pre><code>from keras.preprocessing.image import ImageDataGenerator
  from keras.models import Sequential
  from keras.layers import Conv2D, MaxPooling2D
  from keras.layers import Activation, Dropout, Flatten, Dense
  from keras import backend as K
  
  
  # dimensions of our images.
  img_width, img_height = 320, 240
  
  train_data_dir = 'data/train'
  validation_data_dir = 'data/validation'
  nb_train_samples = 200  #total
  nb_validation_samples = 10  # total
  epochs = 6
  batch_size = 10
  
  if K.image_data_format() == 'channels_first':
      input_shape = (3, img_width, img_height)
  else:
      input_shape = (img_width, img_height, 3)
  
  model = Sequential()
  model.add(Conv2D(32, (3, 3), input_shape=input_shape))
  model.add(Activation('relu'))
  model.add(MaxPooling2D(pool_size=(2, 2)))
  
  model.add(Conv2D(32, (3, 3)))
  model.add(Activation('relu'))
  model.add(MaxPooling2D(pool_size=(2, 2)))
  
  model.add(Conv2D(64, (3, 3)))
  model.add(Activation('relu'))
  model.add(MaxPooling2D(pool_size=(2, 2)))
  
  model.add(Flatten())
  model.add(Dense(64))
  model.add(Activation('relu'))
  model.add(Dropout(0.5))
  model.add(Dense(1))
  model.add(Activation('sigmoid'))
  
  model.compile(loss='binary_crossentropy',
                optimizer='rmsprop',
                metrics=['accuracy'])
  
  # this is the augmentation configuration we will use for training
  train_datagen = ImageDataGenerator(
      rescale=1. / 255,
      shear_range=0.2,
      zoom_range=0.2,
      horizontal_flip=True)
  
  # this is the augmentation configuration we will use for testing:
  # only rescaling
  test_datagen = ImageDataGenerator(rescale=1. / 255)
  
  train_generator = train_datagen.flow_from_directory(
      train_data_dir,
      target_size=(img_width, img_height),
      batch_size=batch_size,
      class_mode='binary')
  
  validation_generator = test_datagen.flow_from_directory(
      validation_data_dir,
      target_size=(img_width, img_height),
      batch_size=batch_size,
      class_mode='binary')
  
  model.fit_generator(
      train_generator,
      steps_per_epoch=nb_train_samples // batch_size,
      epochs=epochs,
      validation_data=validation_generator,
      validation_steps=5)
  
  model.save('model.h5')
  </code></pre>
  
  <p>It successfully trained with 0.98 accuracy which is pretty good. To load and test this model on new images, I used the below code:</p>
  
  <pre><code>from keras.models import load_model
  import cv2
  import numpy as np
  
  model = load_model('model.h5')
  
  model.compile(loss='binary_crossentropy',
                optimizer='rmsprop',
                metrics=['accuracy'])
  
  img = cv2.imread('test.jpg')
  img = cv2.resize(img,(320,240))
  img = np.reshape(img,[1,320,240,3])
  
  classes = model.predict_classes(img)
  
  print classes
  </code></pre>
  
  <p>It outputs:</p>
  
  <blockquote>
    <p>[[0]]</p>
  </blockquote>
  
  <p>Why wouldn't it give out the actual name of the class and why <code>[[0]]</code>?</p>
  
  <p>Thanks in advance.</p>