Як отримати прогнози за допомогою predict_generator на потокових тестових даних у Керасі?


16

У блозі Кераса, який навчає коннетів з нуля , код показує лише мережу, що працює на даних про навчання та перевірку. Що з тестовими даними? Чи збігаються дані перевірки як дані тестування (я думаю, що ні). Якщо в папках поїзда та валідації була окрема тестова папка, схожа на теки поїздів та перевірки, то як нам отримати матрицю плутанини для тестових даних. Я знаю, що для цього нам потрібно використовувати scikit learn або якийсь інший пакет, але як я можу щось отримати відповідно до класу розумних ймовірностей для тестових даних? Я сподіваюся використовувати це для матриці плутанини.


1
Ви можете викликати функцію model.predict_generator (...) за допомогою генератора, який зчитує дані з каталогу, що містить тестовий набір. Він повертає прогнози, які можна використовувати для обчислення матриці плутанини. Це те, що ви шукаєте? Дивіться тут документи: keras.io/models/sequences
stmax

1
Так, я це бачив. predict_generator повертає список передбачень, який є переліком значень поплавця між 0 і 1. Як я інтерпретую це? Його не можна безпосередньо використовувати з матрицею плутанини.
Рагурам

2
Я ще не пробував predict_generator (він досить новий), але, схоже, повертає ймовірності класу. Спробуйте перетворити значення <= 0,5 до 0 і> 0,5 до 1. Після того, як у вас є список, що складається з 0s і 1s, ви можете подати його до функції обчислення матриці плутанини.
stmax

2
Що стосується цього, це спрацює нормально для двох класових проблем, але що робити, якщо є більше двох класів?
Рагурам

1
Якщо існує більше двох класів, вашій мережі потрібно більше одного виходу. Для n класів у вас n виходів, і ви прогнозуєте клас, який має найвищий результат. Погляньте на функцію softmax ( en.wikipedia.org/wiki/Softmax_function ).
stmax

Відповіді:


15

Щоб отримати матрицю плутанини з тестових даних, слід пройти два кроки:

  1. Робіть прогнози для даних тесту

Наприклад, використовуйте model.predict_generatorдля прогнозування перших 2000 ймовірностей з тестового генератора.

generator = datagen.flow_from_directory(
        'data/test',
        target_size=(150, 150),
        batch_size=16,
        class_mode=None,  # only data, no labels
        shuffle=False)  # keep data in same order as labels

probabilities = model.predict_generator(generator, 2000)
  1. Обчисліть матрицю плутанини на основі прогнозів міток

Наприклад, порівняйте ймовірність із випадком, що тут відповідно 1000 котів та 1000 собак.

from sklearn.metrics import confusion_matrix

y_true = np.array([0] * 1000 + [1] * 1000)
y_pred = probabilities > 0.5

confusion_matrix(y_true, y_pred)

Додаткова примітка щодо даних випробувань та перевірки

Документація Keras використовує три різні набори даних: дані про навчання, дані валідації та дані тесту. Дані тренінгу використовуються для оптимізації параметрів моделі. Дані перевірки використовуються для вибору мета-параметрів, наприклад, кількості епох. Після оптимізації моделі з оптимальними мета-параметрами тестові дані використовуються для отримання справедливої ​​оцінки продуктивності моделі.


2
Дякуємо за фрагменти коду Не могли б ви пов’язати це двоє? У вашому прикладі y_true, здається, заповнений фіктивними даними. Чи використовуєте Ви generator.classes для заповнення масиву?
Гегенвінд

Я не впевнений, але я думаю, що замість np.array([0] * 1000 + [1] * 1000)вас можна отримати той самий масив, зробивши цеgenerator.classes
Мехді Неллен

2

Ось код, який я спробував і працював для мене:

pred= model.predict_generator(validation_generator, nb_validation_samples // batch_size)
predicted_class_indices=np.argmax(pred,axis=1)
labels = (validation_generator.class_indices)
labels2 = dict((v,k) for k,v in labels.items())
predictions = [labels[k] for k in predicted_class_indices]
print(predicted_class_indices)
print (labels)
print (predictions)

Потім ви можете використовувати:

print (confusion matrix(predicted_class_indices,labels)

Переконайтеся, що ви використовуєте shuffle=Falseу своєму тестовому генераторі (у моєму випадку це генератор валідації) та скиньте його за допомогою, validation_generator.reset()перш ніж робити свої прогнози.


0

Для матриці плутанини вам потрібно використовувати пакет sklearn. Я не думаю, що Керас може надати матрицю плутанини. Для прогнозування значень тестового набору просто зателефонуйте методу model.predict () для створення прогнозів для тестового набору. Тип вихідних значень залежить від типу вашої моделі, тобто або дискретних чи ймовірних.


Дякую за відповідь. Я знаю, що у Кераса немає власного пакету матриць плутанини. Моє запитання полягає в тому, що model.predict_generator повертає список значень float, які не можна використовувати для обчислення матриці плутанини.
Рагурам

Які дані ви експериментуєте?
enterML

Я працюю над образами.
Рагурам
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.