web-dev-qa-db-ja.com

model.fit_generatorを使用するときに混同マトリックスを取得する方法

Model.fit_generatorを使用して、フォルダーから直接入力画像を提供しているため、バイナリ(2クラス)モデルのトレーニングと結果の取得を行っています。この場合の混同行列(TP、TN、FP、FN)の取得方法も、一般に_confusion_matrix_の_sklearn.metrics_コマンドを使用して取得します。これには、predictedおよびactualラベルが必要です。しかし、ここには両方はありません。 predict=model.predict_generator(validation_generator)コマンドから予測ラベルを計算できるかもしれません。しかし、モデルがどのように画像から入力ラベルを取得しているかはわかりません。入力フォルダーの一般的な構造は次のとおりです。

_train/
 class1/
     img1.jpg
     img2.jpg
     ........
 class2/
     IMG1.jpg
     IMG2.jpg
test/
 class1/
     img1.jpg
     img2.jpg
     ........
 class2/
     IMG1.jpg
     IMG2.jpg
     ........
_

私のコードのいくつかのブロックは次のとおりです。

_train_generator = train_datagen.flow_from_directory('train',  
        target_size=(50, 50),  batch_size=batch_size,
        class_mode='binary',color_mode='grayscale')  


validation_generator = test_datagen.flow_from_directory('test',
        target_size=(50, 50),batch_size=batch_size,
        class_mode='binary',color_mode='grayscale')

model.fit_generator(
        train_generator,steps_per_Epoch=250 ,epochs=40,
        validation_data=validation_generator,
        validation_steps=21 )
_

したがって、上記のコードは自動的に2つのクラス入力を取りますが、どのクラスでクラス0を考慮し、どのクラス1を考慮するかはわかりません。

10
Hitesh

keras.utils.Sequenceを使用して、次の方法で管理しました。

from sklearn.metrics import confusion_matrix
from keras.utils import Sequence


class MySequence(Sequence):
    def __init__(self, *args, **kwargs):
        # initialize
        # see manual on implementing methods

    def __len__(self):
        return self.length

    def __getitem__(self, index):
        # return index-th complete batch


# create data generator
data_gen = MySequence(evaluation_set, batch_size=10) 

n_batches = len(data_gen)

confusion_matrix(
    np.concatenate([np.argmax(data_gen[i][1], axis=1) for i in range(n_batches)]),    
    np.argmax(m.predict_generator(data_gen, steps=n_batches), axis=1) 
)

実装されたクラスは、データのバッチをタプルで返します。これにより、すべてのデータをRAMに保持できなくなります。 __getitem__で実装する必要があり、このメソッドは同じ引数に対して同じバッチを返す必要があることに注意してください。

残念ながら、このコードはデータを2回繰り返します。1回目は返されたバッチから真の回答の配列を作成し、2回目はモデルのpredictメソッドを呼び出します。

4
wl2776

次のように、class_indicesまたはtrain_generatorオブジェクトで属性validation_generatorを呼び出すことにより、クラス名からクラスインデックスへのマッピングを表示できます。

train_generator.class_indices

2
probabilities = model.predict_generator(generator=test_generator)

確率のセットを提供します。

y_true = test_generator.classes

私たちに本当のラベルを与えます。

これはバイナリ分類の問題であるため、予測ラベルを見つける必要があります。それを行うには、使用することができます

y_pred = probabilities > 0.5

次に、テストデータセットに真のラベルと予測ラベルがあります。したがって、混同行列は次のように与えられます

font = {
'family': 'Times New Roman',
'size': 12
}
matplotlib.rc('font', **font)
mat = confusion_matrix(y_true, y_pred)
plot_confusion_matrix(conf_mat=mat, figsize=(8, 8), show_normed=False)
1