softmax_cross_entropy_with_logits 的 PyTorch 等价

Dar*_*ger 14 tensorflow cross-entropy pytorch

我想知道 TensorFlow 是否有等效的 PyTorch 损失函数softmax_cross_entropy_with_logits

pro*_*sti 18

TensorFlow 是否有等效的 PyTorch 损失函数softmax_cross_entropy_with_logits

torch.nn.functional.cross_entropy

这将 logits 作为输入(log_softmax在内部执行)。这里的“logits”只是一些不是概率的值(即不一定在区间 中[0,1])。

但是,logits 也是将转换为概率的值。如果您考虑张量流函数的名称,您就会明白它是重复的(因为该with_logits部分假设softmax将被调用)。

在 PyTorch 中的实现如下所示:

loss = F.cross_entropy(x, target)
Run Code Online (Sandbox Code Playgroud)

这相当于:

lp = F.log_softmax(x, dim=-1)
loss = F.nll_loss(lp, target)
Run Code Online (Sandbox Code Playgroud)

这并不是F.binary_cross_entropy_with_logits因为该函数假设多标签分类:

F.sigmoid + F.binary_cross_entropy = F.binary_cross_entropy_with_logits
Run Code Online (Sandbox Code Playgroud)

两者都不是torch.nn.functional.nll_loss,因为该函数采用对数概率(在 之后log_softmax())而不是 logits。


ilk*_*444 0

按照几个线程中的指针,我最终得到了以下转换。我将在这里发布我的解决方案,以防其他人陷入这个话题。它是从此处修改的,并且在此上下文中按预期运行。

# pred is the prediction with shape [C, H*W]
# gt is the target with shape [H*W]
# idx is the boolean array on H*W for masking

# Tensorflow version
loss = tf.nn.sparse_softmax_cross_entropy_with_logits( \
          logits=tf.boolean_mask(pred, idx), \
          labels=tf.boolean_mask(gt, idx)))

# Pytorch version       
logp = torch.nn.functional.log_softmax(pred[idx])
logpy = torch.gather(logp, 1, Variable(gt[idx].view(-1,1)))
loss = -(logpy).mean()
Run Code Online (Sandbox Code Playgroud)