PytorchAPI - torch.nn

文章目录

  • Loss Functions
      • (1) torch.nn.CrossEntropyLoss(weight=None, size_average=None, ignore_index=- 100, reduce=None, reduction='mean', label_smoothing=0.0)
      • (2) torch.nn.BCELoss(weight=None, size_average=None, reduce=None, reduction='mean')

Loss Functions

(1) torch.nn.CrossEntropyLoss(weight=None, size_average=None, ignore_index=- 100, reduce=None, reduction=‘mean’, label_smoothing=0.0)

交叉熵(CE)损失函数,该损失函数针对的使用对象是预测得到的softmax结果和目标标签值。比如,一个四分类任务,它的batchsize为2,那么经过网络的预测并softmax后就能得到如下的概率预测tensor
torch.tensor([[0.1, 0.05, 0.7, 0.15], [0.2, 0.3, 0.4, 0.1]])
如果这个batchsize中样本对应的真实标签是
torch.tensor([2, 0])
那么就把概率预测tensor和真实标签放入该损失函数中计算损失。示例如下

	loss = torch.nn.CrossEntropyLoss() #设置交叉熵损失函数
	pre_probability = torch.tensor([[0.1, 0.05, 0.7, 0.15], [0.2, 0.3, 0.4, 0.1]]) # 假设网络输出了这样的softmax结果,batchsize为2,四分类任务
	true_label = torch.tensor([2, 0]) #真实的第一个样本的标签值为2,第二个样本的标签值为0
	Loss = loss(pre_probability, true_label) # 利用交叉熵损失函数计算他们的交叉熵
	print(Loss)
# tensor(1.2081)

上面的 1.2081 1.2081 1.2081是这样计算得到的
首先,对第一个样本计算交叉熵损失
l o s s 1 = ( − 0.7 ) + l n ( e 0.1 + e 0.05 + e 0.7 + e 0.15 ) = 0.974 loss_1=(-0.7)+ln(e^{0.1}+e^{0.05}+e^{0.7}+e^{0.15})=0.974 loss1=(0.7)+ln(e0.1+e0.05+e0.7+e0.15)=0.974
然后,再对第二个样本计算交叉熵损失
l o s s 2 = ( − 0.2 ) + l n ( e 0.2 + e 0.3 + e 0.4 + e 0.1 ) = 1.443 loss_2=(-0.2)+ln(e^{0.2}+e^{0.3}+e^{0.4}+e^{0.1})=1.443 loss2=(0.2)+ln(e0.2+e0.3+e0.4+e0.1)=1.443
最后,对二者求平均,即
l o s s = ( l o s s 1 + l o s s 2 ) / 2 = 1.209 loss=(loss_1+loss_2)/2=1.209 loss=(loss1+loss2)/2=1.209
其实,这个计算交叉熵损失的方法和我们通常见到的不那么一样。对于每一个样本的交叉熵损失,我们可以分成两部分来看。第一部分是减去正确标签值对应的概率预测值,如果正确标签值的概率预测值越接近于 1 1 1,那么减去的就更多,损失就越小;第二部分我的理解是模糊性的一个度量,如果预测概率值在多个标签上都取差不多大,那么第二部分是比较大的,这个时候的预测是非常模糊的,因此其损失也就偏大。

(2) torch.nn.BCELoss(weight=None, size_average=None, reduce=None, reduction=‘mean’)

二值交叉熵(Binary CrossEntropy)损失函数,该损失函数针对的使用对象是预测的概率结果和真实的“概率标签”。比如一幅图像在经过网络预测后得到是人的概率预测结果是 0.7 0.7 0.7,而这幅图像其实就是人,对应的所谓的“概率标签”是 1 1 1
每个样本的交叉熵损失函数计算公式如下:
l o s s = − [ y n × l o g x n + ( 1 − y n ) l o g ( 1 − x n ) ] loss=-[y_n \times logx_n+(1-y_n)log(1-x_n)] loss=[yn×logxn+(1yn)log(1xn)]
这里的 y n y_n yn是样本的概率标签, x n x_n xn是样本经过网络得到的预测概率。
举个例子,比如一批四个样本经过网络得到的预测结果为

output = torch.tensor([0.1, 0.7, 0.5, 0.2])

每一个分量都代表一个由样本经过网络得到的预测概率值。它们对应的概率标签为

target = torch.tensor([1, 1, 0, 0], dtype=torch.float32)

那么我们计算这批样本的二值交叉熵(BCE)就是:
L o s s = − [ ( l n 0.1 + l n 0.7 + l n ( 1 − 0.5 ) + l n ( 1 − 0.2 ) ] / 4 = 0.894 Loss=-[(ln0.1+ln0.7+ln(1-0.5)+ln(1-0.2)]/4=0.894 Loss=[(ln0.1+ln0.7+ln(10.5)+ln(10.2)]/4=0.894
但是有的时候会出现 l n 0 ln0 ln0这样的情况,这时计算的结果为负无穷,在Pytorch中也是这么定义的。Pytorch的处理手段是如果结果小于等于-100,那么就直接截断。
使用示例如下

    output = torch.tensor([0.1, 0.7, 0.5, 0.2])
    target = torch.tensor([1, 1, 0, 0], dtype=torch.float32)
    criterion = nn.BCELoss()
    loss = criterion(output, target)
    print(loss)
# tensor(0.8939)

你可能感兴趣的:(Pytorch,神经网络)