Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pytorch 为什么损失函数可以应用于不同大小的张量_Pytorch - Fatal编程技术网

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

Pytorch 为什么损失函数可以应用于不同大小的张量,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__

例如,我有一个以张量[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中实现此公式可以得到:

导入火炬
导入torch.nn.功能为F
输出=火炬张量([0.1998,-0.2261,-0.0388,0.1457])
目标=火炬长传感器([1])
#实施上述公式
打印(‘手动交叉熵:’,(-output[target]+torch.log(torch.sum(torch.exp(output))))[0])
#调用内置交叉熵函数检查结果
打印('pytorch交叉熵:',F.cross_熵(output.unsqueze(0),target))
输出:

手动交叉熵:张量(1.6462) pytorch交叉熵:张量(1.6462)
我希望这有帮助