title: Why are the predictions going wrong with MNIST CNN?
body: <p>I trained the CNN on MNIST dataset with training and validation accuracy of ~0.99.</p>
  
  <p>I followed the exact steps from the example given at the <a href="https://keras.io/examples/mnist_cnn/" rel="nofollow noreferrer">Keras documentation of implementing CNN with MNIST dataset</a>:</p>
  
  <pre><code>import cv2
  import numpy as np
  import tensorflow.keras as keras
  import math
  
  from __future__ import print_function
  import keras
  from keras.datasets import mnist
  from keras.models import Sequential
  from keras.layers import Dense, Dropout, Flatten
  from keras.layers import Conv2D, MaxPooling2D
  from keras import backend as K
  
  batch_size = 128
  num_classes = 10
  epochs = 12
  
  # input image dimensions
  img_rows, img_cols = 28, 28
  
  # the data, split between train and test sets
  (x_train, y_train), (x_test, y_test) = mnist.load_data()
  
  if K.image_data_format() == 'channels_first':
      x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols)
      x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols)
      input_shape = (1, img_rows, img_cols)
  else:
      x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
      x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
      input_shape = (img_rows, img_cols, 1)
  
  x_train = x_train.astype('float32')
  x_test = x_test.astype('float32')
  x_train /= 255
  x_test /= 255
  print('x_train shape:', x_train.shape)
  print(x_train.shape[0], 'train samples')
  print(x_test.shape[0], 'test samples')
  
  # convert class vectors to binary class matrices
  y_train = keras.utils.to_categorical(y_train, num_classes)
  y_test = keras.utils.to_categorical(y_test, num_classes)
  
  model = Sequential()
  model.add(Conv2D(32, kernel_size=(3, 3),
                  activation='relu',
                  input_shape=input_shape))
  model.add(Conv2D(64, (3, 3), activation='relu'))
  model.add(MaxPooling2D(pool_size=(2, 2)))
  model.add(Dropout(0.25))
  model.add(Flatten())
  model.add(Dense(128, activation='relu'))
  model.add(Dropout(0.5))
  model.add(Dense(num_classes, activation='softmax'))
  
  model.compile(loss=keras.losses.categorical_crossentropy,
              optimizer=keras.optimizers.Adadelta(),
              metrics=['accuracy'])
  
  model.fit(x_train, y_train,
          batch_size=batch_size,
          epochs=epochs,
          verbose=1,
          validation_data=(x_test, y_test))
  score = model.evaluate(x_test, y_test, verbose=0)
  print('Test loss:', score[0])
  print('Test accuracy:', score[1])
  </code></pre>
  
  <p>When I tested the following image:</p>
  
  <p><a href="https://i.stack.imgur.com/tDNlc.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/tDNlc.png" alt="enter image description here"></a></p>
  
  <p>using the following test code:</p>
  
  <pre><code>img = cv2.imread("m9.png", 0)
  img = cv2.resize(img, (28,28))
  img = img / 255.
  
  
  prob = model.predict_proba(img.reshape((1,28, 28, 1)))
  
  print(prob)
  
  model.predict_classes(img.reshape((1,28, 28, 1)))
  </code></pre>
  
  <p>The class it prints out is <code>array([1])</code> , denoting number <code>1</code>. I could not understand the reason for it. Did I try to predict in an incorrect way?</p>
  
  <p>Exactly same class <code>array([1])</code> was predicted for number <code>8</code> as shown below:</p>
  
  <p><a href="https://i.stack.imgur.com/TfA5m.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/TfA5m.png" alt="enter image description here"></a></p>
  
  <p>It looks like I have made an error during prediction? I tried to understand what could be happening but could not understand.</p>