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を考慮するかはわかりません。
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
メソッドを呼び出します。
次のように、class_indices
またはtrain_generator
オブジェクトで属性validation_generator
を呼び出すことにより、クラス名からクラスインデックスへのマッピングを表示できます。
train_generator.class_indices
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)