从Keras功能模型中获取类标签

Led*_*dzz 53 python keras

我在Keras有一个功能模型(来自repo示例的Resnet50).我训练了它ImageDataGeneratorflow_from_directory数据并将模型保存到.h5文件中.当我打电话时,model.predict我得到了一组类概率.但我想将它们与类标签相关联(在我的例子中 - 文件夹名称).我怎么能得到它们?我发现我可以使用model.predict_classesmodel.predict_proba,但我在功能模型中没有这些功能,只在Sequential中.

Emi*_*ova 53

y_prob = model.predict(x) 
y_classes = y_prob.argmax(axis=-1)
Run Code Online (Sandbox Code Playgroud)

如此处所示.

  • 这给了我抵消,但我已经有办法解决这个问题......我如何获得标签名称? (14认同)
  • Keras按字母顺序对标签(列车目录中的文件夹名称)进行排序.如果你有一个名为`labels`的标签列表,预测的标签名称将是:`predict_label = sorted(labels)[y_classes]` (3认同)
  • 嘿@Guillaume,你能给我指出提到“字母顺序”的文档吗?这是一个非常重要的信息,我似乎在任何地方都找不到。谢谢 (2认同)
  • nm,在`keras_preprocessing`中的`directory_iterator.py`中找到它,代码为,`classes = [] for subdir in Sorted(os.listdir(directory)): if os.path.isdir(os.path.join(directory) , subdir)):classes.append(subdir) ` (2认同)

Lok*_*mar 28

当使用flow_from_directory时,问题是如何解释概率输出.如上所述,如何将概率输出和类标签映射为flow_from_directory如何创建单热矢量,这在以前是未知的.

我们可以得到一个字典,它将类标签映射到我们使用时作为输出获得的预测向量的索引

generator= train_datagen.flow_from_directory("train", batch_size=batch_size)
label_map = (generator.class_indices)
Run Code Online (Sandbox Code Playgroud)

label_map变量是这样的字典

{'class_14': 5, 'class_10': 1, 'class_11': 2, 'class_12': 3, 'class_13': 4, 'class_2': 6, 'class_3': 7, 'class_1': 0, 'class_6': 10, 'class_7': 11, 'class_4': 8, 'class_5': 9, 'class_8': 12, 'class_9': 13}
Run Code Online (Sandbox Code Playgroud)

然后,由此可以在概率分数和类名之间导出关系.

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

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))))
Run Code Online (Sandbox Code Playgroud)

上述代码中的变量name_id_map也包含与从flow_from_directory的class_indices函数获得的字典相同的字典.

希望这可以帮助!

  • 我同意,我认为这应该是公认的答案。 (4认同)
  • 在我的解释中,这回答了实际的问题-获取课程标签 (2认同)
  • 拯救了我的一天<3 (2认同)

Boh*_*nik 10

更新:这不再适用于较新的Keras版本.请使用argmax()Emilia Apostolova的答案.

功能API模型只具有predict()分类将返回类概率的功能.然后,您可以使用probas_to_classes()效用函数选择最可能的类.例:

y_proba = model.predict(x)
y_classes = keras.np_utils.probas_to_classes(y_proba)
Run Code Online (Sandbox Code Playgroud)

这相当于model.predict_classes(x)Sequential模型.

这样做的原因是功能API支持更通用的任务类别,这是predict_classes()没有意义的.

更多信息:https://github.com/fchollet/keras/issues/2524

  • 使用`y_classes = y_proba.argmax(axis = -1)`代替 (6认同)
  • 目前,np.utils.py的代码(请参阅https://github.com/fchollet/keras/blob/master/keras/utils/np_utils.py)没有probas_to_classes方法.他们是否将此更改为其他功能?请帮我. (3认同)
  • AttributeError:模块“ keras”没有属性“ np_utils” (3认同)

Hem*_*con 7

除了@Emilia Apostolova 回答以获取基本事实标签之外,来自

generator = train_datagen.flow_from_directory("train", batch_size=batch_size)
Run Code Online (Sandbox Code Playgroud)

打电话

y_true_labels = generator.classes
Run Code Online (Sandbox Code Playgroud)

  • 这似乎没有给出OP所要求的标签名称。 (2认同)