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。
按照几个线程中的指针,我最终得到了以下转换。我将在这里发布我的解决方案,以防其他人陷入这个话题。它是从此处修改的,并且在此上下文中按预期运行。
# 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)
| 归档时间: |
|
| 查看次数: |
11507 次 |
| 最近记录: |