F.cross_entropy 函数对应的类是torch.nn.CrossEntropyLoss,在使用时会自动添加logsoftmax然后计算loss(其实就是nn.LogSoftmax() 和nn.NLLLoss() 类的融合)
该函数用于计算多分类问题的交叉熵loss
C为class的数目
input 1维情况x[N, C] n维度情况[N, c, d1, d2, d3…]
target 1维度情况[N] n维度情况[N, C, d1, d2, d3] 这的数值范围必须是0-C-1
weight [C] 代表每个类别的权重
注意这里的target必须是long类型
这里的weight是给每一个类别一个weight
一般情况(default)下都会将所有元素的loss进行平均,所以最后loss的公式时为
Wn表示第n个样本的对应gt类别的权重, Pn是模型预测的对应gt类别的概率。分子上将所有样本的loss相加,然后除以所有样本权重的和。
import numpy as np
import torch
from torch.nn import functional as F
x = np.array([[1, 2],
[1, 2],
[1, 1]]).astype(np.float32)
y = np.array([1, 1, 0])
weight = np.array([2, 1])
x = torch.from_numpy(x)
print(F.softmax(x, dim=1))
y = torch.from_numpy(y).long()
weight = torch.from_numpy(weight).float()
loss = F.cross_entropy(x, y, weight=weight)
print(loss)
F.binary_cross_entropy_with_logits()对应的类是torch.nn.BCEWithLogitsLoss,在使用时会自动添加sigmoid,然后计算loss。(其实就是nn.sigmoid和nn.BCELoss的合体)
该函数用于计算多分类问题的交叉熵loss
这里
input [N, *]
target[N, *]
这里的target必须是float类型
这里直接那nn.BCELoss举例子,注意使用nn.BCELoss的时候必须保证输入的是经过sigmoid激活的概率值
这里的weight是给每一个点一个weight
import torch
from torch import nn
def binary_cross_entropyloss(prob, target, weight=None):
loss = -weight * (target * torch.log(prob) + (1 - target) * (torch.log(1 - prob)))
loss = torch.sum(loss) / torch.numel(target)
return loss
label = torch.tensor([
[1., 0],
[1., 0],
])
predict = torch.tensor([
[0.1, 0.3],
[0.2, 0.8]
])
weight1 = torch.tensor([
[1., 2],
[1., 1.],
])
loss1 = nn.BCELoss(weight=weight1)
l1 = loss1(predict, label)
loss = binary_cross_entropyloss(predict, label, weight=weight1)
print(l1, loss)