如果reduction='sum',即对所有元素求和,例如shape=(2,2,3,3),就是在mean下求得的值 * 36.
class torch.nn.L1Loss(size_average=None, reduce=None, reduction='mean')
class torch.nn.MSELoss(size_average=None, reduce=None, reduction='mean')
class torch.nn.SmoothL1Loss(size_average=None, reduce=None, reduction='mean')
0.5 , if < 1
- 0.5 ,otherwise
----------------------------------------------------分割线
class torch.nn.CrossEntropyLoss(weight=None, size_average=None, ignore_index=-100, reduce=None, reduction='mean')
weight
应该是一维张量,为每个类分配权重。 当您的训练集不平衡时,此功能特别有用。
这里假设一共有[0,1,2...j,...n-1] n 个类,class即是标签 y 所属的类别
手动计算过程如下(3个类,标签y1,y2,y3分别为类0,1,1):
x = torch.rand((3,3))
y = torch.tensor([0,1,1])
softmax = nn.Softmax(dim=1)
x_softmax = softmax(x)
x_log = torch.log(x_softmax)
>>>tensor([[-0.9632, -1.1211, -1.2297],
[-1.0468, -1.2794, -0.9923],
[-1.0947, -0.9512, -1.2762]])
loss_func = nn.CrossEntropyLoss()
loss_func(x,y)
>>>tensor(1.0646)
然后再按 y 从 x_log 中取值,去掉负号,再求和取平均值,结果就是1.0646
class torch.nn.NLLLoss(weight=None, size_average=None, ignore_index=-100, reduce=None, reduction='mean')
nn.NLLLoss输入是一个对数概率向量和一个目标标签,它与nn.CrossEntropyLoss的关系可以描述为:softmax(x)+log(x)+nn.NLLLoss====>nn.CrossEntropyLoss
class torch.nn.BCELoss(weight=None, size_average=None, reduce=None, reduction='mean')
input = torch.randn(3)
target = torch.tensor([0.,1.,0.])
m = nn.Sigmoid()
loss = nn.BCELoss()
output = loss(m(input), target)
Sigmoid函数可以用来解决多标签问题,Softmax函数用来解决单标签问题。也就是说,这里的input,是一个二分类多标签数据,也就是含有3个标签。
class torch.nn.BCEWithLogitsLoss(weight=None, size_average=None, reduce=None, reduction='mean', pos_weight=None)
本质上和nn.BCELoss()没有区别,只是在BCELoss上加了个logits函数(也就是sigmoid函数)