CNN низкая точность кошек против набора данных собак - PullRequest
0 голосов
/ 21 января 2020

У меня есть папка с поездом, которая содержит папку с кошками (5000 изображений внутри) и папку с собаками (4000 фотографий внутри). Кроме того, у меня есть папка с тестами, которая содержит папку с кошками (2500 изображений) и папку с собаками (2000 фотографий). Я написал приведенный ниже код для применения классификации изображений CNN

Код:

from keras.models import Sequential
from keras.layers import Conv2D,Activation,MaxPooling2D,Dense,Flatten,Dropout
import numpy as np
from keras.preprocessing.image import ImageDataGenerator
from IPython.display import display
import matplotlib.pyplot as plt
from PIL import Image
from sklearn.metrics import classification_report, confusion_matrix
classifier = Sequential()
classifier.add(Conv2D(32,(3,3),input_shape=(64,64,3)))
classifier.add(Activation('relu'))
classifier.add(MaxPooling2D(pool_size =(2,2)))
classifier.add(Conv2D(32,(3,3)))
classifier.add(Activation('relu'))
classifier.add(MaxPooling2D(pool_size =(2,2)))
classifier.add(Conv2D(64,(3,3)))
classifier.add(Activation('relu'))
classifier.add(MaxPooling2D(pool_size =(2,2)))
classifier.add(Flatten())
classifier.add(Dense(64))
classifier.add(Activation('relu'))
classifier.add(Dropout(0.5))
classifier.add(Dense(1))
classifier.add(Activation('sigmoid'))
classifier.summary()
classifier.compile(optimizer ='rmsprop',
                   loss ='binary_crossentropy',
                   metrics =['accuracy'])
train_datagen = ImageDataGenerator(rescale =1./255,
                                   shear_range =0.2,
                                   zoom_range = 0.2,
                                   horizontal_flip =True)
test_datagen = ImageDataGenerator(rescale = 1./255)

batchsize=500
training_set = train_datagen.flow_from_directory('/home/osboxes/Downloads/dogs-vs-cats/train/',
                                                target_size=(64,64),
                                                batch_size= batchsize,
                                                class_mode='binary')

test_set = test_datagen.flow_from_directory('/home/osboxes/Downloads/dogs-vs-cats/test/',
                                           target_size = (64,64),
                                           batch_size = batchsize,
                       shuffle=False,
                                           class_mode ='binary')
history=classifier.fit_generator(training_set,
                        steps_per_epoch =9000/batchsize,
                        epochs = 3,
                        validation_data =test_set,
                        validation_steps = 4500/batchsize)

Y_pred = classifier.predict_generator(test_set, 4500 / batchsize)
y_pred = np.argmax(Y_pred, axis=1)
print('Confusion Matrix')
print(confusion_matrix(test_set.classes, y_pred))
print('Classification Report')
target_names = ['cats', 'dogs']
print(classification_report(test_set.classes, y_pred, target_names=target_names))
print(history.history.keys())
# summarize history for accuracy
plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.title('model accuracy')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['train', 'test'], loc='upper left')
plt.show()
# summarize history for loss
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('model loss')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['train', 'test'], loc='upper left')
plt.show()

Полученная матрица путаницы:

Матрица путаницы

[[ 2500 0]

[2000 0]]

Мои вопросы:

1- Почему все экземпляры собак были классифицированы как кошка

2- Можно ли иметь разные номера образцов в папке для кошек и собак? Или папка тестирования? Или они должны быть точно такими же?

3- Как добавить классификатор нескольких классов, если мне нужно добавить, например, изображения лошадей?

1 Ответ

0 голосов
/ 21 января 2020

1 - потому что вы положили classifier.add(Dense(1)), что означает, что у вас есть только один класс. Поскольку у вас их два, вы должны поставить classifier.add(Dense(2)) и изменить потерю на loss ='categorical_crossentropy'

2 - Да, небольшая разница между количеством изображений в каждом классе - это нормально (но это не должно быть так много разница)

3- Измените потери, как я уже сказал, и положите classifier.add(Dense(3))

И лучше использовать Адам-оптимизатор , а также использовать BatchNormalization() перед каждым Activation() функция.

...