PyTorch示例的BCEWithLogitsLoss数值计算的输出

时间:2019-12-09 10:00:14

标签: python pytorch

当我在PyTorch Docs中查看BCEWithLogitsLoss的示例代码时。我对损失函数和公式的输出结果感到困惑。

PyTorch Example

>>> loss = nn.BCEWithLogitsLoss()
>>> input = torch.randn(3, requires_grad=True)
>>> target = torch.empty(3).random_(2)
>>> output = loss(input, target)
>>> output.backward()

input : tensor([0.4764, -2.4063,  0.1563], requires_grad=True)
target: tensor([0., 1., 1.])
output: tensor(1.3567, grad_fn=<BinaryCrossEntropyWithLogitsBackward>)

但是根据公式显示:

enter image description here

损失函数的输出应具有形状(3,)而不是单一值,因为输入和输出的形状均为(3,)。我以为输出可能是Ln的总和,但还是不知道。有人可以帮我解释一下吗?

正如@Dishin H Goyani提醒的那样,默认减少量是'mean'。我做了一个简单的测试。

>>> target_n = target.numpy()
>>> input_n  = input.detach().numpy()
>>> def sigmoid(array):return 1/(1+np.exp(-array))
>>> output_n = -1*(target_n*np.log(sigmoid(input_n))+(1-target_n)*np.log(1-sigmoid(input_n)))
output_n : array([0.95947516, 2.4926252 , 0.61806685], dtype=float32)
>>> np.mean(output_n)
1.3567224

结果匹配。

如您所见,默认Wn为1。

1 个答案:

答案 0 :(得分:4)

在BCEWithLogitsLoss中,作为 reduction 参数的默认值为“ 平均值”。

输出是平均值-输出的总和将除以输出中元素的数量。

Read Doc here for more detail:
参数
...
精简 (字符串,可选) –指定要应用于输出的精简:'none' | 'mean' | 'sum'

  

'none':将不减少费用,
  'mean':输出的总和将除以输出中元素的数量,
  'sum':将对输出求和。

注意:size_average和reduce正在不赞成使用的过程中,同时,指定这两个args中的任何一个将覆盖reduce。默认值:'mean'
...