当我在PyTorch Docs中查看BCEWithLogitsLoss的示例代码时。我对损失函数和公式的输出结果感到困惑。
>>> 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>)
但是根据公式显示:
损失函数的输出应具有形状(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。
答案 0 :(得分:4)
在BCEWithLogitsLoss中,作为 reduction 参数的默认值为“ 平均值”。
输出是平均值-输出的总和将除以输出中元素的数量。
Read Doc here for more detail:
参数
...
精简 (字符串,可选) –指定要应用于输出的精简:'none'
| 'mean'
| 'sum'
。
'none'
:将不减少费用,
'mean'
:输出的总和将除以输出中元素的数量,
'sum'
:将对输出求和。
注意:size_average和reduce正在不赞成使用的过程中,同时,指定这两个args中的任何一个将覆盖reduce。默认值:'mean'
...