多class-多标签class化的每class加权损失
Per class weighted loss for multiclass-multilabel classification
我正在进行多类多标签分类。也就是说,每个示例都有 N_labels
个完全独立的标签,而每个标签可能有 N_classes
个不同的值(互斥)。更具体地说,每个示例由 N_labels
维向量分类,而每个向量分量可以来自集合 {0, 1, ..., N_classes}
例如,如果N_labels = 5
和N_classes = 3
,每个示例可以按以下标签分类:
[2, 1, 0, 0, 1], [0, 0, 2, 2, 1], [0, 0, 0, 0, 0]
此外,对于每个标签,我在不同 类 之间存在很大的不平衡,即训练集中 90% 的示例属于集合 0
。因此,我想执行加权 softmax 交叉熵以计算每个标签的损失(以及之后的平均值)。
尝试使用:
tf.losses.sparse_softmax_cross_entropy # but it seems that it performs weightening between different label and not between classes for each label.
tf.nn.softmax_cross_entropy_with_logits, tf.nn.softmax_cross_entropy_with_logits_v2 # does not have weightening option ever
tf.nn.weighted_cross_entropy_with_logits # good only for binary classification
我想找到 compute_loss
函数来计算损失,方法如下:
loss = compute_loss(logits=my_logits, labels=my_labels, weights=my_weights)
其中
my_logits is of shape [batch_size, N_labels, N_classes]
my_labels is of shape [batch_size, N_labels]
my_weight is of shape [N_labels, N_classes]
请注意,每个标签可能有不同的权重(类)
我认为您需要 tf.losses.sigmoid_cross_entropy
它使用 multi_class_labels
正如您所描述的那样,并且具有应用权重的功能。
https://www.tensorflow.org/api_docs/python/tf/losses/sigmoid_cross_entropy
示例:
假设你有一个多类多标签分类问题,总共有 10 类,单个示例的标签看起来像这样 [1, 3, 6]
,这意味着示例包含 类 1、3 和 6。
您需要使用 k-hot 编码
labels = tf.reduce_max(tf.one_hot([1, 3, 6], 10, dtype=tf.int32), axis=0)
在这种情况下输出将是 [0, 1, 0, 1, 0, 0, 1, 0, 0, 0]
我正在进行多类多标签分类。也就是说,每个示例都有 N_labels
个完全独立的标签,而每个标签可能有 N_classes
个不同的值(互斥)。更具体地说,每个示例由 N_labels
维向量分类,而每个向量分量可以来自集合 {0, 1, ..., N_classes}
例如,如果N_labels = 5
和N_classes = 3
,每个示例可以按以下标签分类:
[2, 1, 0, 0, 1], [0, 0, 2, 2, 1], [0, 0, 0, 0, 0]
此外,对于每个标签,我在不同 类 之间存在很大的不平衡,即训练集中 90% 的示例属于集合 0
。因此,我想执行加权 softmax 交叉熵以计算每个标签的损失(以及之后的平均值)。
尝试使用:
tf.losses.sparse_softmax_cross_entropy # but it seems that it performs weightening between different label and not between classes for each label.
tf.nn.softmax_cross_entropy_with_logits, tf.nn.softmax_cross_entropy_with_logits_v2 # does not have weightening option ever
tf.nn.weighted_cross_entropy_with_logits # good only for binary classification
我想找到 compute_loss
函数来计算损失,方法如下:
loss = compute_loss(logits=my_logits, labels=my_labels, weights=my_weights)
其中
my_logits is of shape [batch_size, N_labels, N_classes]
my_labels is of shape [batch_size, N_labels]
my_weight is of shape [N_labels, N_classes]
请注意,每个标签可能有不同的权重(类)
我认为您需要 tf.losses.sigmoid_cross_entropy
它使用 multi_class_labels
正如您所描述的那样,并且具有应用权重的功能。
https://www.tensorflow.org/api_docs/python/tf/losses/sigmoid_cross_entropy
示例:
假设你有一个多类多标签分类问题,总共有 10 类,单个示例的标签看起来像这样 [1, 3, 6]
,这意味着示例包含 类 1、3 和 6。
您需要使用 k-hot 编码
labels = tf.reduce_max(tf.one_hot([1, 3, 6], 10, dtype=tf.int32), axis=0)
在这种情况下输出将是 [0, 1, 0, 1, 0, 0, 1, 0, 0, 0]