如何找出概率输出中的每一列对应于使用 Keras 解决多类分类问题的类?

数据挖掘 神经网络 喀拉斯 张量流 图像识别
2021-09-28 09:29:25

我正在使用迁移学习在 Keras 中使用预训练的 VGG 网络构建图像识别模型,并排除最终的全连接层以获得输出权重。然后,我使用这些输出权重来输入我的新模型,该模型有几层以及我自己正在训练的一个新的全连接层。全连接层映射到我试图预测的输出类的数量。

一切正常。但是,当我运行时:

results = model.predict(img_tensor)

我得到与每个类对应的输出概率,类似于以下内容:

print(results)

[[0.1426621  0.6193871  0.23795079]
 [0.11187755 0.6208466  0.2672758 ]
 [0.10050113 0.3768951  0.52260375]
 [0.1338948  0.59470254 0.27140263]
 [0.06612041 0.69726    0.2366195 ]
 [0.12080433 0.495977   0.38321865]]

如何找出概率输出中的每一列对应的类?

Keras 是否有任何内置功能来识别输出概率的哪一列对应于哪个类?

2个回答

class_indicesKeras 中的属性在flow_from_directory(directory)输出数组中创建类及其索引的字典:

类:类子目录的可选列表(例如[‘dogs’, ‘cats’])。默认值:无。如果未提供,则将自动从目录下的子目录名称/结构中推断出类列表,其中每个子目录将被视为不同的类(并且将映射到标签索引的类的顺序将是字母数字)。包含从类名到类索引的映射的字典可以通过属性获得 class_indices

来源

我很想看看人们如何将其纳入他们的工作流程/脚本中......

probas_to_classes()然后,您可以使用实用程序函数选择最可能的类。例子:

y_proba = model.predict(x)
y_classes = keras.np_utils.probas_to_classes(y_proba)

这等效model.predict_classes(x)于 Sequential 模型。

使用生成器时,

generator= train_datagen.flow_from_directory("train", batch_size=batch_size)
 label_map = (generator.class_indices)

label_map 变量是一个字典,然后可以从中得出概率分数和类名之间的关系。

基本上,您可以通过此代码创建此字典。

from glob import glob
class_names = glob("*") # Reads all the folders in which images are present
class_names = sorted(class_names) # Sorting them
name_id_map = dict(zip(class_names, range(len(class_names))))

希望这可以帮助..