Pytorch的CrossEntropyLoss以及LogSoftmax和NLLLoss学习

机器学习中的分类问题常用到交叉熵作为损失函数,那么Pytorch中如何使用交叉熵损失函数呢?这就涉及到torch.nn中的三个类:nn.LogSoftmax、nn.NLLLoss、nn.CrossEntropyLoss,今天剖析一下这几个类,便于以后查找。

一、nn.LogSoftmax

softmax常用在网络的输出层上,以得到每个类别的概率,顾名思义,nn.LogSoftmax就是对softmax的结果取了一个log。

来源:https://pytorch.org/docs/stable/generated/torch.nn.LogSoftmax.html#torch.nn.LogSoftmax

注意,使用这个类时最好要指定dim,即沿着tensor的哪一个维度做softmax,如果不指定,也能做,那么沿着哪一维做呢?通过层层查看源码,我们发现:

来源:https://pytorch.org/docs/stable/_modules/torch/nn/functional.html#log_softmax

来源:https://pytorch.org/docs/stable/_modules/torch/nn/functional.html#log_softmax

如果不指定dim,torch会调用到_get_softmax_dim函数,该函数会根据输入tensor的维度总数指定一个,0、1、3维tensor,沿着第0维做;其他的,沿着第1维做。同时,该函数给我们了警告,告诉我们应该人为指定dim.

二、nn.NLLLoss

这个loss的全称叫负对数似然loss(negative log likelihood loss),里面的操作我认为其实就是取了个负。。如果不考虑前面可选的权重的话:

来源:https://pytorch.org/docs/stable/generated/torch.nn.NLLLoss.html#torch.nn.NLLLoss

因为它要求输入就已经是每个类的对数值了。值得注意的是,target并不是one-hot向量,而是范围在[0, C-1]之间的类别索引。这一点和后面要说的CrossEntropyLoss是一样的。

三、nn.CrossEntropyLoss

nn.CrossEntropyLoss可以看作是nn.LogSoftmax和nn.NLLLoss的结合:

来源:https://pytorch.org/docs/stable/generated/torch.nn.CrossEntropyLoss.html?highlight=crossentropy#torch.nn.CrossEntropyLoss

即对输入数据先做log_softmax,再过NLLLoss。

注意体会红框内的计算过程,可以理解为什么它要求target不是one-hot向量,而是类别索引的标号:target中的类别序号yn实际上给出了计算softmax时的使用的输入向量x的索引,如此一来,

​计算的恰好是第yn类对应的似然值。也就是说x_n,yn代表的是某batch中第n个样本的yn个值。

这个计算形式跟我们熟悉的交叉熵的形式:

loss = -( \Sigmaylogy'+(1-y)log(1-y') )

是等效的。

还有一点要注意的是,如果reduction不是'none'的话,默认会取平均,这个平均不仅是对batch取平均,如果有其它维度的话,对其它维度也是平均的

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值