-
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)) | |
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 3592macro 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_divisionparameter 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 !
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
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_divisionparameter to control this behavior. _warn_prf(average, modifier, msg_start, len(result))