交叉熵损失函数原理及pytorch实现
torch.nn.functional.cross_entropy代码定义(可参考大牛写的这篇博客:https://blog.csdn.net/chao_shine/article/details/89925762?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164627346316780357263356%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=164627346316780357263356&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-1-89925762.pc_search_result_cache&utm_term=%E4%BA%A4%E5%8F%89%E7%86%B5%E6%8D%9F%E5%A4%B1%E5%87%BD%E6%95%B0%E4%BB%A3%E7%A0%81&spm=1018.2226.3001.4187)
def cross_entropy(input, target, weight=None, size_average=None, ignore_index=-100,
reduce=None, reduction=‘mean’):
# type: (Tensor, Tensor, Optional[Tensor], Optional[bool], int, Optional[bool], str) -> Tensor
if size_average is not None or reduce is not None:reduction = _Reduction.legacy_get_string(size_average, reduce)
return nll_loss(log_softmax(input, 1), target, weight, None, ignore_index, None, reduction)
可以看出inpt、target是必选项,并且都是Tensor类型。最后return可以看出functional.cross_entropy实际计算过程应是先计算input的log_softmax,然后再计算nll_loss
log_softmax是在sotfmax基础上进行log函数。
sotfmax 在dim上的理解:注意:上标在哪计算结果就在哪(可参考:):https://blog.csdn.net/weixin_41391619/article/details/104823086?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_antiscan&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_antiscan&utm_relevant_index=2
y = torch.rand(size=[2,2,3])
print(‘y=’,y)
net1 = nn.Softmax(dim=0)
net2 = nn.Softmax(dim=1)
net3 = nn.Softmax(dim=2)
当dim =0:旨在第一个维度上,本例中第一个维度是2
y= tensor([[[0.1391, 0.1783, 0.8231],
[0.8878, 0.8061, 0.2732]],
[[0.7208, 0.6728, 0.9620],[0.5471, 0.3034, 0.8006]]])
dim=0的结果是: tensor([[[0.3585, 0.3788, 0.4653],
[0.5843, 0.6231, 0.3711]],
[[0.6415, 0.6212, 0.5347],[0.4157, 0.3769, 0.6289]]])
是怎么计算的呢?
for i in range(2):
print(y[i,:,:].reshape(-1))
#输出tensor([0.1391, 0.1783, 0.8231, 0.8878, 0.8061, 0.2732])
tensor([0.7208, 0.6728, 0.9620, 0.5471, 0.3034, 0.8006])
…
dim = 1:旨在第二维度上,本例第二维度为2
print(‘dim=1的结果’,net2(y))
for i in range(2):
print(y[:,i,:].reshape(-1)) #
dim=1的结果 tensor([[[0.3211, 0.3480, 0.6341],
[0.6789, 0.6520, 0.3659]],[[0.5433, 0.5913, 0.5403],[0.4567, 0.4087, 0.4597]]])
reshape输出:tensor([0.1391, 0.1783, 0.8231, 0.7208, 0.6728, 0.9620])
tensor([0.8878, 0.8061, 0.2732, 0.5471, 0.3034, 0.8006])
dim = 3旨在第三维度上,本例第三维度为3
print(‘dim=2的结果’,net3(y))
for i in range(3):
print(y[:,:,i].reshape(-1))
#输出结果:
dim=2的结果 tensor([[[0.2486, 0.2586, 0.4928],
[0.4061, 0.3742, 0.2196]],
[[0.3100, 0.2955, 0.3946],[0.3255, 0.2551, 0.4194]]])
#reshape结果:
tensor([0.1391, 0.8878, 0.7208, 0.5471])
tensor([0.1783, 0.8061, 0.6728, 0.3034])
tensor([0.8231, 0.2732, 0.9620, 0.8006])
知道了log_softmax是干嘛的,现在来了解下nll_loss
truth = torch.tensor([0], dtype=torch.int64)
predicted1 = torch.tensor([[0.5, 0.4, 0.1]], dtype=torch.float)
loss = nn.NLLLoss()
print(F.log_softmax(predicted1, 1))
print(loss(F.log_softmax(predicted1, 1), truth))
print(F.cross_entropy(predicted1, truth))
输出结果:
tensor([[-0.9459, -1.0459, -1.3459]])
tensor(0.9459)
tensor(0.9459)
可以看到truth中的值就是log_softmax结果后的数组的idx,即truth的0对应-0.9459的位置,将-0.9459取出后取负数便为NLLLoss的结果。同样地,若truth的值为1,那么第二行和第三行的输出结果为1.0459。
交叉熵损失函数原理及pytorch实现相关推荐
- 交叉熵损失函数原理详解
交叉熵损失函数原理详解 之前在代码中经常看见交叉熵损失函数(CrossEntropy Loss),只知道它是分类问题中经常使用的一种损失函数,对于其内部的原理总是模模糊糊,而且一般使用交叉熵作为损失函 ...
- 交叉熵损失函数原理深层理解
说起交叉熵损失函数「Cross Entropy Loss」,相信大家都非常熟悉,但是要深入理解交叉熵损失函数的原理和作用,还得溯本追源才能对其有一个真实的理解与认知. 交叉熵 交叉熵是用来度量两个概率 ...
- 交叉熵损失函数原理详解,KL散度
https://blog.csdn.net/b1055077005/article/details/100152102 https://blog.csdn.net/tsyccnh/article/de ...
- 损失函数-交叉熵的原理及实现
咕咕咕~不催不更 什么是损失函数,损失函数的作用是? 有哪些常用的损失函数?数学表达式是什么? 实现 交叉熵的原理 实现 pytorch自带的交叉熵: class CrossEntropyLoss(_ ...
- 【交叉熵损失函数】关于交叉熵损失函数的一些理解
目录 0. 前言 1.损失函数(Loss Function) 1.1 损失项 1.2 正则化项 2. 交叉熵损失函数 2.1 softmax 2.2 交叉熵 0. 前言 有段时间没写博客了,前段时间主 ...
- 一文读懂交叉熵损失函数
进行二分类或多分类问题时,在众多损失函数中交叉熵损失函数较为常用. 下面的内容将以这三个问题来展开 什么是交叉熵损失 以图片分类问题为例,理解交叉熵损失函数 从0开始实现交叉熵损失函数 1,什么是交叉 ...
- LESSON 10.110.210.3 SSE与二分类交叉熵损失函数二分类交叉熵损失函数的pytorch实现多分类交叉熵损失函数
在之前的课程中,我们已经完成了从0建立深层神经网络,并完成正向传播的全过程.本节课开始,我们将以分类深层神经网络为例,为大家展示神经网络的学习和训练过程.在介绍PyTorch的基本工具AutoGrad ...
- 交叉熵损失函数分类_逻辑回归(Logistic Regression)二分类原理,交叉熵损失函数及python numpy实现...
本文目录: 1. sigmoid function (logistic function) 2. 逻辑回归二分类模型 3. 神经网络做二分类问题 4. python实现神经网络做二分类问题 ----- ...
- Pytorch专题实战——交叉熵损失函数(CrossEntropyLoss )
文章目录 1.用CrossEntropyLoss预测单个目标 2.用CrossEntropyLoss预测多个目标 3.二分类使用BCELoss损失函数 4.多分类使用CrossEntropyLoss损 ...
最新文章
- 自己编写的MSN历史记录合并工具
- js 日期星期 带农历
- ios传值给js_WKWebView JS与OC间相互传值调用
- 1.2 文本域(含可编辑表格实现)
- Specificity考量
- TortoiseSVN的bin目录下面没有svn.exe
- 吃相难看!《人民日报》再评视频网站套路:消磨观众信任,必将引火烧身
- 牛客小白月赛2 G 文 【模拟】
- 【cc2541历程】APP更改蓝牙设备名称
- High-Quality Genome-Scale Models From Error-Prone, Long-Read Assemblies高质量的基因组尺度模型来自易出错的,长时间读取的程序集
- 计算机内存不足 无法使用,电脑内存不足怎么办,教您解决电脑内存不足
- 小样本不符合正态_尿液样本HPV分型检测用于宫颈癌筛查的可能性
- navicat 执行sql文件
- Postman 是一个接口测试和 http 请求的神器,非常好用。
- kangle安装php7.0_【Kangle】Linux下EasyPanel及PHP安装升级
- Codelf 命名神器
- Android从上往下滑动或从下往上滑动结束Activity
- 英文版系统远程桌面无法连接到远程计算机,windows server 2016远程桌面进去,英文系统修改语言...
- ZZULIOJ-2905
- win11安装deepin20.6双系统(双硬盘)
热门文章
- EOS区块链一周要闻回顾(2.17-2.23)
- CE.CCC.FCC分别是欧盟,中国,美国的强制认证要求吗?
- Dimensional Modeling
- Java基础学习记录~~
- linux系列:shell将字符串分割成数组
- footbar2000 简单介绍
- MCS51霓虹灯_Proteus仿真
- AutoEventWireup=false导致Page_Load事件未执行
- python decode ignore_Python decode()方法 - Python 教程 - 自强学堂
- ESET NOD32 Antivirus 13.1.21.0 免激活版