pytorch中交叉熵损失(nn.CrossEntropyLoss())的计算过程详解


Posted in Python onJanuary 02, 2020

公式

首先需要了解CrossEntropyLoss的计算过程,交叉熵的函数是这样的:

pytorch中交叉熵损失(nn.CrossEntropyLoss())的计算过程详解

其中,其中yi表示真实的分类结果。这里只给出公式,关于CrossEntropyLoss的其他详细细节请参照其他博文。

测试代码(一维)

import torch
import torch.nn as nn
import math

criterion = nn.CrossEntropyLoss()
output = torch.randn(1, 5, requires_grad=True)
label = torch.empty(1, dtype=torch.long).random_(5)
loss = criterion(output, label)

print("网络输出为5类:")
print(output)
print("要计算label的类别:")
print(label)
print("计算loss的结果:")
print(loss)

first = 0
for i in range(1):
  first = -output[i][label[i]]
second = 0
for i in range(1):
  for j in range(5):
    second += math.exp(output[i][j])
res = 0
res = (first + math.log(second))
print("自己的计算结果:")
print(res)

pytorch中交叉熵损失(nn.CrossEntropyLoss())的计算过程详解

测试代码(多维)

import torch
import torch.nn as nn
import math
criterion = nn.CrossEntropyLoss()
output = torch.randn(3, 5, requires_grad=True)
label = torch.empty(3, dtype=torch.long).random_(5)
loss = criterion(output, label)

print("网络输出为3个5类:")
print(output)
print("要计算loss的类别:")
print(label)
print("计算loss的结果:")
print(loss)

first = [0, 0, 0]
for i in range(3):
  first[i] = -output[i][label[i]]
second = [0, 0, 0]
for i in range(3):
  for j in range(5):
    second[i] += math.exp(output[i][j])
res = 0
for i in range(3):
  res += (first[i] + math.log(second[i]))
print("自己的计算结果:")
print(res/3)

pytorch中交叉熵损失(nn.CrossEntropyLoss())的计算过程详解

nn.CrossEntropyLoss()中的计算方法

注意:在计算CrossEntropyLosss时,真实的label(一个标量)被处理成onehot编码的形式。

在pytorch中,CrossEntropyLoss计算公式为:

pytorch中交叉熵损失(nn.CrossEntropyLoss())的计算过程详解

CrossEntropyLoss带权重的计算公式为(默认weight=None):

pytorch中交叉熵损失(nn.CrossEntropyLoss())的计算过程详解

以上这篇pytorch中交叉熵损失(nn.CrossEntropyLoss())的计算过程详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
九步学会Python装饰器
May 09 Python
Python argv用法详解
Jan 08 Python
Python之str操作方法(详解)
Jun 19 Python
python实现rsa加密实例详解
Jul 19 Python
浅谈Scrapy框架普通反爬虫机制的应对策略
Dec 28 Python
在python中pandas读文件,有中文字符的方法
Dec 12 Python
对Django 中request.get和request.post的区别详解
Aug 12 Python
Python函数式编程指南:对生成器全面讲解
Nov 19 Python
python为什么要安装到c盘
Jul 20 Python
python 实现单例模式的5种方法
Sep 23 Python
基于Python制作一副扑克牌过程详解
Oct 19 Python
Python离线安装各种库及pip的方法
Nov 28 Python
基于torch.where和布尔索引的速度比较
Jan 02 #Python
Python魔法方法 容器部方法详解
Jan 02 #Python
python 图像的离散傅立叶变换实例
Jan 02 #Python
Python加密模块的hashlib,hmac模块使用解析
Jan 02 #Python
在win64上使用bypy进行百度网盘文件上传功能
Jan 02 #Python
pytorch实现onehot编码转为普通label标签
Jan 02 #Python
pytorch标签转onehot形式实例
Jan 02 #Python
You might like
深入解析php模板技术原理【一】
2008/01/10 PHP
Symfony核心类概述
2016/03/17 PHP
PHP读取大文件末尾N行的高效方法推荐
2016/06/03 PHP
(JS实现)MapBar中坐标的加密和解密的脚本
2007/05/16 Javascript
运用jquery实现table单双行不同显示并能单行选中
2009/07/25 Javascript
jquery点击页面任何区域实现鼠标焦点十字效果
2013/06/21 Javascript
浅析javascript的间隔调用和延时调用
2014/11/12 Javascript
JavaScript结合AJAX_stream实现流式显示
2015/01/08 Javascript
JavaScript实现动画打开半透明提示层的方法
2015/04/21 Javascript
jq checkbox 的全选并ajax传参的实例
2017/04/01 Javascript
浅谈在vue项目中如何定义全局变量和全局函数
2017/10/24 Javascript
webpack手动配置React开发环境的步骤
2018/07/02 Javascript
vue观察模式浅析
2018/09/25 Javascript
js实现json数组分组合并操作示例
2019/02/12 Javascript
如何自定义微信小程序tabbar上边框的颜色
2019/07/09 Javascript
JS严格模式原理与用法实例分析
2020/04/27 Javascript
Sublime Text3 配置 NodeJs 环境的方法
2020/05/20 NodeJs
vue 获取url参数、get参数返回数组的操作
2020/11/12 Javascript
[57:09]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第一场 1月26日
2021/03/11 DOTA
pyhanlp安装介绍和简单应用
2019/02/22 Python
10招!看骨灰级Pythoner玩转Python的方法
2019/04/15 Python
python模拟键盘输入 切换键盘布局过程解析
2019/08/15 Python
python中time库的实例使用方法
2019/10/31 Python
使用python 的matplotlib 画轨道实例
2020/01/19 Python
html5 横向滑动导航栏的方法示例
2020/05/08 HTML / CSS
澳大利亚宠物商店:Petbarn
2017/11/18 全球购物
大学毕业生求职自荐信
2014/02/20 职场文书
元旦文艺汇演主持词
2014/03/26 职场文书
少先队活动总结
2014/08/29 职场文书
党的群众路线教育实践活动教师自我剖析材料
2014/10/09 职场文书
运动会开幕词
2015/01/28 职场文书
简爱读书笔记
2015/06/26 职场文书
安全教育主题班会教案
2015/08/12 职场文书
html form表单基础入门案例讲解
2021/07/21 HTML / CSS
JS数组方法some、every和find的使用详情
2021/10/05 Javascript
JavaScript圣杯布局与双飞翼布局实现案例详解
2022/08/05 Javascript