Pytorch中BCELoss和BCEWithLogitsLoss的差别
BCELoss
在图片多标签分类时,如果3张图片分3类,会输出一个3*3的矩阵。
先用Sigmoid给这些值都搞到0~1之间:
假设Target是:
BCELoss是 − 1 n ∑ ( y n × l n x n + ( 1 − y n ) × l n ( 1 − x n ) ) -\frac{1}{n} \sum(y_n \times lnx_n + (1-y_n) \times ln(1-x_n)) −n1∑(yn×lnxn+(1−yn)×ln(1−xn)) ,其中y是target,x是模型输出的值。
所以对于第一行:
- 第一列 0 × l n 0.3992 + ( 1 − 0 ) × l n ( 1 − 0.3992 ) = − 0.5095 0\times ln0.3992 + (1-0) \times ln(1-0.3992) = -0.5095 0×ln0.3992+(1−0)×ln(1−0.3992)=−0.5095
- 第二列 1 × l n 0.2232 + ( 1 − 1 ) × l n ( 1 − 0.2232 ) = − 1.4997 1 \times ln0.2232 + (1-1) \times ln(1-0.2232) = -1.4997 1×ln0.2232+(1−1)×ln(1−0.2232)=−1.4997
- 第三列 1 × l n 0.6435 + ( 1 − 1 ) × l n ( 1 − 0.6435 ) = − 0.4408 1\times ln0.6435 + (1-1) \times ln(1-0.6435) = -0.4408 1×ln0.6435+(1−1)×ln(1−0.6435)=−0.4408
第二行:
- 第一列 0 × l n 0.3800 + ( 1 − 0 ) × l n ( 1 − 0.3800 ) = − 0.4780 0\times ln0.3800 + (1-0) \times ln(1-0.3800) = -0.4780 0×ln0.3800+(1−0)×ln(1−0.3800)=−0.4780
- 第二列 0 × l n 0.3044 + ( 1 − 0 ) × l n ( 1 − 0.3044 ) = − 0.3630 0 \times ln0.3044 + (1-0) \times ln(1-0.3044) = -0.3630 0×ln0.3044+(1−0)×ln(1−0.3044)=−0.3630
- 第三列 1 × l n 0.3241 + ( 1 − 1 ) × l n ( 1 − 0.3241 ) = − 1.1267 1\times ln0.3241 + (1-1) \times ln(1-0.3241) = -1.1267 1×ln0.3241+(1−1)×ln(1−0.3241)=−1.1267
第三行:
- 第一列 1 × l n 0.6281 + ( 1 − 1 ) × l n ( 1 − 0.6281 ) = − 0.4651 1\times ln0.6281 + (1-1) \times ln(1-0.6281) = -0.4651 1×ln0.6281+(1−1)×ln(1−0.6281)=−0.4651
- 第二列 0 × l n 0.4689 + ( 1 − 0 ) × l n ( 1 − 0.4689 ) = − 0.6328 0 \times ln0.4689 + (1-0) \times ln(1-0.4689) = -0.6328 0×ln0.4689+(1−0)×ln(1−0.4689)=−0.6328
- 第三列 1 × l n 0.3834 + ( 1 − 1 ) × l n ( 1 − 0.3834 ) = − 0.9587 1\times ln0.3834 + (1-1) \times ln(1-0.3834) = -0.9587 1×ln0.3834+(1−1)×ln(1−0.3834)=−0.9587
去掉负号求个均值:
0.5095
+
1.4997
+
0.4008
3
=
0.8167
0.4780
+
0.3630
+
1.1267
3
=
0.6559
0.4651
+
0.6328
+
0.9587
3
=
0.6855
\frac{0.5095+ 1.4997+0.4008}{3} = 0.8167 \\ \frac{0.4780+0.3630+1.1267}{3} = 0.6559 \\ \frac{0.4651+ 0.6328 + 0.9587}{3} = 0.6855
30.5095+1.4997+0.4008=0.816730.4780+0.3630+1.1267=0.655930.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:
BCEWithLogitsLoss
BCEWithLogitsLoss就是把Sigmoid和BCELoss合成一步。我们直接用刚刚的input验证一下是不是0.7193: