没有合适的资源?快使用搜索试试~ 我知道了~
首页Pytorch中torch.nn的损失函数
目录 前言 一、torch.nn.BCELoss(weight=None, size_average=True) 二、nn.BCEWithLogitsLoss(weight=None, size_average=True) 三、torch.nn.MultiLabelSoftMarginLoss(weight=None, size_average=True) 四、总结 前言 最近使用Pytorch做多标签分类任务,遇到了一些损失函数的问题,因为经常会忘记(好记性不如烂笔头囧rz),都是现学现用,所以自己写了一些代码探究一下,并在此记录,如果以后还遇到其他损失函数,继续在此补充。 如果有兴趣,我建
资源详情
资源评论
资源推荐

Pytorch中中torch.nn的损失函数的损失函数
目录目录
前言
一、torch.nn.BCELoss(weight=None, size_average=True)
二、nn.BCEWithLogitsLoss(weight=None, size_average=True)
三、torch.nn.MultiLabelSoftMarginLoss(weight=None, size_average=True)
四、总结
前言前言
最近使用Pytorch做多标签分类任务,遇到了一些损失函数的问题,因为经常会忘记(好记性不如烂笔头囧rz),都是现学现
用,所以自己写了一些代码探究一下,并在此记录,如果以后还遇到其他损失函数,继续在此补充。
如果有兴趣,我建议大家阅读Pytorch的官方中文文档的loss function部分,讲得比较清晰。
注:官方文档中特别强调了计算出来的结果默认已经对计算出来的结果默认已经对mini-batch取了平均取了平均。
一、一、torch.nn.BCELoss(weight=None, size_average=True)
注:以下公式都是针对一个一个element(即即mini-batch=1)的情形,如果mini-batch=m,最后的输出结果默认会对m个loss取平均
的。
(关于weight和size_average两个参数我就不介绍了,介绍起来显得太啰嗦,只需要注意如果使用weight参数,那么weight的
shape需要和类别数保持一致)
这个地方需要强调的两点:
1、此处的、此处的i是指第是指第i个类别,个类别,C表示总共有表示总共有C个类别。个类别。
2、、 0<=y[i]<=1(官方写的(官方写的0<=target[i]<=1应该是写错了!)应该是写错了!)
下面是我实现的代码:
# 自己写的BCELoss函数
def BCE(y, target):
loss = -(target*torch.log(y) + (1-target)*torch.log(1-y))
# 官方文档中特别强调了:计算出来的结果默认对mini-batch取平均
return loss.mean()
if __name__ == '__main__':
# mini-batch = 2 , data shape is [2, 4] y = torch.FloatTensor([[0.5, 0.9, 0.1, 0.3],
[0.1, 0.2, 0.3, 0.9]])
target = torch.FloatTensor([[0, 1, 0, 0],
[0, 0, 1, 1]])
# 官方的BCELoss()
criterion = nn.BCELoss()
loss = criterion(y, target)
# 自己的BCELoss()
loss2 = BCE(y, target)
print("官方实现的BCELoss:", loss)
print("自己实现的BCELoss:", loss2)
可以看到输出结果和官方是一样的
输出结果:
官方实现的BCELoss: tensor(0.3623)
自己实现的BCELoss: tensor(0.3623)
二、二、nn.BCEWithLogitsLoss(weight=None, size_average=True)
官方文档中没有看到这个函数,不过还是讲一下。

















安全验证
文档复制为VIP权益,开通VIP直接复制

评论0