整体来说,这个区别,有没有with logit就是看模型的最后一层有没有加上sigmoid层。
BCEwithlogitsloss = BCELoss + Sigmoid
导入必要库,设置预测数值和模型真实类别(二分类问题)
import torch
pred = torch.tensor([[-0.2],[0.2],[0.8]])
target = torch.FloatTensor([[0],[0],[1]])先把pred转换成Sigmoid的0~1的概率。
sigmoid = torch.nn.Sigmoid()
print(sigmoid(pred))
然后计算BCELoss:
上面的pred(i)表示第i个样本的经过sigmoid的预测概率。
求相反数的均值:
然后用PyTorch的BCELoss来计算一下:
import torch
pred = torch.tensor([[-0.2],[0.2],[0.8]])
target = torch.FloatTensor([[0],[0],[1]])
sigmoid = torch.nn.Sigmoid()
loss = torch.nn.BCELoss()
print('BCELoss:',loss(sigmoid(pred),target))得到答案:

直接来看这个结果就行了:
import torch
pred = torch.FloatTensor([[-0.2],[0.2],[0.8]])
target = torch.FloatTensor([[0],[0],[1]])
sigmoid = torch.nn.Sigmoid()
loss = torch.nn.BCEWithLogitsLoss()
print('BCEWithLogitsLoss:',loss(pred,target))一样,所以就相差一个Sigmoid罢了。

喜欢的话请关注我们的微信公众号~【机器学习炼丹术】。
微信搜索公众号:【机器学习炼丹术】。期待您的关注。