【问题标题】:Keras - Multilabel classification with weightsKeras - 带权重的多标签分类
【发布时间】:2020-04-25 05:15:08
【问题描述】:

我正在尝试对每个样本有多个标签的一些 CXR 图像进行分类。据我了解,我必须放置一个带有 sigmoid 激活的密集层,并使用二元交叉熵作为我的损失函数。问题是存在很大的类不平衡(正常比异常多得多)。我很好奇这是我的模型:

from keras_applications.resnet_v2 import ResNet50V2
from keras.layers import GlobalAveragePooling2D, Dense
from keras import Sequential
ResNet = Sequential()
ResNet.add(ResNet50V2(input_shape=shape, include_top=False, weights=None,backend=keras.backend,
    layers=keras.layers,
    models=keras.models,
    utils=keras.utils))
ResNet.add(GlobalAveragePooling2D(name='avg_pool'))

ResNet.add(Dense(len(label_counts), activation='sigmoid', name='Final_output'))

正如我们所见,我正在使用 sigmoid 来获得输出,但我对如何实现权重有点困惑。我想我需要使用一个使用 BCE(use_logits = true) 的自定义损失函数。像这样的:

xent = tf.losses.BinaryCrossEntropy(
    from_logits=True,
    reduction=tf.keras.losses.Reduction.NONE)
loss = tf.reduce_mean(xent(targets, pred) * weights))

所以它将输出视为 logits,但我不确定的是最终输出的激活。我是通过激活 sigmoid 来保留它,还是使用线性激活(未激活)?我假设我们保留 sigmoid,并将其视为 logit,但我不确定 pytorches "torch.nn.BCEWithLogitsLoss" 是否包含 sigmoid 层

编辑:发现这个:https://www.reddit.com/r/tensorflow/comments/dflsgv/binary_cross_entropy_with_from_logits_true/

根据:pgaleone

from_logits=True 表示损失函数期望一个线性张量 (你的网络的输出层没有任何激活函数,但是 身份),所以你必须删除 sigmoid,因为它将是 损失函数本身将softmax应用于您的网络输出,以及 然后计算交叉熵

【问题讨论】:

    标签: python keras loss-function


    【解决方案1】:

    您实际上不想在多标签分类中使用from_logits

    来自文档 [1]:

    logits:每个标签的激活,通常是线性输出。这些活化能被解释为非标准化的对数概率。

    所以你说得对,当激活函数设置为 True 时你不想使用它。

    但是,文档也说

    警告:此操作需要未缩放的 logits,因为它在内部对 logits 执行 softmax 以提高效率。不要用 softmax 的输出调用这个操作,因为它会产生不正确的结果

    Softmax 根据定义针对一个类进行优化。这就是 softmax 的设计方式。正如您自己提到的那样,由于您正在进行多标签分类,因此您应该使用 sigmoid。

    这意味着如果你想使用 sigmoid,你不能使用from_logits,因为它会在 sigmoid 之后应用 softmax,这通常不是你想要的。

    解决办法是去掉这一行:

    from_logits=True,
    

    [1]https://www.tensorflow.org/api_docs/python/tf/nn/softmax_cross_entropy_with_logits?version=stable

    【讨论】:

    • 当然,我知道它内置了 BCE,并且 len(label_counts) 很好。我的问题是在底部,使用BCE(from_logits=True) 时是否需要一个带有sigmoid 激活的密集层?
    • 你是对的,但我正在做multilabel分类(在标题中)。嗯,有趣的是,在多标签分类中,我们不想使用 softmax,因为它只会改进一个类。但我不知道它在内部做了 softmax。
    • 是的,我的意思是多标签。将更新答案。那你的问题解决了吗?请为以后的读者标记它。
    猜你喜欢
    • 2018-07-07
    • 2018-08-04
    • 2019-05-21
    • 2019-02-26
    • 1970-01-01
    • 2019-01-06
    • 2018-07-02
    • 2021-11-18
    • 2017-06-22
    相关资源
    最近更新 更多