Come ottenere previsioni con predict_generator sullo streaming dei dati di test in Keras?


16

Nel blog di Keras sulle reti di addestramento da zero , il codice mostra solo la rete in esecuzione sui dati di addestramento e convalida. E i dati dei test? I dati di validazione sono gli stessi dei dati di test (penso di no). Se esiste una cartella di test separata su linee simili a quella del treno e delle cartelle di convalida, come possiamo ottenere una matrice di confusione per i dati del test. So che dobbiamo usare scikit learn o qualche altro pacchetto per fare questo, ma come posso ottenere qualcosa sulla falsariga di saggezza di classe per i dati di test? Spero di usarlo per la matrice di confusione.


1
È possibile chiamare la funzione model.predict_generator (...) con un generatore che legge i dati da una directory contenente il set di test. Restituisce le previsioni, che è possibile utilizzare per calcolare una matrice di confusione. È quello che stai cercando? Vedi qui per i documenti: keras.io/models/sequential
stmax,

1
Sì, l'ho visto. predict_generator restituisce un elenco di previsioni che è un elenco di valori float compresi tra 0 e 1. Come posso interpretarlo? Non può essere utilizzato direttamente con la matrice di confusione.
Raghuram,

2
Non ho ancora provato predict_generator (è piuttosto nuovo), ma sembra restituire probabilità di classe. Prova a convertire i valori <= 0,5 a 0 e> 0,5 a 1. Una volta che hai un elenco composto da 0 e 1 secondi, puoi inviarlo alla funzione per il calcolo della matrice di confusione.
stmax,

2
A parte questo, funzionerà bene per due problemi di classe, ma cosa succede se ci sono più di due classi?
Raghuram

1
Se ci sono più di due classi, la tua rete ha bisogno di più di un output. Per n classi hai n output e prevedi la classe che ha l'output più alto. Dai un'occhiata alla funzione softmax ( en.wikipedia.org/wiki/Softmax_function ).
stmax,

Risposte:


15

Per ottenere una matrice di confusione dai dati del test, è necessario eseguire due passaggi:

  1. Fai previsioni per i dati del test

Ad esempio, utilizzare model.predict_generatorper prevedere le prime 2000 probabilità dal generatore di test.

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. Calcola la matrice di confusione in base alle previsioni dell'etichetta

Ad esempio, confrontare le probabilità con il caso in cui vi siano rispettivamente 1000 gatti e 1000 cani.

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 aggiuntiva sui dati di test e validazione

La documentazione di Keras utilizza tre diversi set di dati: dati di addestramento, dati di validazione e dati di test. I dati di allenamento vengono utilizzati per ottimizzare i parametri del modello. I dati di validazione sono usati per fare delle scelte sui meta-parametri, ad es. Il numero di epoche. Dopo aver ottimizzato un modello con meta-parametri ottimali, i dati del test vengono utilizzati per ottenere una stima corretta delle prestazioni del modello.


2
Grazie per i frammenti di codice. Potresti collegare quei due? Nel tuo esempio y_true sembra essere popolato con dati fittizi. Utilizzeresti generator.classes per popolare l'array?
Gegenwind

Non ne sono certo, ma penso che invece di np.array([0] * 1000 + [1] * 1000)te puoi ottenere lo stesso array facendogenerator.classes
Mehdi Nellen

2

Ecco un po 'di codice che ho provato e lavorato per me:

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)

È quindi possibile utilizzare:

print (confusion matrix(predicted_class_indices,labels)

Assicurati di utilizzare shuffle=Falsenel tuo generatore di test (nel mio caso è generatore di validazione) e ripristinalo usando validation_generator.reset()prima di fare le tue previsioni.


0

Per la matrice di confusione devi usare il pacchetto sklearn. Non credo che Keras possa fornire una matrice di confusione. Per prevedere i valori sul set di test, è sufficiente chiamare il metodo model.predict () per generare previsioni per il set di test. Il tipo di valori di output dipende dal tipo di modello, ovvero discreto o probabilità.


Grazie per la risposta. So che Keras non ha il suo pacchetto matrice di confusione. La mia domanda è che model.predict_generator restituisce un elenco di valori float che non possono essere utilizzati per calcolare la matrice di confusione.
Raghuram,

Su che tipo di dati stai sperimentando?
enterML

Sto lavorando alle immagini.
Raghuram,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.