以前我浏览博客的时候记得别人说过,BCELoss与CrossEntropyLoss都是用于分类问题。可以知道,BCELoss是Binary CrossEntropyLoss的缩写,BCELoss CrossEntropyLoss的一个特例,只用于二分类问题,而CrossEntropyLoss可以用于二分类,也可以用于多分类。
不过我重新查阅了一下资料,发现同样是处理二分类问题,BCELoss与CrossEntropyLoss是不同的。下面我详细讲一下哪里不同。
1. 使用nn.BCELoss需要在该层前面加上Sigmoid函数。
公式如下:
2. 使用nn.CrossEntropyLoss会自动加上Sofrmax层。
公式如下:
实际使用的时候:
对于nn.BCELoss:
import torch.nn.functional as F
loss_fn = torch.nn.BCELoss(reduce=False, size_average=False)
input = torch.randn(3, 4)
target = torch.FloatTensor(3, 4).random_(2)
loss = loss_fn(F.sigmoid(input), target)
print(input); print(target); print(loss)
这里的target可以是:
tensor([[ 0., 0., 0., 1.],
[ 1., 0., 0., 0.],
[ 0., 0., 0., 1.]])
对于nn.CrossEntropyLoss:
weight = torch.Tensor([1,2,1,1,10])
loss_fn = torch.nn.CrossEntropyLoss(reduce=False, size_average=False, weight=weight)
input = torch.randn(3, 5))
target = torch.FloatTensor(3).random_(5)
loss = loss_fn(input, target)
print(input); print(target); print(loss)
这里的target:
tensor([ 1., 1., 4.])
我们可以看到target样子不一样的。这里也是我们需要注意的。