Как получить прогнозы с помощьюgnast_generator для потоковых тестовых данных в Keras?


16

В блоге Keras, посвященном обучению пользователей с нуля , код показывает только сеть, работающую с данными обучения и проверки. Как насчет тестовых данных? Являются ли данные проверки такими же, как данные испытаний (я думаю, что нет). Если в строках, похожих на папки с поездами и валидацией, была отдельная папка с тестами, как получить матрицу путаницы для тестовых данных? Я знаю, что для этого мы должны использовать Scikit Learn или какой-то другой пакет, но как мне получить что-то похожее на классовые вероятности для тестовых данных? Я надеюсь использовать это для матрицы путаницы.


1
Вы можете вызвать функцию model.predict_generator (...) с генератором, который считывает данные из каталога, содержащего набор тестов. Он возвращает прогнозы, которые вы можете использовать для расчета матрицы путаницы. Это то, что вы ищете? Смотрите здесь для документов: keras.io/models/sequential
stmax

1
Да, я видел это. Предсказатель_генератор возвращает список предсказаний, представляющий собой список значений с плавающей запятой в диапазоне от 0 до 1. Как мне это интерпретировать? Его нельзя напрямую использовать с матрицей путаницы.
Рагурам

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

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 для заполнения массива?
Gegenwind

Я не уверен, но я думаю, что вместо 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 возвращает список значений с плавающей запятой, которые не могут быть использованы для вычисления матрицы путаницы.
Рагурам

На каких данных вы экспериментируете?
enterML

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