当前位置:   article > 正文

BCEWithLogitsLoss

bcewithlogitsloss

bce = BCEWithLogitsLoss()

pred为网络输出,y为标签值。

  • 第一种情况。pred和y都只有一个值

        pred1.shape:[1],pred1.dtype:torch.float32

        y1.shape:[1],pred1.dtype:torch.float32

  1. >>> pred1 = torch.Tensor([0.3])
  2. >>> y1 = torch.Tensor([1])
  3. >>> bce(pred1,y1)
  4. tensor(0.5544)
  • 根据交叉熵公式:loss = -(1-y)*log(1-pred)-y*log(pred),当y取0的时候只剩下-(1-y)*log(1-pred),当y取1的时候剩下-y*log(pred)
  • 需要注意,首先需要将0.3进行sigmoid处理,1/(1+1/math.pow(e,0.3))就是将0.3进入sigmoid网络。所以pred不是0.3,是1/(1+1/math.pow(e,0.3))=0.5744
  1. >>> import math
  2. >>> e = math.e
  3. >>> log = math.log
  4. >>> -log(1/(1+1/math.pow(e,0.3)))
  5. 0.5543552444685272
  • 第二种情况。pred和y不是一个值,是列表

        pred1.shape:[10],pred1.dtype:torch.float32

        y1.shape:[10],pred1.dtype:torch.float32

  1. >>> y2 = torch.ones([10], dtype=torch.float32)
  2. >>> pred2 = torch.full([10], 1.5)
  3. >>> criterion(pred2, y2)
  4. tensor(0.2014)
  • 因为都是1.5,-log(1/(1+1/math.pow(e,1.5)))=0.2014,加起来再平均一下,还是0.2014

  • 第三种情况。pred和y不是一个值,是矩阵

         pred1.shape:[10,64],pred1.dtype:torch.float32

        y1.shape:[10,64],pred1.dtype:torch.float32

  1. >>> y3 = torch.ones([4, 3], dtype=torch.float32)
  2. >>> pred3 = torch.full([4, 3], 1.5)
  3. >>> criterion = torch.nn.BCEWithLogitsLoss()
  4. >>> y3[0] = 0
  5. >>> pred3
  6. tensor([[1.5000, 1.5000, 1.5000],
  7. [1.5000, 1.5000, 1.5000],
  8. [1.5000, 1.5000, 1.5000],
  9. [1.5000, 1.5000, 1.5000]])
  10. >>> y3
  11. tensor([[0., 0., 0.],
  12. [1., 1., 1.],
  13. [1., 1., 1.],
  14. [1., 1., 1.]])
  15. >>> criterion(pred3, y3)
  16. tensor(0.5764)
  17. '''
  18. 若标签为1,且输出为1.5,则结果为:-log(1/(1+1/math.pow(e,1.5)))=0.2014
  19. 若标签为0,且输出为1.5,则结果为:-log(1-1/(1+1/math.pow(e,1.5)))=1.7014
  20. y3矩阵中,有3个0,9个1,表示(3*1.7014+9*0.2014)/12=0.5764
  21. '''
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/790716
推荐阅读
相关标签
  

闽ICP备14008679号