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

16

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

Raghuram
источник
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 использует три различных набора данных: данные обучения, данные проверки и данные испытаний. Данные обучения используются для оптимизации параметров модели. Данные проверки используются для выбора мета-параметров, например, количества эпох. После оптимизации модели с оптимальными мета-параметрами тестовые данные используются для получения достоверной оценки производительности модели.

Pieter
источник
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()прежде чем делать свои прогнозы.

ranahd
источник
0

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

enterML
источник
Спасибо за ответ. Я знаю, что у Кераса нет собственного пакета матриц путаницы. Мой вопрос заключается в том, что model.predict_generator возвращает список значений с плавающей запятой, которые не могут быть использованы для вычисления матрицы путаницы.
Рагурам
На каких данных вы экспериментируете?
enterML
Я работаю над изображениями.
Рагурам