Kerasのストリーミングテストデータでpredict_generatorで予測を取得する方法は?


16

Kerasゼロからトレーニングconvnetsにブログ、コードのショーは唯一のネットワークは、トレーニングや検証データ上で実行されています。テストデータはどうですか?検証データはテストデータと同じですか(そうではないと思います)。trainおよびvalidationフォルダーと同様の行に個別のテストフォルダーがあった場合、テストデータの混同マトリックスを取得する方法を教えてください。これを行うにはscikit learnまたは他のパッケージを使用する必要があることはわかっていますが、テストデータのクラスごとの確率に沿って何かを取得するにはどうすればよいですか?これを混同行列に使用したいと思っています。


1
テストセットを含むディレクトリからデータを読み取るジェネレーターでmodel.predict_generator(...)関数を呼び出すことができます。予測を返します。これを使用して、混同行列を計算できます。それはあなたが探しているものですか?ドキュメントはこちらをご覧ください:keras.io/models/sequential
stmax

1
はい、私はそれを見ました。predict_generatorは、0〜1の浮動小数点値のリストである予測のリストを返します。これをどのように解釈しますか?混同マトリックスで直接使用することはできません。
ラグフラム

2
predict_generatorはまだ試していません(かなり新しい)が、クラスの確率を返すようです。<= 0.5から0および> 0.5から1の値を変換してみてください。0と1で構成されるリストができたら、混同行列を計算するための関数にフィードできます。
stmax

2
余談ですが、これは2つのクラスの問題ではうまくいきますが、3つ以上のクラスがある場合はどうでしょうか?
ラグフラム

1
クラスが3つ以上ある場合、ネットワークには複数の出力が必要です。n個のクラスの場合、n個の出力があり、最高の出力を持つクラスを予測します。softmax関数(en.wikipedia.org/wiki/Softmax_function)をご覧ください
stmax

回答:


15

テストデータから混同マトリックスを取得するには、2つのステップを実行する必要があります。

  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のドキュメントでは、トレーニングデータ、検証データ、テストデータの3つの異なるデータセットを使用しています。トレーニングデータは、モデルパラメーターを最適化するために使用されます。検証データは、エポックの数など、メタパラメーターに関する選択を行うために使用されます。最適なメタパラメータでモデルを最適化した後、テストデータを使用して、モデルのパフォーマンスの公正な推定値を取得します。


2
コードスニペットをありがとう。これら2つをリンクできますか?この例では、y_trueにダミーデータが入力されているようです。generator.classesを使用して配列を作成しますか?
Gegenwind

私は確かではないんだけど、私は考えるのではなく、np.array([0] * 1000 + [1] * 1000)あなたがやって、同じ配列を取得することができますgenerator.classes
メフディNellenを

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()、予測を行う前にそれを使用してリセットしてください。


0

混同マトリックスには、sklearnパッケージを使用する必要があります。Kerasが混同マトリックスを提供できるとは思わない。テストセットの値を予測するには、model.predict()メソッドを呼び出して、テストセットの予測を生成するだけです。出力値のタイプは、モデルのタイプ、つまり離散または確率に依存します。


答えてくれてありがとう。Kerasには独自の混同マトリックスパッケージがないことは知っています。私の質問は、model.predict_generatorが、混乱行列の計算に使用できないfloat値のリストを返すということです。
ラグフラム

どのようなデータを実験していますか?
enterML

私は画像に取り組んでいます。
ラグフラム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.