Pytorch损失函数——(交叉熵合集)

本文主要讲解Pytorch的交叉熵函数的使用

首先要注意的是PyTorch是Channel First模式,对于图片而言格式应该是(B,C,H,W),这个尤其重要,搞错了一定会报错。

1、torch.nn.CrossEntropyLoss()

大写的CrossEntropyLoss表示是一个类,需要先实例化

loss = torch.nn.CrossEntropyLoss()
pred = torch.zeros((4,2,32,32),dtype=torch.float32)
target =torch.ones((4,32,32),dtype=torch.long)
loss_nn = loss(pred,target)
print(loss_nn)

输出: tensor(0.6931)

需要注意的是:

  • pred的类型需要时浮点型,而target的类型需要时long类型,不然会报错
  • target不需要转化成one-hot形式,只需要[0,1,2,3,4,…]即可,CrossEntropy中自动进行转化为one-hot格式
  • 输入的维度也可以是pred:(4,2,32*32)target:(4,32*32),总之target要比pred少channel的通道
  • 使用CrossEntropyLoss时,网络最后不需要进行softmax,该函数会进行log_softmax的操作

2、torch.nn.functional.cross_entropy()

pred = torch.zeros((4,2,32,32),dtype=torch.float32)
target =torch.ones((4,32,32),dtype=torch.long)
loss_F = F.cross_entropy(pred, target)
print(loss_F)

输出:tensor(0.6931)

print(loss_F == loss_nn)

输出:tensor(True)

  • nn和nn.functional中的交叉熵的方法做的事情是一样的。

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

  • weight必须和target的shape一致,默认为none。
  • 一般使用reduction即可,主要有4中,‘mean’,‘sum’,‘none’,'elementwise_mean’这4种,mean和sum就是求均值以及求损失和,none则是返回向量形式的损失值。
torch.manual_seed(1)
pred = torch.randn((4,32,32),dtype=torch.float32)
target = torch.ones((4,32,32),dtype=torch.float32)
sig = torch.nn.Sigmoid()
pred = sig(pred)
loss_nn = torch.nn.BCELoss(reduction='mean')(pred,target)
print(loss_nn)

输出:tensor(0.8030)

注意点如下:

  • BCELoss前需要进行sigmoid操作
  • pred和target的数据类型都要时float类型
  • pred和target都不需要channel通道,因为是二值一个通道就可以表示0-1两类。
  • 也可以对长和宽进行压缩:pred:(B,WxH),target:(B,WxH)

4.torch.nn.functional.binary_cross_entropy(pred,target)

    torch.manual_seed(1)
    pred = torch.randn((4,32,32),dtype=torch.float32)
    target = torch.ones((4,32,32),dtype=torch.float32)
    sig = torch.nn.Sigmoid()
    pred = sig(pred)
    loss_f = torch.nn.functional.binary_cross_entropy(pred,target)
    print(loss_f)

输出:tensor(0.8030)

print(loss_nn==loss_f)

输出:tensor(True)

  • nn和nn.functional中的二值交叉熵的方法做的事情是一样的。

5.torch.nn.BCEWithLogitsLoss()

这个类和BCELoss的差别在于多了sigmoid操作

torch.manual_seed(1)
pred = torch.randn((4,32,32),dtype=torch.float32)
target = torch.ones((4,32,32),dtype=torch.float32)
loss_nn = torch.nn.BCEWithLogitsLoss()(pred,target)
print(loss_nn)

输出:tensor(0.8030)

  • 输出和BCELoss()相同,BCEWithLogitsLoss()等价于Sigmoid()+BCELoss()。

6.torch.nn.functional.binary_cross_entropy_with_logits()

torch.manual_seed(1)
pred = torch.randn((4,32,32),dtype=torch.float32)
target = torch.ones((4,32,32),dtype=torch.float32)
loss_f = torch.nn.functional.binary_cross_entropy_with_logits(pred,target)
print(loss_f)

输出:tensor(0.8030)

print(loss_f==loss_nn)

输出:tensor(True)

  • functional.binary_cross_entropy_with_logits和nn.BCEWithLogitsLoss的计算过程是等价的

你可能感兴趣的:(深度学习,Python,python,深度学习,pytorch)