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

是这样的,本来是拿了一个卷积锚狗识别模型,是二分类问题,
现在我多加了一个花朵类,由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

在多分类问题中,输出的结果应该是每个类别的概率分布,而不是一个二分类的结果。所以你需要将 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']。在输出结果时,我们将真实标签和预测标签都转换成对应的类别名称。

在多分类问题中,你需要使用categorical或sparse_categorical的class_mode,并使用to_categorical函数将标签转换为独热编码形式。然后,在测试时,你需要使用predict_classes函数来获取每个样本的预测类别。下面是一个示例代码:


from keras.utils import to_categorical

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='categorical') # or class_mode='sparse_categorical'

    text_labels = []
    plt.figure(figsize=(30, 20))
    # 迭代器可以迭代很多条数据,但我这里只取第一个结果看看
    for batch, label in test_generator:
        pred = model.predict(batch)
        pred_classes = np.argmax(pred, axis=1) # 获取预测类别
        for i in range(count):
            true_reuslt = label[i]
            print(true_reuslt)
            if pred_classes[i] == 0:
                text_labels.append('cat')
            elif pred_classes[i] == 1:
                text_labels.append('dog')
            else:
                text_labels.append('flower')
 
            # 4列,若干行的图
            plt.subplot(count / 4 + 1, 4, i + 1)
            plt.title('This is a ' + text_labels[i])
            imgplot = plt.imshow(batch[i])
 
        plt.show()

# 转换标签为独热编码
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') # or class_mode='sparse_categorical'
labels = test_generator.classes
labels = to_categorical(labels)

# 使用模型进行预测
model = ... # 加载模型
pred = model.predict(batch)

# 获取预测类别
pred_classes = np.argmax(pred, axis=1)

在这个示例中,我们使用categorical的class_mode来表示多分类问题,并使用to_categorical函数将标签转换为独热编码形式。在预测时,我们使用predict函数获取每个样本的预测概率,并使用argmax函数获取预测类别。最后,根据预测类别的不同,我们为每个样本设置相应的文本标签。