aaazbai 2023-02-16 10:35 采纳率: 78.6%
浏览 23
已结题

如何使用独热编码的标签?

是这样的,本来是拿了一个卷积锚狗识别模型,是二分类问题,
现在我多加了一个花朵类,由binary改成categorical,模型是训练出来了,但是test的时候不清楚怎么使用categorical的独热编码标签。
之前那个二分类模型是检测label的大小,大于0.5的是dog,否则是cat。变成多分类模型后不清楚怎么改

#二分类的test调用原码
def fig_predict_result(model, count):
    test_datagen = ImageDataGenerator(rescale=1. / 255)
    test_generator = test_datagen.flow_from_directory(
        './data/test/',
        target_size=(150, 150),
        batch_size=256,
        class_mode='binary')
 
    text_labels = []
    plt.figure(figsize=(30, 20))
    # 迭代器可以迭代很多条数据,但我这里只取第一个结果看看
    for batch, label in test_generator:
        pred = model.predict(batch)
        for i in range(count):
            true_reuslt = label[i]
            print(true_reuslt)
            if pred[i] > 0.5:
                text_labels.append('dog')
            else:
                text_labels.append('cat')
 
            # 4列,若干行的图
            plt.subplot(count / 4 + 1, 4, i + 1)
            plt.title('This is a ' + text_labels[i])
            imgplot = plt.imshow(batch[i])
 
        plt.show()
————————————————
版权声明:本文为CSDN博主「zhangphil」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhangphil/article/details/103581736

  • 写回答

3条回答 默认 最新

  • Evaporator Core 2023-02-16 10:50
    关注

    在多分类问题中,输出的结果应该是每个类别的概率分布,而不是一个二分类的结果。所以你需要将 class_mode 参数从 'binary' 改成 'categorical',并且将模型的输出层改成一个有多个神经元的输出层,其中每个神经元对应一个类别。

    假设你的类别有 num_classes 个,可以将输出层改成一个 Dense 层,其中神经元的数量为 num_classes,激活函数为 softmax。这样,输出就是一个概率分布向量,其中每个元素表示对应类别的概率。

    以下是修改后的代码:

    import numpy as np
    
    def fig_predict_result(model, count, class_names):
        test_datagen = ImageDataGenerator(rescale=1. / 255)
        test_generator = test_datagen.flow_from_directory(
            './data/test/',
            target_size=(150, 150),
            batch_size=256,
            class_mode='categorical', # 修改为 categorical
            shuffle=False  # 不要打乱顺序,以便按顺序读取标签
        )
    
        plt.figure(figsize=(30, 20))
        # 迭代器可以迭代很多条数据,但我这里只取第一个结果看看
        for batch, labels in test_generator:
            preds = model.predict(batch)
            preds = np.argmax(preds, axis=-1)  # 将概率向量转换为类别id
    
            for i in range(count):
                true_label = class_names[np.argmax(labels[i])]
                pred_label = class_names[preds[i]]
                print(true_label)
                print(pred_label)
    
                # 4列,若干行的图
                plt.subplot(count / 4 + 1, 4, i + 1)
                plt.title('True label: {}\nPredicted label: {}'.format(true_label, pred_label))
                imgplot = plt.imshow(batch[i])
    
            plt.show()
    

    其中 class_names 是一个列表,包含所有类别的名称,例如 ['cat', 'dog', 'flower']。在输出结果时,我们将真实标签和预测标签都转换成对应的类别名称。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月9日
  • 已采纳回答 3月1日
  • 修改了问题 2月16日
  • 创建了问题 2月16日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效