pytorch损失函数之nn.CrossEntropyLoss()、nn.NLLLoss()「建议收藏」

pytorch损失函数之nn.CrossEntropyLoss()、nn.NLLLoss()「建议收藏」这个损失函数用于多分类问题虽然说的交叉熵,但是和我们理解的交叉熵不一样

大家好,又见面了,我是你们的朋友全栈君。

nn.CrossEntropyLoss()这个损失函数用于多分类问题虽然说的是交叉熵,但是和我理解的交叉熵不一样。nn.CrossEntropyLoss()是nn.logSoftmax()和nn.NLLLoss()的整合,可以直接使用它来替换网络中的这两个操作。下面我们来看一下计算过程。
首先输入是size是(minibatch,C)。这里的C是类别数。损失函数的计算如下:

l o s s ( x , c l a s s ) = − l o g ( e x p ( x [ c l a s s ] ) ∑ j e x p ( x [ j ] ) ) = − x [ c l a s s ] + l o g ( ∑ j e x p ( x [ j ] ) ) loss(x,class)=-log(\frac{exp(x[class])}{\sum_jexp(x[j])})=-x[class]+log(\sum_jexp(x[j])) loss(x,class)=log(jexp(x[j])exp(x[class]))=x[class]+log(jexp(x[j]))

损失函数中也有权重weight参数设置,若设置权重,则公式为: l o s s ( x , c l a s s ) = w e i g h t [ c l a s s ] ( − x [ c l a s s ] + l o g ( ∑ j e x p ( x [ j ] ) ) ) loss(x,class)=weight[class](-x[class]+log(\sum_jexp(x[j]))) loss(x,class)=weight[class](x[class]+log(jexp(x[j])))
其他参数不具体说,和nn.BCELoss()设置差不多,默认情况下,对minibatch的loss求均值。

注意这里的标签值class,并不参与直接计算,而是作为一个索引,索引对象为实际类别

举个栗子,我们一共有三种类别,批量大小为1(为了好计算),那么输入size为(1,3),具体值为torch.Tensor([[-0.7715, -0.6205,-0.2562]])。标签值为target = torch.tensor([0]),这里标签值为0,表示属于第0类。loss计算如下:
import torch
import torch.nn as nn
import math

entroy=nn.CrossEntropyLoss()
input=torch.Tensor([[-0.7715, -0.6205,-0.2562]])
target = torch.tensor([0])
output = entroy(input, target)
print(output)
#根据公式计算
输出:

tensor(1.3447)

动手自己算:

− x [ 0 ] + l o g ( e x p ( x [ 0 ] ) + e x p ( x [ 1 ] ) + e x p ( x [ 2 ] ) ) -x[0]+log(exp(x[0])+exp(x[1])+exp(x[2])) x[0]+log(exp(x[0])+exp(x[1])+exp(x[2])) = 0.7715 + l o g ( e x p ( − 0.7715 ) + e x p ( − 0.6205 ) + e x p ( − 0.2562 ) = 1.3447266007601868 =0.7715+log(exp(-0.7715)+exp(-0.6205)+exp(-0.2562)=1.3447266007601868 =0.7715+log(exp(0.7715)+exp(0.6205)+exp(0.2562)=1.3447266007601868

我们在看看是否等价nn.logSoftmax()和nn.NLLLoss()的整合:
m = nn.LogSoftmax()
loss = nn.NLLLoss()
input=m(input)
output = loss(input, target)
print('output:',output)
输出:

input: tensor([[-1.3447, -1.1937, -0.8294]])
output: tensor(1.3447)

可以看出nn.LogSoftmax()的对输入的操作就是: l o g ( e x p ( x ) ∑ i e x p ( x [ i ] ) ) log(\frac{exp(x)}{\sum_iexp(x[i])}) log(iexp(x[i])exp(x))x是输入向量。
而nn.NLLLoss()的操作是: l o s s n = − w n x n , y n loss_n=-w_nx_{n,y_n} lossn=wnxn,yn这里没有设置权重,也就是权重默认为1,x_{n,y_n}表示目标类所对应输入x中值,则loss就为 l o s s = − 1 ∗ x [ 0 ] = 1.3447 loss=-1*x[0]=1.3447 loss=1x[0]=1.3447
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/158215.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • webpack版本区别_webpack和vue cli区别

    webpack版本区别_webpack和vue cli区别首先我们查看一下webpack的版本信息吧:现在已经更新到4.2.0版本了,理论上,我们可以选择任何一个版本,但是新的版本也不一定就是最好的选择,可能存在各种各样的问题,一旦出现了让人纠结的问题,解决麻烦还是挺浪费时间的,并且4.0以后的版本已经分离了webpack-cli,所以目前,无论是学习还是开发项目,我们可以先选择之前较为稳定的版本,个人还是用的3.0的版本;当然了,新的版本还是要测试着…

    2022年8月10日
    34
  • 计算权重的方法_ahp权重计算方法

    计算权重的方法_ahp权重计算方法三.层叠和继承+继承父元素拥有了某个css属性,子元素不需要任何条件的情况下都会拥有父元素的属性。并不是所有的css属性都能继承,可以被继承的css属性有以下:colortextlin

    2022年8月4日
    6
  • jquery的delegate实现原理[通俗易懂]

    jquery的delegate实现原理[通俗易懂]//对标签绑定点击事件但是该方法对动态生成的元素无法生效$(‘.btn’).bind(‘click’,function(){alert(‘点击了’);})//jquery处理$(‘document’).delegate(‘.btn’,’click’,function(){alert(‘点击了’);});//其实原理就是利用了J

    2022年8月30日
    1
  • sql语句里的limit使用方法

    sql语句里的limit使用方法 SELECT * FROM table  LIMIT [offset,] rows | rows OFFSET offset   在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了上面这样一个功能。    LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量…

    2022年6月13日
    33
  • Supervisor进程管理详解「建议收藏」

    Supervisor进程管理详解「建议收藏」文章目录1.supervisor简介2.supervisor安装2.1安装方式2.2验证3.supervisor配置文件3.1主配置文件3.2子配置文件(program配置)3.2.1详细配置3.2.2公司配置4.进程管理命令5.web管理(不常用)6.Supervisor配置systemctl服务7.Supervisor管理redis和nginx7.1安装nginx和redis7.2配置文件7.3重新加载新配置文件7.4测试8.组管理8.1部署三个redis8.2

    2025年9月1日
    4
  • pycharm2022.01.13 激活码【2022.01最新】

    (pycharm2022.01.13 激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~2KLK…

    2022年4月1日
    68

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号