【问题标题】:How to modify DataGenerator() function of the binary classification to multi-label classification in Keras?如何在 Keras 中将二进制分类的 DataGenerator() 函数修改为多标签分类?
【发布时间】:2020-09-26 11:43:24
【问题描述】:

我已经有一个可以进行二进制分类的网络。现在我想将其扩展到多标签分类网络。我已经修改了模型(使用'sigmoid'作为输出层激活函数并使用'binary_crossentropy'损失)。但是,我想知道如何修改 DataGenerator 函数以使其可以提供多标签输出?

比如原来的DataGenerator函数是:

    def __data_generation(self, list_IDs_temp):
        'Generates data containing batch_size samples'
        # Initialization
        X = np.empty((self.batch_size, *self.dim, self.n_channels))
        y = np.empty((self.batch_size), dtype=int)

        # Generate data
        for i, ID in enumerate(list_IDs_temp):
            # Store sample
            X[i, ] = np.load(train_dir + ID)

            # Store class
            y[i] = self.labels[ID]

        return X, to_categorical(y, num_classes=self.n_classes)

对于二元分类,labels[ID] 是一个整数。现在,如果我想做多标签分类,标签[ID] 是一个类似 [0 1 0 0 1 0] 的序列(假设我有 6 个标签)。我想知道如何通过 DataGnerator() 函数传递这个序列?

非常感谢!

【问题讨论】:

    标签: python tensorflow keras multilabel-classification data-generation


    【解决方案1】:

    您只需将最后一层的激活更改为 softmax 以进行多类分类,并将损失更改为 categorical_crossentropy。不过,数据生成器对我来说看起来不错。只有标签本身会改变,而不是只有 1 和 0 你会有比这更多的标签,to_categorical 函数会将它们转换为一个热编码输出。 对于多标签分类,如果 y 有多个标签,例如[1, 3],那么您需要在生成器中添加一件事 return X, to_categorical(y, num_classes=self.n_classes).sum(axis=1)

    【讨论】:

    • 非常感谢。然而,实际上我试图做多标签分类而不是多类分类。因此,也许 sigmoid 激活函数比 softmax 激活函数更有用。我将 'y' 的维度从 1 更改为 2,它现在可以工作了。
    • 我已经编辑了我的答案以允许多标签编码
    猜你喜欢
    • 2019-07-14
    • 2020-10-04
    • 1970-01-01
    • 2018-06-23
    • 2020-06-26
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    • 2020-10-26
    相关资源
    最近更新 更多