I have been developing a CNN with tensorflow, and I have obtained good results, accuracy .92, loss .3, val_accuracy .85 and val_loss .5, however, when looking at the confusion matrix I see that only 30% of the images are classified correctly, and when it comes to producing a classification_report it appears to me that it has a little more than 15% accuracy, this even using the validation data set and the training data set. Why could this happen? How could I solve it? I leave my complete code below:
data_generator=ImageDataGenerator(rescale=1./255.0)
data_generator_filters = ImageDataGenerator(rescale=1./255.0,
rotation_range=40,
width_shift_range=0.2, height_shift_range=0.2,
shear_range=0.2, zoom_range=0.2,
horizontal_flip=True,vertical_flip=True)
train_images=data_generator_filters.flow_from_directory(train_dir)
test_images=data_generator.flow_from_directory(test_dir)
model = Sequential()
model.add(Conv2D(32, (2,2), 1, activation='relu', input_shape=(256, 256, 3), kernel_initializer='he_normal'))
model.add(BatchNormalization())
model.add(Conv2D(64, (2,2), 2, activation='relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D())
model.add(Dropout(0.2))
model.add(Conv2D(128, (2,2), 1, activation='relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D())
model.add(Dropout(0.2))
model.add(Conv2D(128,(2,2), 1, activation='relu'))
model.add(BatchNormalization())
model.add(Conv2D(256,(2,2), 1, activation='relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D())
model.add(Dropout(0.2))
model.add(Conv2D(256, (2,2), 1, activation='relu'))
model.add(BatchNormalization())
model.add(Conv2D(128, (2,2), 1, activation='relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D())
model.add(Dropout(0.2))
model.add(Conv2D(64, (2,2), 1, activation='relu'))
model.add(BatchNormalization())
model.add(Conv2D(32, (2,2), 1, activation='relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D())
model.add(Flatten())
model.add(Dropout(0.2))
model.add(Dense(32, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(11, activation='softmax'))
model.summary()
model.compile('adam', loss=tf.losses.CategoricalCrossentropy(from_logits=True), metrics=['accuracy'])
checkpoint_val_accuracy = ModelCheckpoint(filepath='/kaggle/working/AlertAI-accuracy-model.keras',
verbose=1,
monitor='val_accuracy',
save_best_only=True,
save_weights_only=False)
checkpoint_val_loss = ModelCheckpoint(filepath='/kaggle/working/AlertAI-loss-model.keras',
verbose=1,
monitor='val_loss',
save_best_only=True,
save_weights_only=False)
hist = model.fit(train_images, epochs=13, validation_data=test_images, callbacks=[checkpoint_val_accuracy, checkpoint_val_loss])
predictions = model.predict(train_images)
predicted_classes = np.argmax(predictions, axis=1)
true_classes = train_images.classes
class_labels = list(train_images.class_indices.keys())
report = metrics.classification_report(true_classes, predicted_classes, target_names=class_labels)
print(report)
I tried to see if the problem was something related to overfitting, however it does not make sense, since the val_accuracy is precisely a way to see if there is overfitting and it obtained an accuracy of .87
Carlos Ramirez is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.