pytorch - 为什么损失函数可以应用于不同大小的张量

标签 pytorch

例如,我有一个网络,将张量 [N, 7](N 是样本数)作为输入,张量 [N, 4] 作为输出,“4”代表不同类别的概率。

训练数据的标签是张量[N]的形式,范围从0到3(代表真实类别)。

这是我的问题,我看过一些演示,他们直接将损失函数应用于输出张量和标签张量。我想知道为什么这可以工作,因为它们有不同的大小,并且这些大小似乎不符合“广播语义”。

这是最小的演示。

import torch
import torch.nn as nn
import torch.optim as optim

if __name__ == '__main__':
    features = torch.randn(2, 7)
    gt = torch.tensor([1, 1])
    model = nn.Sequential(
        nn.Linear(7, 4),
        nn.ReLU(),
        nn.Linear(4, 4)
    )
    optimizer = optim.SGD(model.parameters(), lr=0.005)
    f = nn.CrossEntropyLoss()

    for epoch in range(1000):
        optimizer.zero_grad()
        output = model(features)
        loss = f(output, gt)
        loss.backward()
        optimizer.step()

最佳答案

在 PyTorch 中的实现是:

pytorch cross entropy

文档链接:https://pytorch.org/docs/stable/nn.html#torch.nn.CrossEntropyLoss


所以在 pytorch 中实现这个公式你会得到:

import torch
import torch.nn.functional as F

output = torch.tensor([ 0.1998, -0.2261, -0.0388,  0.1457])
target = torch.LongTensor([1])

# implementing the formula above
print('manual  cross-entropy:', (-output[target] + torch.log(torch.sum(torch.exp(output))))[0])

# calling build in cross entropy function to check the result
print('pytorch cross-entropy:', F.cross_entropy(output.unsqueeze(0), target))

输出:

manual  cross-entropy: tensor(1.6462)
pytorch cross-entropy: tensor(1.6462)

希望这会有所帮助!

关于pytorch - 为什么损失函数可以应用于不同大小的张量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51822974/

相关文章:

python - 如何计算损失 w.r.t. 的 Hessian PyTorch 中使用 autograd.grad 的参数

deep-learning - 局部排名在分布式深度学习中意味着什么?

python - ValueError : base_distribution needs to have shape with size at least 6, 但得到了 torch.Size([6])

python - 与 PyTorch 并行运行一个集成的多个模型

python - PyTorch reshape 张量维度

python - 不更新权重的反向传播(DCGAN)

python - Pytorch 梯度存在但权重不更新

python - Pytorch CNN 的损失没有减少

machine-learning - PyTorch 中的双向 LSTM 输出问题

python - Pytorch - RuntimeError : Trying to backward through the graph a second time, 但缓冲区已被释放