【发布时间】: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