python - NLLLoss 只是一个正常的负函数?
问题描述
我很难理解nn.NLLLoss()
。
由于下面的代码总是打印,那么使用负号 (-) 和使用负号 (-)有什么True
区别?nn.NLLLoss()
import torch
while 1:
b = torch.randn(1)
print(torch.nn.NLLLoss()(b, torch.tensor([0])) == -b[0])
解决方案
在您的情况下,每个批次元素只有一个输出值,目标是0
. 损失将nn.NLLLoss
选择与目标张量中包含的索引相对应的预测张量的值。这是一个更一般的示例,您总共有五个批处理元素,每个批处理元素具有三个 logit 值:
>>> logits = torch.randn(5, 3, requires_grad=True)
>>> y = torch.tensor([1, 0, 2, 0, 1])
>>> y_hat = torch.softmax(b, -1)
张量y
和y_hat
分别对应于目标张量和估计分布。您可以nn.NLLLoss
使用以下方法实现:
>>> -y_hat[torch.arange(len(y_hat)), y]
tensor([-0.2195, -0.1015, -0.3699, -0.5203, -0.1171], grad_fn=<NegBackward>)
与内置函数相比:
>>> F.nll_loss(y_hat, y, reduction='none')
tensor([-0.2195, -0.1015, -0.3699, -0.5203, -0.1171], grad_fn=<NllLossBackward>)
-y_hat
这与独自一人完全不同。
推荐阅读
- haskell - 有没有办法使用类名作为常用数据类型的名称?
- xcode - 如何在 Xcode 的 Interface Builder 中设置 Document Outline 的默认宽度
- python - 无法使用 ctrl + c 终止多处理程序
- python - 将 Tkinter 输入框转换为字符串的解决方法
- java - 是否存在可以“最终确定”对象的私有状态的 Java 方法?
- forms - 如何修复表单域之间的间距?HTML,引导程序
- elasticsearch - 弹性搜索 (COUNT*) 查询
- stream - 有什么方法可以将序列流式传输到文件中并将摘要信息一次性添加到文件中?
- json - 使用 GJSON 语法的选择表达式,如 jq 示例
- arrays - 使用对象数组过滤嵌套的 JSON 对象