Keras 中具有类权重的多标签分类

问题描述 投票:0回答:2

我的网络中有 1000 个类,它们具有多标签输出。对于每个训练示例,正输出的数量相同(即 10),但它们可以分配给 1000 个类别中的任何一个。所以 10 个类的输出为 1,其余 990 个类的输出为 0。

对于多标签分类,我使用“二元交叉熵”作为成本函数,使用“sigmoid”作为激活函数。当我尝试使用 0.5 这条规则作为 1 或 0 的截止值时。所有这些都是 0。我知道这是一个类别不平衡问题。从这个链接,我了解到,我可能必须创建额外的输出标签。不幸的是,我无法弄清楚如何将其合并到 keras 中的简单神经网络中。

nclasses = 1000

# if we wanted to maximize an imbalance problem!
#class_weight = {k: len(Y_train)/(nclasses*(Y_train==k).sum()) for k in range(nclasses)}


inp = Input(shape=[X_train.shape[1]])
x = Dense(5000, activation='relu')(inp)

x = Dense(4000, activation='relu')(x)

x = Dense(3000, activation='relu')(x)
x = Dense(2000, activation='relu')(x)
x = Dense(nclasses, activation='sigmoid')(x)
model = Model(inputs=[inp], outputs=[x])

adam=keras.optimizers.adam(lr=0.00001)
model.compile('adam', 'binary_crossentropy')
history = model.fit(
    X_train, Y_train, batch_size=32, epochs=50,verbose=0,shuffle=False)

任何人都可以帮助我编写这里的代码吗?如果您能为这个问题提出一个好的“准确性”指标,我也将非常感激?

非常感谢:):)

keras multilabel-classification
2个回答
28
投票

我有类似的问题,不幸的是大多数问题都没有答案。尤其是班级不平衡问题。

就指标而言,有几种可能性:在我的例子中,我使用前 1/2/3/4/5 个结果,并检查其中一个是否正确。因为在你的情况下,你总是有相同数量的标签=1,你可以获取前 10 个结果,看看其中有多少百分比是正确的,并根据你的批量大小对这个结果进行平均。我没有找到将该算法作为 keras 指标包含在内的可能性。相反,我编写了一个回调,它计算验证数据集上纪元结束时的指标。

此外,如果您预测测试数据集上的前 n 个结果,请查看每个类被预测的次数。 Counter Class 对于这个目的来说真的很方便。

编辑:如果找到一种包含类别权重而不拆分输出的方法。 您需要一个 numpy 2d 数组,其中包含形状为 [要预测的类别数,2(背景和信号)] 的权重。 这样的数组可以用这个函数计算:

def calculating_class_weights(y_true):
    from sklearn.utils.class_weight import compute_class_weight
    number_dim = np.shape(y_true)[1]
    weights = np.empty([number_dim, 2])
    for i in range(number_dim):
        weights[i] = compute_class_weight('balanced', [0.,1.], y_true[:, i])
    return weights

现在的解决方案是构建您自己的二元交叉熵损失函数,在其中您自己乘以权重:

def get_weighted_loss(weights):
    def weighted_loss(y_true, y_pred):
        return K.mean((weights[:,0]**(1-y_true))*(weights[:,1]**(y_true))*K.binary_crossentropy(y_true, y_pred), axis=-1)
    return weighted_loss

weights[:,0] 是一个包含所有背景权重的数组,weights[:,1] 包含所有信号权重。

剩下的就是将这个损失包含到编译函数中:

model.compile(optimizer=Adam(), loss=get_weighted_loss(class_weights))

0
投票

在多标签分类问题中,最好使用其他指标,例如 AUC,如果您的数据不平衡,AUPR 指标会更好地报告您的模型预测标签的能力,因为它直接考虑了精度和召回率。

© www.soinside.com 2019 - 2024. All rights reserved.