我在Keras有一个功能模型(来自repo示例的Resnet50).我训练了它ImageDataGenerator和flow_from_directory数据并将模型保存到.h5文件中.当我打电话时,model.predict我得到了一组类概率.但我想将它们与类标签相关联(在我的例子中 - 文件夹名称).我怎么能得到它们?我发现我可以使用model.predict_classes和model.predict_proba,但我在功能模型中没有这些功能,只在Sequential中.
Emi*_*ova 53
y_prob = model.predict(x)
y_classes = y_prob.argmax(axis=-1)
Run Code Online (Sandbox Code Playgroud)
如此处所示.
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函数获得的字典相同的字典.
希望这可以帮助!
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
除了@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)