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。
上一篇:
通过多线程提高代码的执行效率例子
