title: keras cnn training accuacy and loss do not change and val loss and accuracy remains 0
body: <p>i am working on face expression classification problem, i downloaded some images from internet and some i clicked by myself of expression happy (100 pics), sad(100 pics), neutral(50 pics) and distracted(50) pics, as the data is very less i am using data augmentation and training a CNN from the example in keras documentation, also as i am working on kaggle notebook i am not saving the augemted data i am converting to array and appending with the original data.
  you can try the code yourself at <a href="https://www.kaggle.com/avidavi/expression-detect/" rel="nofollow noreferrer">avidavi</a></p>
  <pre><code>import pandas as pd
  import numpy as np
  from keras.models import Sequential
  from keras.layers.core import Activation, Dropout, Dense, Flatten
  from keras.layers import Conv2D, MaxPooling2D
  from keras.models import Model
  from keras.optimizers import SGD
  from PIL import Image
  from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img
  from keras.utils import np_utils
  
  #loading from csv
  train = pd.read_csv(r'/kaggle/input/traindata/train.csv')
  #each row is of 9217 features in which first 9216(96*96) are image converted to array 
  #and last column is label
  #labels = {1:'happy', 2:'sad', 3:'neutral', 4:'distracted'}
  #below i am defining data generator
  datagen = ImageDataGenerator(
      rotation_range=40,
      width_shift_range=0.2,
      height_shift_range=0.2,
      shear_range=0.0,
      zoom_range=0.1,
      horizontal_flip=True,
      vertical_flip=False,
      fill_mode='nearest')
  
  #below converting array for suitable shapes for keras, as these are gray scale images so 1 channel
  train_array = train.values
  print(train_array.shape)
  y_train_array= train_array[:,-1]
  X_train_array = train_array[:,:-1].reshape(train_array.shape[0],96,96,1)
  # del train_array
  print(X_train_array.shape, y_train_array.shape)
  
  #below creating 20 more images for each image and creating a new array
  X_test_arr = []
  y_test_arr = []
  for i in range(X_train_array.shape[0]):
      j=0
      for batch in datagen.flow(x=X_train_array[i].reshape(1,96,96,1), y=y_train_array[i].reshape(1,), batch_size=1):
          j+=1
          X_test_arr.append(batch[0].reshape(96,96))
          y_test_arr.append(batch[1])
          if j == 20:
              break
  
  #even though i am creating 20 or 50 augmented images or normalizing them or converting to int 
  # output accuracy does not change
  
  #creating arrays from above list
  y_aug_arr = np.array(y_test_arr)
  X_aug_arr = np.array(X_test_arr)
  
  #appending augmented data to original data
  X_train_array = np.r_[X_train_array, X_aug_arr]
  y_train_array = np.r_[y_train_array, y_aug_arr]
  
  #reshaping for keras input
  X_train_array = X_train_array.reshape(X_train_array.shape[0], X_train_array.shape[1], X_train_array.shape[2], 1)
  
  #creating model, i have used adam, rmsprop accuracy does not change while using SGD accuracy drops to almost 0
  model = Sequential()
  model.add(Conv2D(32, (3, 3), input_shape=(96, 96, 1)))
  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(Conv2D(64, (3, 3)))
  model.add(Activation('relu'))
  model.add(MaxPooling2D(pool_size=(2, 2)))
  
  model.add(Flatten())  # this converts our 3D feature maps to 1D feature vectors
  model.add(Dense(64))
  model.add(Activation('relu'))
  model.add(Dropout(0.5))
  model.add(Dense(1))
  model.add(Activation('softmax'))
  
  model.compile(loss='categorical_crossentropy',
                optimizer='adam',
                metrics=['accuracy'])
  model.summary()
  
  #fitting model
  batch_size = 32
  epochs = 2
  history = model.fit(X_train_array, y_train_array.reshape(-1), batch_size=batch_size, epochs=epochs, verbose=1, validation_split=0.1)
  
  #output is same no matter what i do
  Epoch 1/2
  200/200 [==============================] - 34s 169ms/step - loss: 0.0000e+00 - accuracy: 0.3957 - val_loss: 0.0000e+00 - val_accuracy: 0.0000e+00
  Epoch 2/2
  200/200 [==============================] - 34s 168ms/step - loss: 0.0000e+00 - accuracy: 0.3957 - val_loss: 0.0000e+00 - val_accuracy: 0.0000e+00
      
  </code></pre>