Pytorch 提供的交叉熵相关的函数有:
torch.nn.CrossEntropyLoss
torch.nn.KLDivLoss
torch.nn.BCELoss
torch.nn.BCEWithLogitsLoss
torch.nn.MultiLabelSoftMarginLoss
class torch.nn.CrossEntropyLoss(weight=None, size_average=True, ignore_index=-100, reduce=True)[source]
作用
针对单目标分类问题, 结合了 nn.LogSoftmax() 和 nn.NLLLoss() 来计算 loss.
用于训练 C C 类别classes 的分类问题.
参数 weight
是 1D Tensor, 分别对应每个类别class 的权重. 对于类别不平衡的训练数据集比较有用.
输入input
包含了每一类别的概率或score.
输入 input Tensor 的大小是 (minibatch,C) ( m i n i b a t c h , C ) 或 (minibatch,C,d1,d2,...,dK) ( m i n i b a t c h , C , d 1 , d 2 , . . . , d K ) . K≥2 K ≥ 2 表示 K K -dim 场景.
输入 target 是类别class 的索引( [0,C−1] [ 0 , C − 1 ] , C C 是类别classes 总数.)
loss(x,class)=−log(exp(x[class])∑jexp(x[j])) l o s s ( x , c l a s s ) = − l o g ( e x p ( x [ c l a s s ] ) ∑ j e x p ( x [ j ] ) )
loss(x,class)=−x[class]+log(∑jexp(x[j])) l o s s ( x , c l a s s ) = − x [ c l a s s ] + l o g ( ∑ j e x p ( x [ j ] ) )
带 weight
形式:
loss(x,class)=weight[class](−x[class]+log(∑jexp(x[j]))) l o s s ( x , c l a s s ) = w e i g h t [ c l a s s ] ( − x [ c l a s s ] + l o g ( ∑ j e x p ( x [ j ] ) ) )
losses 在 minibatch 内求平均.
也支持高维输入 inputs, 如 2D images, 则会逐元素计算 NLL Loss.
参数:
weight(Tensor, optional) - 每个类别class 的权重. 默认为值为 1 的 Tensor.
size_average(bool, optional) – 默认为 True.
size_average=True, 则 losses 在 minibatch 结合 weight 求平均average.
size_average=False, 则losses 在 minibatch 求相加和sum.
当 reduce=False 时,忽略该参数.
ignore_index(int, optional) - 指定忽略的 target 值, 不影响 input 梯度计算.
当 size_average=True, 对所有非忽略的 targets 求平均.
reduce(bool, optional) - 默认为 True.
reduce=True, 则 losses 在 minibatch 求平均或相加和.
reduce=False, 则 losses 返回 per batch 值, 并忽略 size_average.
输入 - input x, (N,C) ( N , C ) , C=num_classes C = n u m _ c l a s s e s 类别总数.
输入 - target y, (N) ( N ) , 每个值都是 0≤targets[i]≤C−1 0 ≤ t a r g e t s [ i ] ≤ C − 1
输出 - 如果 reduce=True, 输出标量值. 如果 reduce=False, 输出与输入target一致, (N) ( N )
输入 - input x, (N,C,d1,d2,...,dK) ( N , C , d 1 , d 2 , . . . , d K ) , K≥2 K ≥ 2 适用于 K K -dim 场景
输入 - target y, (N,d1,d2,...,dK) ( N , d 1 , d 2 , . . . , d K ) , K≥2 K ≥ 2 适用于 K K -dim 场景
输出 - 如果 reduce=True, 输出标量值. 如果 reduce=False, 输出与输入target一致, (N,d1,d2,...,dK) ( N , d 1 , d 2 , . . . , d K ) , K≥2 K ≥ 2 适用于 K K -dim 场景
例示:
# 1D
import torch
import torch.nn as nn
loss = nn.CrossEntropyLoss()
# input, NxC=2x3
input = torch.randn(2, 3, requires_grad=True)
# target, N
target = torch.empty(2, dtype=torch.long).random_(3)
output = loss(input, target)
output.backward()
class torch.nn.KLDivLoss(size_average=True, reduce=True)
作用:
相对熵, 也叫 KL 散度, Kullback-Leibler divergence Loss.
KL 散度用于估计连续分布的距离.
当对连续输出分布进行直接回归时, KL 散度比较有用.
输入 input 应该是在进行了一次 forward 来计算每个类别class 的 log-probabilities 概率.
输入 input 不一定是 2D Tensor, 因为其计算是逐元素进行的.
ℓ(x,y)=L={l1,...,lN}T ℓ ( x , y ) = L = { l 1 , . . . , l N } T , ln=yn⊙(logyn−xn) l n = y n ⊙ ( l o g y n − x n )
N N - batchsize.
如果 reduce=True
,
ℓ(x,y)=mean(L),if size_average=True ℓ ( x , y ) = m e a n ( L ) , i f s i z e _ a v e r a g e = T r u e
ℓ(x,y)=sum(L),if size_average=False ℓ ( x , y ) = s u m ( L ) , i f s i z e _ a v e r a g e = F a l s e
参数:
size_average(bool, optional) – 默认为 True.
size_average=True, 则 losses 在 minibatch 求平均average.
size_average=False, 则losses 在 minibatch 求相加和sum.
当 reduce=False 时,忽略该参数.
reduce(bool, optional) - 默认为 True.
reduce=True, 则 losses 在 minibatch 求平均或相加和.
reduce=False, 则 losses 返回每个 input/target 元素, 并忽略 size_average.
输入 - input x, (N,∗) ( N , ∗ )
输入 - target y, (N,∗) ( N , ∗ )
输出 - 如果 reduce=True, 输出标量值. 如果 reduce=False, 输出与输入一致, (N,∗) ( N , ∗ )
class torch.nn.BCELoss(weight=None, size_average=True, reduce=True)
作用:
计算 target 和 output 间的二值交叉熵(Binary Cross Entropy)
ℓ(x,y)=L={l1,...,lN}T ℓ ( x , y ) = L = { l 1 , . . . , l N } T
ln=−wn[yn⋅logxn+(1−yn)⋅log(1−xn)] l n = − w n [ y n ⋅ l o g x n + ( 1 − y n ) ⋅ l o g ( 1 − x n ) ]
N N - batchsize
如果 reduce=True
,
ℓ(x,y)=mean(L),if size_average=True ℓ ( x , y ) = m e a n ( L ) , i f s i z e _ a v e r a g e = T r u e
ℓ(x,y)=sum(L),if size_average=False ℓ ( x , y ) = s u m ( L ) , i f s i z e _ a v e r a g e = F a l s e
用于计算重构误差,如 auto-encoder 中.
targets y 的值是 0 和 1 之间的数值.
参数:
weight(Tensor, optional) - 每个batch 元素 的权重.
size_average(bool, optional) – 默认为 True.
size_average=True, 则 losses 在 minibatch 结合 weight 求平均average.
size_average=False, 则losses 在 minibatch 求相加和sum.
当 reduce=False 时,忽略该参数.
reduce(bool, optional) - 默认为 True.
reduce=True, 则 losses 在 minibatch 求平均或相加和.
reduce=False, 则 losses 返回 per input/target 元素值, 并忽略 size_average.
输入 - input x, (N, *)
输入 - target y, (N, *)
输出 - 如果 reduce=True, 输出标量值. 如果 reduce=False, 输出与输入一致, (N,∗) ( N , ∗ )
例示:
import torch
import torch.nn as nn
sig = nn.Sigmoid()
loss = nn.BCELoss()
input = torch.randn(3, requires_grad=True)
target = torch.empty(3).random_(2)
output = loss(sig(input), target)
output.backward()
class torch.nn.BCEWithLogitsLoss(weight=None, size_average=True, reduce=True)
作用:
该 loss 层包括了 Sigmoid 层和 BCELoss 层. 单类别任务.
数值计算稳定性更好( log-sum-exp trick), 相比与 Sigmoid + BCELoss.
ℓ(x,y)=L={l1,...,lN}T ℓ ( x , y ) = L = { l 1 , . . . , l N } T
ln=−wn[tn⋅logσ(xn)+(1−tn)⋅log(1−σ(xn))] l n = − w n [ t n ⋅ l o g σ ( x n ) + ( 1 − t n ) ⋅ l o g ( 1 − σ ( x n ) ) ]
如果 reduce=True
,
ℓ(x,y)=mean(L),if size_average=True ℓ ( x , y ) = m e a n ( L ) , i f s i z e _ a v e r a g e = T r u e
ℓ(x,y)=sum(L),if size_average=False ℓ ( x , y ) = s u m ( L ) , i f s i z e _ a v e r a g e = F a l s e
用于计算重构误差,如 auto-encoder 中.
targets t[i] t [ i ] 的值是 0 和 1 之间的数值.
参数:
weight(Tensor, optional) - 每个batch 元素 的权重.
size_average(bool, optional) – 默认为 True.
size_average=True, 则 losses 在 minibatch 结合 weight 求平均average.
size_average=False, 则losses 在 minibatch 求相加和sum.
当 reduce=False 时,忽略该参数.
reduce(bool, optional) - 默认为 True.
reduce=True, 则 losses 在 minibatch 求平均或相加和.
reduce=False, 则 losses 返回 per input/target 元素值, 并忽略 size_average.
class torch.nn.MultiLabelSoftMarginLoss(weight=None, size_average=True, reduce=True)
作用:
基于 max-entropy 计算输入 input x 和 target x 间的 multi-label one-versus-all loss.
对于 minibatch 内的每个样本,
loss(x,y)=−∑iy[i]∗log(11+exp(−x[i])+(1−y[i])∗log(exp(−x[i])1+exp(−x[i])) l o s s ( x , y ) = − ∑ i y [ i ] ∗ l o g ( 1 1 + e x p ( − x [ i ] ) + ( 1 − y [ i ] ) ∗ l o g ( e x p ( − x [ i ] ) 1 + e x p ( − x [ i ] ) )
其中, i=[0,nElement()] i = [ 0 , n E l e m e n t ( ) ] , y[i]∈{0,1} y [ i ] ∈ { 0 , 1 }
参数:
weight(Tensor, optional) - 每个类别class 的权重. 默认为值为 1 的 Tensor.
size_average(bool, optional) – 默认为 True.
size_average=True, 则 losses 在 minibatch 结合 weight 求平均average.
size_average=False, 则losses 在 minibatch 求相加和sum.
当 reduce=False 时,忽略该参数.
reduce(bool, optional) - 默认为 True.
reduce=True, 则 losses 在 minibatch 求平均或相加和.
reduce=False, 则 losses 返回 per batch 元素值, 并忽略 size_average.
输入 - input x, (N, C), C = num_classes 类别总数.
输入 - target y, (N)
输出 - 如果 reduce=True, 输出标量值. 如果 reduce=False, 输出与输入target一致, (N) ( N )
class torch.nn.MultiLabelMarginLoss(size_average=True, reduce=True)
作用:
计算 input x 和output y 间的 multi-class multi-classifitcation hinge loss.
input x - 2D minibatch Tensor
output y - target 类别class 索引的 2D Tensor.
对于 minibatch 内的每个样本,
loss(x,y)=∑i,jmax(0,1−(x[y[j]]−x[i]))x.size(0) l o s s ( x , y ) = ∑ i , j m a x ( 0 , 1 − ( x [ y [ j ] ] − x [ i ] ) ) x . s i z e ( 0 )
其中, i=[0,x.size(0)],j=[0,y.size(0)] i = [ 0 , x . s i z e ( 0 ) ] , j = [ 0 , y . s i z e ( 0 ) ] , 对于所有的 i i 和 j j 有 y[j]≥0 y [ j ] ≥ 0 和 i≠y[j] i ≠ y [ j ] .
该loss 只考虑从正面开始的非负 targets 的连续块.(The criterion only considers a contiguous block of non-negative targets that starts at the front.)
参数:
size_average(bool, optional) – 默认为 True.
size_average=True, 则 losses 在 minibatch 结合 weight 求平均average.
size_average=False, 则losses 在 minibatch 求相加和sum.
当 reduce=False 时,忽略该参数.
reduce(bool, optional) - 默认为 True.
reduce=True, 则 losses 在 minibatch 求平均或相加和.
reduce=False, 则 losses 返回 per batch 元素值, 并忽略 size_average.
输入 - input x, (C) 或 (N, C), C = num_classes 类别总数, N 为 batchsize
输入 - target y, C 或 (N, C)
输出 - 如果 reduce=True, 输出标量值. 如果 reduce=False, 输出, (N) ( N )