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。

经验分享 程序员 微信小程序 职场和发展