I have a simple classification model with 4 different classes, stop, go, right, left traffic hand signals. After the second epoch i get the same accuracy for the rest of the epochs. I have tried using different datasets as well thinking it was a data issue.
def fit_cnn_model(X_train, Y_train, X_test, Y_test, savedir, num_layers=2, num_filters=64, kernel_size=3, pool_size=2, dropout_rate=0.3, learning_rate=0.0001, n_epochs=10, batch_size=64, verbose=2): model = Sequential() date_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") for _ in range(num_layers): model.add(Conv2D(filters=num_filters, kernel_size=kernel_size, activation='relu', padding='same', kernel_initializer='he_uniform')) model.add(BatchNormalization()) model.add(MaxPooling2D(pool_size=pool_size)) model.add(Dropout(dropout_rate)) model.add(Flatten()) model.add(Dense(128, activation='relu')) model.add(Dense(4, activation='softmax')) opt = Adam(learning_rate=learning_rate) model.compile(optimizer=opt, loss='categorical_crossentropy', metrics=['accuracy']) history = model.fit(X_train, Y_train, epochs=n_epochs, batch_size=batch_size, validation_data=(X_test, Y_test), verbose=verbose) model.summary() scores = model.evaluate(X_test, Y_test, verbose=0) print("Loss: {:.2f}".format(scores[0])) print("Accuracy: {:.2f}%".format(scores[1] * 100)) model_path = os.path.join(savedir, 'saved_model_'+ date_time +'.h5') model.save(model_path) print(f"Model saved to {model_path}") return modeldef load_data(image_folder, label_folder, target_size=(224, 224)): # Load and sort dataset image_files = os.listdir(image_folder) label_files = os.listdir(label_folder) image_files.sort() label_files.sort() images = [] labels = [] # Load images and labels for img_file in image_files: img_path = os.path.join(image_folder, img_file) label_file = img_file.replace(".jpg", ".txt").replace(".jpeg", ".txt") label_path = os.path.join(label_folder, label_file) img = Image.open(img_path).resize(target_size) img_array = np.array(img) / 255.0 images.append(img_array) with open(label_path, 'r') as f: label_str = f.readline().strip() label_dict = {'stop': 0, 'continue': 1, 'left': 2, 'right': 3} label = label_dict.get(label_str, -1) if label == -1: raise ValueError("Unknown label: {}".format(label_str)) labels.append(label) images = np.array(images) labels = np.array(labels) labels = to_categorical(labels, 4) X_train, X_test, Y_train, Y_test = train_test_split(images, labels, test_size=0.2) return X_train, Y_train, X_test, Y_test
I have tried slightly tweaking the learning rate, drop out, layers, and filters. Also used a different proven dataset.