Pytorch详解BCELoss和BCEWithLogitsLoss

BCELoss

在图片多标签分类时,如果3张图片分3类,会输出一个3*3的矩阵。

在这里插入图片描述

先用Sigmoid给这些值都搞到0~1之间:

在这里插入图片描述

假设Target是:

在这里插入图片描述

BCELoss是 − 1 n ∑ ( y n × ln ⁡ x n + ( 1 − y n ) × ln ⁡ ( 1 − x n ) ) -\frac 1 n\sum(y_n \times \ln x_n+(1-y_n) \times \ln(1-x_n)) n1(yn×lnxn+(1yn)×ln(1xn))
其中y是target,x是模型输出的值。
所以对于第一行:
第一列 0 × ln ⁡ 0.3992 + ( 1 − 0 ) × ln ⁡ ( 1 − 0.3992 ) = − 0.5095 0 \times \ln 0.3992+ (1-0) \times \ln (1-0.3992)=-0.5095 0×ln0.3992+(10)×ln(10.3992)=0.5095
第二列 1 × ln ⁡ 0.2232 + ( 1 − 1 ) × ln ⁡ ( 1 − 0.2232 ) = − 1.4997 1 \times \ln 0.2232+ (1-1) \times \ln (1-0.2232)=-1.4997 1×ln0.2232+(11)×ln(10.2232)=1.4997
第三列 1 × ln ⁡ 0.6435 + ( 1 − 1 ) × ln ⁡ ( 1 − 0.6435 ) = − 0.4408 1 \times \ln 0.6435+ (1-1) \times \ln (1-0.6435)=-0.4408 1×ln0.6435+(11)×ln(10.6435)=0.4408
第二行:
第一列 0 × ln ⁡ 0.3800 + ( 1 − 0 ) × ln ⁡ ( 1 − 0.3800 ) = − 0.4780 0 \times \ln 0.3800+ (1-0) \times \ln (1-0.3800)=-0.4780 0×ln0.3800+(10)×ln(10.3800)=0.4780
第二列 0 × ln ⁡ 0.3044 + ( 1 − 0 ) × ln ⁡ ( 1 − 0.3044 ) = − 0.3630 0 \times \ln 0.3044+ (1-0) \times \ln (1-0.3044)=-0.3630 0×ln0.3044+(10)×ln(10.3044)=0.3630
第三列 1 × ln ⁡ 0.3241 + ( 1 − 1 ) × ln ⁡ ( 1 − 0.3241 ) = − 1.1267 1 \times \ln 0.3241+ (1-1) \times \ln (1-0.3241)=-1.1267 1×ln0.3241+(11)×ln(10.3241)=1.1267
第三行:
第一列 1 × ln ⁡ 0.6281 + ( 1 − 1 ) × ln ⁡ ( 1 − 0.6281 ) = − 0.4651 1 \times \ln 0.6281+ (1-1) \times \ln (1-0.6281)=-0.4651 1×ln0.6281+(11)×ln(10.6281)=0.4651
第二列 0 × ln ⁡ 0.4689 + ( 1 − 0 ) × ln ⁡ ( 1 − 0.4689 ) = − 0.6328 0 \times \ln 0.4689+ (1-0) \times \ln (1-0.4689)=-0.6328 0×ln0.4689+(10)×ln(10.4689)=0.6328
第三列 1 × ln ⁡ 0.3834 + ( 1 − 1 ) × ln ⁡ ( 1 − 0.3834 ) = − 0.9587 1 \times \ln 0.3834+ (1-1) \times \ln (1-0.3834)=-0.9587 1×ln0.3834+(11)×ln(10.3834)=0.9587
去掉负号求个均值:
0.5095 + 1.4997 + 0.4408 3 = 0.8167 \frac {0.5095+1.4997+0.4408} {3} = 0.8167 30.5095+1.4997+0.4408=0.8167
0.4780 + 0.3630 + 1.1267 3 = 0.6559 \frac {0.4780+0.3630+1.1267} {3} = 0.6559 30.4780+0.3630+1.1267=0.6559
0.4651 + 0.6328 + 0.9587 3 = 0.6855 \frac {0.4651+0.6328+0.9587} {3} = 0.6855 30.4651+0.6328+0.9587=0.6855
再取个平均:
0.8167 + 0.6559 + 0.6855 3 = 0.7194 \frac {0.8167+0.6559+0.6855} {3} = 0.7194 30.8167+0.6559+0.6855=0.7194
下面我们用BCELoss来验证一下Loss是不是0.7194!

在这里插入图片描述

emmm应该是我上面每次都保留4位小数,算到最后误差越来越大差了0.0001。不过也很厉害啦哈哈哈哈哈!

BCEWithLogitsLoss

BCEWithLogitsLoss就是把Sigmoid-BCELoss合成一步。我们直接用刚刚的input验证一下是不是0.7193:

在这里插入图片描述

嘻嘻,我可真是太厉害啦!

如果你也觉得我很厉害,请打赏以鼓励我做的更好,非常感谢!

在这里插入图片描述

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页