Como obter previsões com o forecast_generator no streaming de dados de teste no Keras?

16

No blog Keras sobre convnets de treinamento do zero , o código mostra apenas a rede em execução nos dados de treinamento e validação. E os dados de teste? Os dados de validação são os mesmos que os dados de teste (acho que não). Se havia uma pasta de teste separada em linhas semelhantes às pastas de treinamento e validação, como obter uma matriz de confusão para os dados de teste. Sei que precisamos usar o scikit learn ou algum outro pacote para fazer isso, mas como obtenho algo parecido com as probabilidades de classe para dados de teste? Espero usar isso para a matriz de confusão.

Raghuram
fonte
11
Você pode chamar a função model.predict_generator (...) com um gerador que lê dados de um diretório que contém o conjunto de testes. Ele retorna as previsões, que você pode usar para calcular uma matriz de confusão. É isso que você está procurando? Veja aqui para documentos: keras.io/models/sequential
stmax
11
Sim, eu vi isso. predict_generator retorna uma lista de previsões, que é uma lista de valores flutuantes entre 0 e 1. Como interpreto isso? Não pode ser usado diretamente com a matriz de confusão.
Raghuram
2
Ainda não tentei o predict_generator (é novo), mas parece retornar probabilidades de classe. Tente converter valores <= 0,5 para 0 e> 0,5 para 1. Depois de ter uma lista composta por 0s e 1s, você pode alimentá-la com a função de cálculo da matriz de confusão.
stmax
2
Como um aparte, isso funcionará bem para problemas de duas classes, mas e se houver mais de duas classes?
Raghuram
11
Se houver mais de duas classes, sua rede precisará de mais de uma saída. Para n classes, você tem n saídas e prevê a classe que tem a saída mais alta. Veja a função softmax ( pt.wikipedia.org/wiki/Softmax_function ).
stmax

Respostas:

15

Para obter uma matriz de confusão a partir dos dados de teste, você deve seguir duas etapas:

  1. Faça previsões para os dados de teste

Por exemplo, use model.predict_generatorpara prever as primeiras 2000 probabilidades do gerador de teste.

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. Calcular a matriz de confusão com base nas previsões do rótulo

Por exemplo, compare as probabilidades com o caso de haver 1000 gatos e 1000 cães, respectivamente.

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)

Nota adicional sobre dados de teste e validação

A documentação do Keras usa três conjuntos diferentes de dados: dados de treinamento, dados de validação e dados de teste. Os dados de treinamento são usados ​​para otimizar os parâmetros do modelo. Os dados de validação são usados ​​para fazer escolhas sobre os meta-parâmetros, por exemplo, o número de épocas. Após a otimização de um modelo com meta-parâmetros ideais, os dados de teste são usados ​​para obter uma estimativa justa do desempenho do modelo.

Pieter
fonte
2
Obrigado pelos trechos de código. Você poderia ligar esses dois? No seu exemplo, y_true parece estar preenchido com dados fictícios. Você usaria generator.classes para preencher a matriz?
Gegenwind 10/0318
Não tenho certeza, mas acho que, em vez de np.array([0] * 1000 + [1] * 1000)você, pode obter a mesma matriz fazendogenerator.classes
Mehdi Nellen
2

Aqui está um código que tentei e trabalhei para mim:

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)

Você pode então usar:

print (confusion matrix(predicted_class_indices,labels)

Certifique-se de usar shuffle=Falseem seu gerador de teste (no meu caso, é um gerador de validação) e redefina-o usando validation_generator.reset()antes de fazer suas previsões.

ranahd
fonte
0

Para matriz de confusão, você deve usar o pacote sklearn. Não acho que Keras possa fornecer uma matriz de confusão. Para prever valores no conjunto de testes, basta chamar o método model.predict () para gerar previsões para o conjunto de testes. O tipo de valores de saída depende do tipo de modelo, ou seja, discreto ou probabilidades.

enterML
fonte
Obrigado pela resposta. Eu sei que Keras não tem seu próprio pacote de matriz de confusão. Minha pergunta é que model.predict_generator retorna uma lista de valores flutuantes que não podem ser usados ​​para calcular a matriz de confusão.
Raghuram
Com que tipo de dados você está experimentando?
enterML
Eu estou trabalhando em imagens.
Raghuram