Keras - 带权重的多标签分类
Posted
技术标签:
【中文标题】Keras - 带权重的多标签分类【英文标题】:Keras - Multilabel classification with weights 【发布时间】: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应用于您的网络输出,以及 然后计算交叉熵
【问题讨论】:
【参考方案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。
是的,我的意思是多标签。将更新答案。那你的问题解决了吗?请为以后的读者标记它。以上是关于Keras - 带权重的多标签分类的主要内容,如果未能解决你的问题,请参考以下文章