例如,我有一个网络,将张量 [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 中的实现是:
文档链接: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/