Python 如何在tensorflow中使用sparse\u softmax\u cross\u熵和\u logits实现加权交叉熵损失
我开始使用tensorflow(来自Caffe),我使用lossPython 如何在tensorflow中使用sparse\u softmax\u cross\u熵和\u logits实现加权交叉熵损失,python,tensorflow,deep-learning,caffe,cross-entropy,Python,Tensorflow,Deep Learning,Caffe,Cross Entropy,我开始使用tensorflow(来自Caffe),我使用losssparse\u softmax\u cross\u entropy\u和\u logits。该函数接受标签,如0,1,…C-1,而不是onehot编码。现在,我想根据类标签使用权重;我知道,如果我使用softmax\u cross\u entropy\u和\u logits(一个热编码),这可能通过矩阵乘法实现,有没有办法用sparse\u softmax\u cross\u entropy\u和\u logits做同样的事情?类
sparse\u softmax\u cross\u entropy\u和\u logits
。该函数接受标签,如0,1,…C-1
,而不是onehot编码。现在,我想根据类标签使用权重;我知道,如果我使用softmax\u cross\u entropy\u和\u logits
(一个热编码),这可能通过矩阵乘法实现,有没有办法用sparse\u softmax\u cross\u entropy\u和\u logits
做同样的事情?类权重乘以logits,因此,这仍然适用于稀疏的\u softmax\u交叉的\u熵\u和\u logits。请参阅“张量流中类不平衡二元分类器的损失函数”
作为旁注,您可以将权重直接传递到
该方法适用于交叉熵损失
tf.nn.sparse_softmax_cross_entropy_with_logits.
重量是损失的一个系数。如果提供了标量,则损耗仅按给定值缩放。如果重量是一个大小张量[批次大小],则损失重量适用于每个相应的样本。特别是对于二元分类,有一个计算加权softmax交叉熵的张量
sparse\u softmax\u cross\u entropy\u with\u logits
是一种高效的非加权操作(请参见引擎盖下的使用),因此它不是“可插拔的”
在多类情况下,您可以选择切换到一个热编码,或者像前面所建议的那样,以一种黑客方式使用损失函数,在这种情况下,您必须根据当前批次中的标签传递权重。我想知道是否有办法避免一个热标签;因为在提供的链接中,仍然需要将一个热标签的矩阵与权重向量相乘。另一种方法是直接使用length batchsize的权重向量,但是我必须为每个批次计算这个向量;我如何定义它(因为它取决于标签),而不必计算onehot标签矩阵?我认为这个答案不正确。
tf.contrib.loss.sparse\u softmax\u cross\u entropy
中的权重是每个样本的,而不是每个类的。这是正确的,只是令人讨厌。您将为每个更新传递一个权重,这取决于当前更新中的特定类。如果你有一批大小为3的学生,他们的班级是1,1,2。你想把1类的权重定为50%,然后你可以使用这个损失函数,把权重参数传递给一个张量,值为[0.5,0.5,1.0]。这将有效地加重你的班级。。。优雅的不,是的,请救命!我如何将权重
传递给我的\u自定义\u模型?
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()
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()