如何使用sparse_softmax_cross_entropy_with_logits在tensorflow中实现加权交叉熵损失

Rog*_*llo 11 python deep-learning caffe tensorflow cross-entropy

我开始使用tensorflow(来自Caffe),我正在使用损失sparse_softmax_cross_entropy_with_logits.该函数接受标签,0,1,...C-1而不是onehot编码.现在,我想根据类标签使用加权; 我知道如果我使用softmax_cross_entropy_with_logits(一个热编码),可以用矩阵乘法来完成,有没有办法做同样的事情sparse_softmax_cross_entropy_with_logits

mau*_*una 20

import  tensorflow as tf
import numpy as np

np.random.seed(123)
sess = tf.InteractiveSession()

# let's say we have the logits and labels of a batch of size 6 with 5 classes
logits = tf.constant(np.random.randint(0, 10, 30).reshape(6, 5), dtype=tf.float32)
labels = tf.constant(np.random.randint(0, 5, 6), dtype=tf.int32)

# specify some class weightings
class_weights = tf.constant([0.3, 0.1, 0.2, 0.3, 0.1])

# specify the weights for each sample in the batch (without having to compute the onehot label matrix)
weights = tf.gather(class_weights, labels)

# compute the loss
tf.losses.sparse_softmax_cross_entropy(labels, logits, weights).eval()
Run Code Online (Sandbox Code Playgroud)


小智 1

类权重乘以 logits,因此对于稀疏_softmax_cross_entropy_with_logits 仍然有效。参考这个解决方案“张量流中类不平衡二元分类器的损失函数”的

作为旁注,您可以将权重直接传递到稀疏_softmax_cross_entropy

tf.contrib.losses.sparse_softmax_cross_entropy(logits, labels, weight=1.0, scope=None)
Run Code Online (Sandbox Code Playgroud)

该方法用于交叉熵损失,使用

tf.nn.sparse_softmax_cross_entropy_with_logits.
Run Code Online (Sandbox Code Playgroud)

重量作为损失的系数。如果提供标量,则损失将简单地按给定值缩放。如果权重是大小为 [batch_size] 的张量,则损失权重适用于每个相应的样本。

  • 我认为这个答案不正确。`tf.contrib.losses.sparse_softmax_cross_entropy` 中的权重是每个样本的,而不是每个类的。 (3认同)