-
Star
(129)
You must be signed in to star a gist -
Fork
(34)
You must be signed in to fork a gist
-
-
Save RyanAkilos/3808c17f79e77c4117de35aa68447045 to your computer and use it in GitHub Desktop.
import numpy as np | |
from keras import backend as K | |
from keras.models import Sequential | |
from keras.layers.core import Dense, Dropout, Activation, Flatten | |
from keras.layers.convolutional import Convolution2D, MaxPooling2D | |
from keras.preprocessing.image import ImageDataGenerator | |
from sklearn.metrics import classification_report, confusion_matrix | |
#Start | |
train_data_path = 'F://data//Train' | |
test_data_path = 'F://data//Validation' | |
img_rows = 150 | |
img_cols = 150 | |
epochs = 30 | |
batch_size = 32 | |
num_of_train_samples = 3000 | |
num_of_test_samples = 600 | |
#Image Generator | |
train_datagen = ImageDataGenerator(rescale=1. / 255, | |
rotation_range=40, | |
width_shift_range=0.2, | |
height_shift_range=0.2, | |
shear_range=0.2, | |
zoom_range=0.2, | |
horizontal_flip=True, | |
fill_mode='nearest') | |
test_datagen = ImageDataGenerator(rescale=1. / 255) | |
train_generator = train_datagen.flow_from_directory(train_data_path, | |
target_size=(img_rows, img_cols), | |
batch_size=batch_size, | |
class_mode='categorical') | |
validation_generator = test_datagen.flow_from_directory(test_data_path, | |
target_size=(img_rows, img_cols), | |
batch_size=batch_size, | |
class_mode='categorical') | |
# Build model | |
model = Sequential() | |
model.add(Convolution2D(32, (3, 3), input_shape=(img_rows, img_cols, 3), padding='valid')) | |
model.add(Activation('relu')) | |
model.add(MaxPooling2D(pool_size=(2, 2))) | |
model.add(Convolution2D(32, (3, 3), padding='valid')) | |
model.add(Activation('relu')) | |
model.add(MaxPooling2D(pool_size=(2, 2))) | |
model.add(Convolution2D(64, (3, 3), padding='valid')) | |
model.add(Activation('relu')) | |
model.add(MaxPooling2D(pool_size=(2, 2))) | |
model.add(Flatten()) | |
model.add(Dense(64)) | |
model.add(Activation('relu')) | |
model.add(Dropout(0.5)) | |
model.add(Dense(5)) | |
model.add(Activation('softmax')) | |
model.compile(loss='categorical_crossentropy', | |
optimizer='rmsprop', | |
metrics=['accuracy']) | |
#Train | |
model.fit_generator(train_generator, | |
steps_per_epoch=num_of_train_samples // batch_size, | |
epochs=epochs, | |
validation_data=validation_generator, | |
validation_steps=num_of_test_samples // batch_size) | |
#Confution Matrix and Classification Report | |
Y_pred = model.predict_generator(validation_generator, num_of_test_samples // batch_size+1) | |
y_pred = np.argmax(Y_pred, axis=1) | |
print('Confusion Matrix') | |
print(confusion_matrix(validation_generator.classes, y_pred)) | |
print('Classification Report') | |
target_names = ['Cats', 'Dogs', 'Horse'] | |
print(classification_report(validation_generator.classes, y_pred, target_names=target_names)) | |
gabrielakuhn
commented
Jul 8, 2022
•
Hello, can anyone help me to solve this problem please? There is no prediction for Class 2, how do I solve this?
This is my code:
test_dataset = test.flow_from_directory('testdata/', target_size=(i_size, j_size), batch_size=128, class_mode='binary', color_mode="grayscale")
Y_pred = model.predict(test_dataset, 129)
y_pred = np.argmax(Y_pred, axis=1)
print('Confusion Matrix')
print(confusion_matrix(test_dataset.classes, y_pred))
print('Classification Report')
labels_names = ['C1', 'C2']
print(classification_report(test_dataset.classes, y_pred, target_names=labels_names))
Found 3592 images belonging to 2 classes.
29/29 [==============================] - 6s 207ms/step
Confusion Matrix
[[1796 0]
[1796 0]]
Classification Report
precision recall f1-score support
C1 0.50 1.00 0.67 1796
C2 0.00 0.00 0.00 1796
accuracy 0.50 3592
macro avg 0.25 0.50 0.33 3592
weighted avg 0.25 0.50 0.33 3592
UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use zero_division
parameter to control this behavior. _warn_prf(average, modifier, msg_start, len(result))
Hello, can anyone help me to solve this problem please? There is no prediction for Class 2, how do I solve this? This is my code:
test_dataset = test.flow_from_directory('testdata/', target_size=(i_size, j_size), batch_size=128, class_mode='binary', color_mode="grayscale")
Y_pred = model.predict(test_dataset, 129)
y_pred = np.argmax(Y_pred, axis=1)
print('Confusion Matrix')
print(confusion_matrix(test_dataset.classes, y_pred))
print('Classification Report')
labels_names = ['C1', 'C2']
print(classification_report(test_dataset.classes, y_pred, target_names=labels_names))
Found 3592 images belonging to 2 classes. 29/29 [==============================] - 6s 207ms/step Confusion Matrix [[1796 0] [1796 0]] Classification Report precision recall f1-score supportC1 0.50 1.00 0.67 1796 C2 0.00 0.00 0.00 1796 accuracy 0.50 3592
macro avg 0.25 0.50 0.33 3592 weighted avg 0.25 0.50 0.33 3592
UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use
zero_division
parameter to control this behavior. _warn_prf(average, modifier, msg_start, len(result))
it seems that some labels in y_test don't appear in y_pred, see this .
Hi!, very good gist.
I think you have to put shuffle=False when you do test_datagen.flow_from_directory() so the samples don't get shuffled and have the same order as validation_generator.classesVery good comment man!
I was struggling to understand why my model had good metrics, but when predicting without the 'Shuffle = False' I got bad results. Thank you so much !