Pytorch 为什么损失函数可以应用于不同大小的张量
例如,我有一个以张量[N,7](N是样本数)为输入,以张量[N,4]为输出的网络,“4”表示不同类别的概率 训练数据的标签是张量[N]的形式,范围从0到3(表示地面真值类) 这是我的问题,我看过一些演示,它们直接将损失函数应用于输出张量和标签张量。我想知道为什么这能起作用,因为它们有不同的尺寸,而且这些尺寸似乎不符合“广播语义” 这是最简单的演示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__
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)
我希望这有帮助