Матрица путаницы в Керасе + Тензор потока - PullRequest
0 голосов
/ 25 апреля 2018

Q1

Я обучил модель CNN и сохранил ее как model.h5. Я пытаюсь обнаружить 3 объекта. Скажем, «кошка», «собака» и «другие». В моем тестовом наборе 300 изображений, по 100 из каждой категории. Первые 100 - это «кошка», вторые 100 - это «собака», а третьи 100 - «другое». Я использую Keras класс ImageDataGenerator и flow_from_directory. Вот пример кода:

test_datagen = ImageDataGenerator(rescale=1./255)
test_generator = test_datagen.flow_from_directory(
        test_dir,
        target_size=(150, 150),
        batch_size=20,
        class_mode='sparse',
        shuffle=False)

Теперь использовать

from sklearn.metrics import confusion_matrix

cnf_matrix = confusion_matrix(y_test, y_pred)

Мне нужны y_test и y_pred. Я могу получить y_pred используя следующий код:

probabilities = model.predict_generator(test_generator)
y_pred = np.argmax(probabilities, axis=1)
print (y_pred)

[0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 1 0 0 0 0 0 0 1 0 0 0
 0 0 0 0 1 0 0 0 0 1 2 0 2 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 1
 0 2 0 0 0 0 1 0 0 0 0 0 0 1 0 2 0 1 0 0 1 0 0 1 0 0 1 1 1 1 1 1 1 1 1 1 2
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1
 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 2 2 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 2
 1 1 1 1 1 2 1 1 1 1 1 2 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 1 2 2 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2
 2 2 2 2]

Что в основном предсказывает объекты как 0,1 и 2. Теперь я знаю, что первый 100 объект (кошка) равен 0, 2-й объект 100 (собака) равен 1 и 3-й объект 100 (другой) равен 2. Должен ли я создать список вручную, используя numpy, где первая 100 баллов равна 0, вторая 100 баллов равна 1, а третья 100 баллов равна 2, чтобы получить y_test? Есть ли класс Keras, который может это сделать (создать y_test)?

Q2

Как я могу увидеть неправильно обнаруженные объекты. Если вы посмотрите на print(y_pred), 3-й пункт равен 1, что неверно предсказано. Как можно увидеть это изображение, не заходя в мою папку «test_dir» вручную?

1 Ответ

0 голосов
/ 25 апреля 2018

Поскольку вы не используете никакого дополнения и shuffle=False, вы можете просто получить изображения из генератора:

imgBatch = next(test_generator)
    #it may be interesting to create the generator again if 
    #you're not sure it has output exactly all images before

Постройте каждое изображение в imgBatch, используя библиотеку печати, такую ​​как Pillow (PIL) или MatplotLib.

Для отображения только нужных изображений сравните y_test с y_pred:

compare = y_test == y_pred

position = 0
while position < len(y_test):
    imgBatch = next(test_generator)
    batch = imgBatch.shape[0]

    for i in range(position,position+batch):
        if compare[i] == False:
            plot(imgBatch[i-position])

    position += batch
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...