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(∑j​exp(x[j])exp(x[class])​)=−x[class]+log(j∑​exp(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(j∑​exp(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(∑i​exp(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​=−wn​xn,yn​​这里没有设置权重,也就是权重默认为1,x_{n,y_n}表示目标类所对应输入x中值,则loss就为 l o s s = − 1 ∗ x [ 0 ] = 1.3447 loss=-1*x[0]=1.3447 loss=−1∗x[0]=1.3447。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

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


相关推荐

  • visual studio code使用方法_vscode自定义代码块

    visual studio code使用方法_vscode自定义代码块snippet,也即代码片,指的是能够帮助输入重复代码模式,比如循环或条件语句,的模板。本文即旨于详实地介绍如何在vscode中设置snippet。

    2022年10月2日
  • Android获取屏幕分辨率及DisplayMetrics简介[通俗易懂]

    Android 可设置为随着窗口大小调整缩放比例,但即便如此,手机程序设计人员还是必须知道手机屏幕的边界,以避免缩放造成的布局变形问题。手机的分辨率信息是手机的一项重要信息,很好的是,Android 已经提供DisplayMetircs 类可以很方便的获取分辨率。下面简要介绍 DisplayMetics 类:Andorid.util 包下的DisplayMetrics 类

    2022年3月9日
  • 概率/随机数算法

    概率/随机数算法包含主要的概率/随机数问题相关算法

    2022年7月26日
  • gridview样式模板_css列表样式

    gridview样式模板_css列表样式在标签中加入一个样式表,并定义它.                   .GridViewStyle              {                     border-right:2pxsolid#A7A6AA;                   border-bottom:2pxsolid#A7A6AA;             

    2022年9月16日
  • 医咖会SPSS免费教程学习笔记—2*C卡方检验

    医咖会SPSS免费教程学习笔记—2*C卡方检验1.2C卡方检验需要满足的假设:(1)观测变量是二分类变量(2)有多个分组(3)观测值相互独立(4)任意单元格的期望频数大于52.2C卡方检验的组间比较请依次点击:分析—描述统计—交叉表—将变量分别拖入行和列—点击右侧“统计”—选择“卡方”—继续点击右侧“单元格”—选择计数下的“实测”,百分比下的“列”,勾选z检验选择调整p值(邦弗仑尼法)3.结果解读两两比较有无差异,看输出的交叉表中计数下标是否一致。若一致,则无差异;否则,有差异总体有无差异,看输出的卡方检验表格中的显著性水平…

    2022年5月17日
  • torch.optim.lr_scheduler:调整学习率

    torch.optim.lr_scheduler:调整学习率本文是笔者在学习cycleGAN的代码时,发现其实现了根据需求选择不同调整学习率方法的策略,遂查资料了解pytorch各种调整学习率的方法。主要参考:https://pytorch.org/docs/stable/optim.html#how-to-adjust-learning-rate1综述torch.optim.lr_scheduler模块提供了一些根据epoch训练次数来调整学习率(…

    2022年10月22日

发表回复

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

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