Bagaimana cara mendapatkan prediksi dengan predict_generator saat streaming data uji dalam Keras?

16

Dalam blog Keras tentang konjeksi pelatihan dari awal , kode hanya menampilkan jaringan yang menjalankan data pelatihan dan validasi. Bagaimana dengan data uji? Apakah data validasi sama dengan data uji (saya pikir tidak). Jika ada folder tes terpisah pada baris yang sama seperti folder train dan validasi, bagaimana kita mendapatkan matriks kebingungan untuk data pengujian. Saya tahu bahwa kita harus menggunakan scikit belajar atau beberapa paket lain untuk melakukan ini, tetapi bagaimana saya mendapatkan sesuatu di sepanjang garis probabilitas kelas bijaksana untuk data uji? Saya berharap untuk menggunakan ini untuk matriks kebingungan.

Raghuram
sumber
1
Anda dapat memanggil fungsi model.predict_generator (...) dengan generator yang membaca data dari direktori yang berisi kumpulan tes. Ini mengembalikan prediksi, yang dapat Anda gunakan untuk menghitung matriks kebingungan. Itukah yang kamu cari? Lihat di sini untuk dokumen: keras.io/models/afterential
stmax
1
Ya, saya memang melihatnya. predict_generator mengembalikan daftar prediksi yang merupakan daftar nilai float antara 0 dan 1. Bagaimana cara menafsirkan ini? Itu tidak bisa langsung digunakan dengan matriks kebingungan.
Raghuram
2
Saya belum mencoba predict_generator (ini agak baru), tetapi sepertinya mengembalikan probabilitas kelas. Cobalah untuk mengkonversi nilai <= 0,5 ke 0 dan> 0,5 ke 1. Setelah Anda memiliki daftar yang terdiri dari 0s dan 1s Anda dapat memasukkannya ke fungsi untuk menghitung matriks kebingungan.
stmax
2
Selain itu, ini akan bekerja dengan baik untuk dua masalah kelas, tetapi bagaimana jika ada lebih dari dua kelas?
Raghuram
1
Jika ada lebih dari dua kelas, jaringan Anda membutuhkan lebih dari satu output. Untuk kelas n Anda memiliki output n dan Anda memprediksi kelas yang memiliki output tertinggi. Lihatlah fungsi softmax ( en.wikipedia.org/wiki/Softmax_function ).
stmax

Jawaban:

15

Untuk mendapatkan matriks kebingungan dari data uji, Anda harus melalui dua langkah:

  1. Buat prediksi untuk data uji

Misalnya, gunakan model.predict_generatoruntuk memprediksi 2000 probabilitas pertama dari generator tes.

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. Hitung matriks kebingungan berdasarkan prediksi label

Misalnya, bandingkan probabilitasnya dengan kasus masing-masing ada 1000 kucing dan 1000 anjing.

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)

Catatan tambahan pada data pengujian dan validasi

Dokumentasi Keras menggunakan tiga set data yang berbeda: data pelatihan, data validasi dan data uji. Data pelatihan digunakan untuk mengoptimalkan parameter model. Data validasi digunakan untuk membuat pilihan tentang meta-parameter, misalnya jumlah zaman. Setelah mengoptimalkan model dengan meta-parameter optimal, data uji digunakan untuk mendapatkan estimasi kinerja model yang adil.

Pieter
sumber
2
Terima kasih atas cuplikan kode. Bisakah Anda menautkan keduanya? Dalam contoh Anda, y_true tampaknya diisi dengan data dummy. Apakah Anda menggunakan generator.classes untuk mengisi array?
Gegenwind
Saya tidak yakin, tapi saya pikir alih-alih np.array([0] * 1000 + [1] * 1000)Anda bisa mendapatkan array yang sama dengan melakukangenerator.classes
Mehdi Nellen
2

Berikut adalah beberapa kode yang saya coba dan bekerja untuk saya:

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)

Anda kemudian dapat menggunakan:

print (confusion matrix(predicted_class_indices,labels)

Pastikan Anda menggunakan shuffle=Falsedi generator pengujian Anda (dalam kasus saya ini generator validasi) dan reset menggunakan validation_generator.reset()sebelum Anda membuat prediksi.

ranahd
sumber
0

Untuk matriks kebingungan Anda harus menggunakan paket sklearn. Saya tidak berpikir Keras dapat memberikan matriks kebingungan. Untuk memprediksi nilai pada set tes, cukup panggil metode model.predict () untuk menghasilkan prediksi untuk set tes. Jenis nilai output tergantung pada tipe model Anda yaitu diskrit atau probabilitas.

enterML
sumber
Terima kasih atas jawabannya. Saya tahu bahwa Keras tidak memiliki paket matriks kebingungan sendiri. Pertanyaan saya adalah model.predict_generator mengembalikan daftar nilai float yang tidak dapat digunakan untuk menghitung matriks kebingungan.
Raghuram
Jenis data apa yang Anda coba?
masukkan ML
Saya sedang mengerjakan gambar.
Raghuram