赞
踩
self.bce = nn.BCEWithLogitsLoss(reduction='none')
, None的使用方法可以见官网pytorch代码文档
代码举例
import torch a = torch.rand((1, 3, 3)) target = torch.tensor([[[1, 0, 0], [0, 1, 0], [0, 0, 0]]]) print(a) ''' ouput:tensor([[[0.2070, 0.8432, 0.2494], [0.5782, 0.4587, 0.1135], [0.9794, 0.8516, 0.4418]]]) ''' b = torch.nn.BCEWithLogitsLoss(reduction='none')(a, target.to(a.dtype)) print(b) ''' output: tensor([[[0.5950, 1.2011, 0.8256], [1.0234, 0.4899, 0.7515], [1.2982, 1.2070, 0.9383]]]) ''' c = torch.nn.BCEWithLogitsLoss(reduction='mean')(a, target.to(a.dtype)) print(c) ''' output:tensor(0.9256) ''' d = torch.nn.BCEWithLogitsLoss(reduction='sum')(a, target.to(a.dtype)) print(d) ''' output:tensor(8.3301) '''
举例的代码中target中的计算方法是这样的(resuction='none'
)
对于target[0][0][0]=1=yn, a[0][0][0]=0.2070=xn, 因此,对于ln
0.5950
=
−
(
1
×
ln
σ
(
0.2070
)
+
0
×
ln
(
1
−
σ
(
0.2070
)
)
)
0.5950 = -\left ( 1 \times \ln{\sigma\left ( 0.2070 \right ) } + 0 \times\ln{ \left ( 1 - \sigma \left ( 0.2070\right ) \right ) } \right )
0.5950=−(1×lnσ(0.2070)+0×ln(1−σ(0.2070)))
对于target[0][0][1]=0=yn, a[0][0][1]=0.8432=xn, 因此,对于ln
1.2011
=
−
(
0
×
ln
σ
(
0.8432
)
+
1
×
ln
(
1
−
σ
(
0.8432
)
)
)
1.2011= -\left ( 0 \times \ln{\sigma\left ( 0.8432\right ) } + 1 \times\ln{ \left ( 1 - \sigma \left ( 0.8432\right ) \right ) } \right )
1.2011=−(0×lnσ(0.8432)+1×ln(1−σ(0.8432)))
其中
σ
\sigma
σ是Sigmoid函数, 以此类推, 可以最终得到output: tensor([[[0.5950, 1.2011, 0.8256],[1.0234, 0.4899, 0.7515],[1.2982, 1.2070, 0.9383]]])
, 如果reduction=‘mean’
的时候, 就是reduction=‘none’
的output求平均值, 最终可以得到output:tensor(0.9256),如果reduction='sum'
,那就是reduction=‘none’
的output求和,最终可以得到output:tensor(8.3301)
可以验证一下上面的代码,可以看到结果是一样的
a = torch.tensor([[[0.2070, 0.8432, 0.2494], [0.5782, 0.4587, 0.1135], [0.9794, 0.8516, 0.4418]]]) target = torch.tensor([[[1, 0, 0], [0, 1, 0], [0, 0, 0]]]) sa = torch.nn.Sigmoid()(a) result = -(target * torch.log(sa) + (1 - target) * torch.log(1 - sa)) ''' output: tensor([[[0.5950, 1.2011, 0.8256], [1.0235, 0.4899, 0.7515], [1.2982, 1.2070, 0.9382]]]) ''' result_mean = result.mean() ''' output: tensor(0.9256) ''' result_sum = result.sum() ''' output: tensor(8.3300) '''
如果是bs = 2,reduction='mean'
和reduction='sum'
的效果也是一样的,最终的结果也是一个值。代码如下, 可以看到均值不变, 求和的时候扩大2倍
import torch # a = torch.rand((1, 3, 3)) a = torch.tensor([[[0.2070, 0.8432, 0.2494], [0.5782, 0.4587, 0.1135], [0.9794, 0.8516, 0.4418]], [[0.2070, 0.8432, 0.2494], [0.5782, 0.4587, 0.1135], [0.9794, 0.8516, 0.4418]]]) target = torch.tensor([[[1, 0, 0], [0, 1, 0], [0, 0, 0]], [[1, 0, 0], [0, 1, 0], [0, 0, 0]]]) b = torch.nn.BCEWithLogitsLoss(reduction='none')(a, target.to(a.dtype)) print(b) ''' output: tensor([[[0.5950, 1.2011, 0.8256], [1.0235, 0.4899, 0.7515], [1.2982, 1.2070, 0.9382]], [[0.5950, 1.2011, 0.8256], [1.0235, 0.4899, 0.7515], [1.2982, 1.2070, 0.9382]]]) ''' c = torch.nn.BCEWithLogitsLoss(reduction='mean')(a, target.to(a.dtype)) print(c) ''' output: tensor(0.9256) ''' d = torch.nn.BCEWithLogitsLoss(reduction='sum')(a, target.to(a.dtype)) print(d) ''' output: tensor(16.6601) ''' sa = torch.nn.Sigmoid()(a) result = -(target * torch.log(sa) + (1 - target) * torch.log(1 - sa)) print(result) ''' output: tensor([[[0.5950, 1.2011, 0.8256], [1.0235, 0.4899, 0.7515], [1.2982, 1.2070, 0.9382]], [[0.5950, 1.2011, 0.8256], [1.0235, 0.4899, 0.7515], [1.2982, 1.2070, 0.9382]]]) ''' result_mean = result.mean() ''' output: tensor(0.9256) ''' result_sum = result.sum() ''' output: tensor(16.6601) '''
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。