当前位置:   article > 正文

通过手动计算短平快地搞懂Pytorch中两个函数F.binary_cross_entropy_with_logits及F.cross_entropy的计算原理_f.binary_cross_entropy_with_logits源码

f.binary_cross_entropy_with_logits源码

首先是F.binary_cross_entropy_with_logits(input,target)的手动计算和掉包计算实现。input的大小和target的大小要保证一样。

直接上代码:

  1. import torch.nn as nn
  2. import torch
  3. from math import log
  4. import torch.nn.functional as F
  5. input=torch.tensor([[0.5474, 0.2197],[0.1033, 1.3856]])
  6. target=torch.tensor([[0., 1.],[1., 0.]])
  7. Sigmoid_input=nn.Sigmoid()(input)
  8. print('Sigmoid_input:{}'.format(Sigmoid_input))
  9. print('手动计算:{}'.format(torch.mean(-torch.log(Sigmoid_input)*target-torch.log(1-Sigmoid_input)*(1-target))))
  10. print('掉包计算:{}'.format(F.binary_cross_entropy_with_logits(input,target)))

运行结果:

  1. Sigmoid_input:tensor([[0.6335, 0.5547],
  2. [0.5258, 0.7999]])
  3. 手动计算:0.9612189531326294
  4. 掉包计算:0.9612190127372742

发现手动计算和掉包计算的结果一样!

F.cross_entropy(input,target)的手动计算和掉包计算实现。

注意target比input少一维。例如input是二维的tensor,尺寸是(batch_size,label_num),即batch的长度是batch_size,多分类任务的标签数是label_num,则target是一维的tensor,且类型为LongTensor,每个值代表对应样本真实标签的索引。

直接上代码:

  1. input=torch.tensor([[0.5474, 0.2197],[0.1033, 1.3856]])
  2. target=torch.LongTensor([0, 1])
  3. Softmax_input=nn.Softmax(dim=1)(input)
  4. print('Softmax_input:{}'.format(Softmax_input))
  5. print('手动计算:{}'.format(((-log(0.5812))+(-log(0.7828)))/2))
  6. print('掉包计算:{}'.format(F.cross_entropy(input,target)))

运行结果:

  1. Softmax_input:tensor([[0.5812, 0.4188],
  2. [0.2172, 0.7828]])
  3. 手动计算:0.39376919537311245
  4. 掉包计算:0.3937433063983917

手动计算和掉包计算的结果一致!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/525377
推荐阅读
相关标签
  

闽ICP备14008679号