Keras 使用model.fit_生成器时如何获取混淆矩阵

Keras 使用model.fit_生成器时如何获取混淆矩阵,keras,confusion-matrix,Keras,Confusion Matrix,我使用model.fit_生成器来训练我的二进制(两类)模型并获得结果,因为我直接从文件夹中提供输入图像。在这种情况下,如何获得混淆矩阵(TP、TN、FP、FN),因为我通常使用sklearn.metrics的命令来获得它,这需要预测的和实际的标签。但在这里我并没有两者都有。可能我可以从predict=model.predict\u生成器(验证\u生成器)命令计算预测标签。但我不知道我的模型是如何从我的图像中获取输入标签的。我的输入文件夹的一般结构是: train/ class1/

我使用model.fit_生成器来训练我的二进制(两类)模型并获得结果,因为我直接从文件夹中提供输入图像。在这种情况下,如何获得混淆矩阵(TP、TN、FP、FN),因为我通常使用
sklearn.metrics
命令来获得它,这需要
预测的
实际的
标签。但在这里我并没有两者都有。可能我可以从
predict=model.predict\u生成器(验证\u生成器)
命令计算预测标签。但我不知道我的模型是如何从我的图像中获取输入标签的。我的输入文件夹的一般结构是:

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 )

<> p> >上面的代码自动接受两个类的输入,但我不知道它认为第0类和第1类。

您可以通过调用属性<代码> > class索引>代码>在您的<代码> TrasyGuiels< /COD>或<代码>验证>生成器< /代码>对象,如< < /P> >中查看类名到类索引的映射。
train\u generator.class\u index

我使用
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中。请注意,它必须在
中实现,并且该方法必须为同一参数返回同一批

不幸的是,这段代码重复数据两次:第一次,它从返回的批中创建一个真实答案数组,第二次调用模型的
predict
方法

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)

你的帮助很有价值。当我键入
train\u generator.class\u index
validation\u generator.class\u index
时,它会给我输出
{'class1':0,'class2':1}
。假设对于测试数据,两个类都有10个样本(总共20个),那么我的输入类将类似于[0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1]?我将从
predict=model.predict\u generator(validation\u generator)
获得输出类,然后我可以得到混淆矩阵。@Hitesh我对你的问题有点困惑。如果你想知道class_索引的输出是如何映射到你的底层标签的,请看我在这里解释这一点的视频。输出显示在4:20左右。此外,您从predict_generator获得的输出将是您用于混淆矩阵的输出。您能否展开a,但说明如何从predict_generator转换为混淆矩阵。@bw4sz一旦您从predict_generator获得预测以及这些预测的标签,您就可以使用sklearn的混淆矩阵绘制结果。我在这里演示了这个过程:注意,在那个视频中,我们使用predict()而不是predict_generator()进行预测,但概念是一样的。看了这一段之后,如果您想看到predict_generator()的过程,请在5:30左右查看。第二个视频没有像第一个视频那样完整详细地介绍创建矩阵的过程。您是如何将其识别为二进制分类的,对不起,我对所有这些都不熟悉