Loss用来做两件事,一是计算实际输出和目标之间的差距,二是为我们反向传播更新数据提供一个依据。首先查看L1Loss函数官方文档:
有两种方式,一个默认的mean,求的是平均值,另一个sum,求的是和:
import torch
from torch.nn import L1Loss
input = torch.tensor([1, 2, 3], dtype=torch.float32)
target = torch.tensor([1, 2, 5], dtype=torch.float32)
input = torch.reshape(input, (1, 1, 1, 3))#模拟实际情况,batch_size为1,通道为1,行为1,列为3
target = torch.reshape(target, (1, 1, 1, 3))
loss = L1Loss()
result = loss(input, target)
print(result)
输出:
tensor(0.6667)#默认是平均值
还有常用的就是平方差loss(MSEloss):
loss_mse = MSELoss(reduction='sum')
result_mse = loss_mse(input, target)
print(result_mse)
输出为:
tensor(4.)
交叉熵CrossEntropyLoss,主要用来分类问题:
C为几个类别
假若有人(label=0)、狗(label=1)、猫(label=2),有一张狗的图片,经过神经网络的处理后得到的输出:[0.1 0.2 0.3](分别为三种类别的概率) 而target=1(就是应该得到的结果为狗)
根据公式得loss(x,class) = -0.2+log(exp(0.1)+exp(0.2)+exp(0.3))
x = torch.tensor([0.1, 0.2, 0.3])
y = torch.tensor([1])
x = torch.reshape(x, (1, 3))#N为1,3个种类
loss_cross = CrossEntropyLoss()
print(loss_cross(x, y))
输出为:
tensor(1.1019)