gpt4 book ai didi

machine-learning - 用于多标签分类的神经网络,具有大量类输出仅为零

转载 作者:行者123 更新时间:2023-11-30 08:24:10 25 4
gpt4 key购买 nike

我正在训练一个用于多标签分类的神经网络,具有大量类别(1000)。这意味着每个输入可以激活多个输出。平均而言,每个输出帧有两个事件类。在使用交叉熵损失进行训练时,神经网络仅输出零,因为该输出的损失最小,因为 99.8% 的标签都是零。关于如何插入网络给予积极类别更多的权重,有什么建议吗?

最佳答案

Tensorflow 有一个损失函数 weighted_cross_entropy_with_logits,可用于为 1 赋予更多权重。因此它应该适用于像您这样的稀疏多标签分类设置。

来自documentation :

This is like sigmoid_cross_entropy_with_logits() except that pos_weight, allows one to trade off recall and precision by up- or down-weighting the cost of a positive error relative to a negative error.

The argument pos_weight is used as a multiplier for the positive targets

如果您在 Keras 中使用tensorflow后端,则可以像这样使用损失函数(Keras 2.1.1):

import tensorflow as tf
import keras.backend.tensorflow_backend as tfb

POS_WEIGHT = 10 # multiplier for positive targets, needs to be tuned

def weighted_binary_crossentropy(target, output):
"""
Weighted binary crossentropy between an output tensor
and a target tensor. POS_WEIGHT is used as a multiplier
for the positive targets.

Combination of the following functions:
* keras.losses.binary_crossentropy
* keras.backend.tensorflow_backend.binary_crossentropy
* tf.nn.weighted_cross_entropy_with_logits
"""
# transform back to logits
_epsilon = tfb._to_tensor(tfb.epsilon(), output.dtype.base_dtype)
output = tf.clip_by_value(output, _epsilon, 1 - _epsilon)
output = tf.log(output / (1 - output))
# compute weighted loss
loss = tf.nn.weighted_cross_entropy_with_logits(targets=target,
logits=output,
pos_weight=POS_WEIGHT)
return tf.reduce_mean(loss, axis=-1)

然后在你的模型中:

model.compile(loss=weighted_binary_crossentropy, ...)

我还没有找到很多资源来报告与类(class)数量、平均活跃类(class)等相关的 pos_weight 的良好工作值。

关于machine-learning - 用于多标签分类的神经网络,具有大量类输出仅为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42158866/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com