【问题标题】:Why the loss function can be apply on different size tensors为什么损失函数可以应用于不同大小的张量
【发布时间】:2019-01-20 05:19:35
【问题描述】:

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

并且训练数据的标签是张量[N]的形式,范围从0到3(代表ground-truth类)。

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

这是最小的演示。

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


    【解决方案1】:

    在 PyTorch 中的实现是:

    文档链接: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)
    

    我希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2020-10-29
      • 1970-01-01
      • 2018-09-18
      • 2019-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-23
      相关资源
      最近更新 更多