# import required packages import cv2 from keras.models import Sequential from keras.layers import Conv2D, MaxPooling2D, Dense, Dropout, Flatten from keras.optimizers import Adam from keras.preprocessing.image import ImageDataGenerator from sklearn.utils.class_weight import compute_class_weight import numpy as np # Initialize image data generator with rescaling train_data_gen = ImageDataGenerator(rescale=1./255) validation_data_gen = ImageDataGenerator(rescale=1./255) # Preprocess all test images train_generator = train_data_gen.flow_from_directory( 'data/train', target_size=(48, 48), batch_size=64, color_mode="grayscale", class_mode='categorical') # Calculate class weights class_labels = train_generator.classes class_weights = compute_class_weight(class_weight = "balanced", classes= np.unique(class_labels), y= class_labels) class_weight_dict = dict(enumerate(class_weights)) # Preprocess all train images validation_generator = validation_data_gen.flow_from_directory( 'data/test', target_size=(48, 48), batch_size=64, color_mode="grayscale", class_mode='categorical') # create model structure emotion_model = Sequential() emotion_model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(48, 48, 1))) emotion_model.add(Conv2D(64, kernel_size=(3, 3), activation='relu')) emotion_model.add(MaxPooling2D(pool_size=(2, 2))) emotion_model.add(Dropout(0.25)) emotion_model.add(Conv2D(128, kernel_size=(3, 3), activation='relu')) emotion_model.add(MaxPooling2D(pool_size=(2, 2))) emotion_model.add(Conv2D(128, kernel_size=(3, 3), activation='relu')) emotion_model.add(MaxPooling2D(pool_size=(2, 2))) emotion_model.add(Dropout(0.25)) emotion_model.add(Flatten()) emotion_model.add(Dense(1024, activation='relu')) emotion_model.add(Dropout(0.5)) emotion_model.add(Dense(3, activation='softmax')) cv2.ocl.setUseOpenCL(False) emotion_model.compile(loss='categorical_crossentropy', optimizer=Adam(lr=0.0001), metrics=['accuracy']) # Train the neural network/model emotion_model_info = emotion_model.fit_generator( train_generator, steps_per_epoch=len(train_generator) // 64, epochs=100, validation_data=validation_generator, validation_steps=7178 // 64, class_weight=class_weight_dict) # save model structure in jason file model_json = emotion_model.to_json() with open("model/emotion_model.json", "w") as json_file: json_file.write(model_json) # save trained model weight in .h5 file emotion_model.save_weights('model/emotion_model.h5')