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.