Keras 使用model.fit_生成器时如何获取混淆矩阵
我使用model.fit_生成器来训练我的二进制(两类)模型并获得结果,因为我直接从文件夹中提供输入图像。在这种情况下,如何获得混淆矩阵(TP、TN、FP、FN),因为我通常使用Keras 使用model.fit_生成器时如何获取混淆矩阵,keras,confusion-matrix,Keras,Confusion Matrix,我使用model.fit_生成器来训练我的二进制(两类)模型并获得结果,因为我直接从文件夹中提供输入图像。在这种情况下,如何获得混淆矩阵(TP、TN、FP、FN),因为我通常使用sklearn.metrics的命令来获得它,这需要预测的和实际的标签。但在这里我并没有两者都有。可能我可以从predict=model.predict\u生成器(验证\u生成器)命令计算预测标签。但我不知道我的模型是如何从我的图像中获取输入标签的。我的输入文件夹的一般结构是: train/ class1/
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左右查看。第二个视频没有像第一个视频那样完整详细地介绍创建矩阵的过程。您是如何将其识别为二进制分类的,对不起,我对所有这些都不熟悉