Pytorch中CrossEntropyLoss理解
import torch import torch.nn as nn x_input = torch.randn(4, 3) # 4个样本, 3个类别n=3,类别id分别是0,1,2 print(x_input: , x_input) y_target = torch.tensor([1, 2, 0, 2]) # 4个样本的标签分别是1,2,0,2 print(y_target: , y_target) softmax = nn.Softmax(dim=1) # softmax, 行处理, 每行的和为1 soft = softmax(x_input) # soft = (exp(x1),...,exp(xn)) / sum(exp(xi)) print(softmax: , soft) log_softmax = nn.LogSoftmax(dim=1) # log softmax, 行处理 log_soft = log_softmax(x_input) # log_soft = (log(soft(1)),...,log(soft(n))) print(log_softmax: , log_soft) nll_loss = nn.NLLLoss() # negative log likelihood loss loss = nll_loss(log_soft, y_target) # loss = -sum(log_soft(i)*1{i=label}) print(nll_loss: , loss) cross_entropy_loss = nn.CrossEntropyLoss() # cross entropy loss = log_soft + nll_loss c_loss = cross_entropy_loss(x_input, y_target) # loss = 所有样本的平均交叉熵损失值 print(c_loss: , c_loss) loss = nn.BCEWithLogitsLoss() input = torch.from_numpy(np.array([[1.0, 0.2, 0.1], [0.2, 1.1, 0.2], [0.0, 1.2, 0.2], [0.2, 0.0, 1.1]])).type(torch.float32) target = torch.from_numpy(np.array([[1, 0.0, 0], [0, 0.5, 0], [0, 1.0, 0], [0, 0.0, 1]])).type(torch.float32) output = loss(input, target) print(loss: , output)
一、CrossEntropyLoss公式
假设有n个样本,类别数是m,第i (i=1,...,n)个样本被预测为第j (j=1,...,m)类的置信度为,真实类别标签为
则
其中,
log为自然数对数,
二、BCEWithLogitsLoss公式
假设有n个样本,类别数是m。
上一篇:
通过多线程提高代码的执行效率例子