Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在tensorflow中使用sparse\u softmax\u cross\u熵和\u logits实现加权交叉熵损失_Python_Tensorflow_Deep Learning_Caffe_Cross Entropy - Fatal编程技术网

Python 如何在tensorflow中使用sparse\u softmax\u cross\u熵和\u logits实现加权交叉熵损失

Python 如何在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做同样的事情?类

我开始使用tensorflow(来自Caffe),我使用loss
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()