PyTorch的SoftMax交叉熵损失和梯度用法

PyTorch的SoftMax交叉熵损失和梯度用法,第1张

概述PyTorch的SoftMax交叉熵损失和梯度用法 在PyTorch中可以方便的验证SoftMax交叉熵损失和对输入梯度的计算 关于softmax_cross_entropy求导的过程,可以参考HERE 示例: # -*- coding: utf-8 -*- import torch import torch.autograd as autograd from torch.autograd import Variable import torch.nn.functional as F import torch.nn as nn import nu

在PyTorch中可以方便的验证softmax交叉熵损失和对输入梯度的计算

关于softmax_cross_entropy求导的过程,可以参考HERE

示例:

# -*- Coding: utf-8 -*-import torchimport torch.autograd as autogradfrom torch.autograd import Variableimport torch.nn.functional as Fimport torch.nn as nnimport numpy as np# 对data求梯度,用于反向传播data = Variable(torch.floatTensor([[1.0,2.0,3.0],[1.0,3.0]]),requires_grad=True)# 多分类标签 one-hot格式label = Variable(torch.zeros((3,3)))label[0,2] = 1label[1,1] = 1label[2,0] = 1print(label)# for batch loss = mean( -sum(Pj*logSj) )# for one : loss = -sum(Pj*logSj)loss = torch.mean(-torch.sum(label * torch.log(F.softmax(data,dim=1)),dim=1))loss.backward()print(loss,data.grad)

输出:

tensor([[ 0.,0.,1.],[ 0.,1.,0.],[ 1.,0.]])# loss:损失 和 input's grad:输入的梯度tensor(1.4076) tensor([[ 0.0300,0.0816,-0.1116],[ 0.0300,-0.2518,0.2217],[-0.3033,0.2217]])

注意:

对于单输入的loss 和 grad

data = Variable(torch.floatTensor([[1.0,requires_grad=True)label = Variable(torch.zeros((1,3)))#分别令不同索引位置label为1label[0,0] = 1# label[0,1] = 1# label[0,2] = 1print(label)# for batch loss = mean( -sum(Pj*logSj) )# for one : loss = -sum(Pj*logSj)loss = torch.mean(-torch.sum(label * torch.log(F.softmax(data,data.grad)

其输出:

# 第一组:lable: tensor([[ 1.,0.]])loss: tensor(2.4076)grad: tensor([[-0.9100,0.2447,0.6652]])# 第二组:lable: tensor([[ 0.,0.]])loss: tensor(1.4076)grad: tensor([[ 0.0900,-0.7553,0.6652]])# 第三组:lable: tensor([[ 0.,1.]])loss: tensor(0.4076)grad: tensor([[ 0.0900,-0.3348]])"""解释:对于输入数据 tensor([[ 1.,2.,3.]]) softmax之后的结果如下tensor([[ 0.0900,0.6652]])交叉熵求解梯度推导公式可知 s[0,0]-1,s[0,1]-1,2]-1 是上面三组label对应的输入数据梯度"""

pytorch提供的softmax,和log_softmax 关系

# 官方提供的softmax实现In[2]: import torch ...: import torch.autograd as autograd ...: from torch.autograd import Variable ...: import torch.nn.functional as F ...: import torch.nn as nn ...: import numpy as npIn[3]: data = Variable(torch.floatTensor([[1.0,requires_grad=True)In[4]: dataOut[4]: tensor([[ 1.,3.]])In[5]: e = torch.exp(data)In[6]: eOut[6]: tensor([[ 2.7183,7.3891,20.0855]])In[7]: s = torch.sum(e,dim=1)In[8]: sOut[8]: tensor([ 30.1929])In[9]: softmax = e/sIn[10]: softmaxOut[10]: tensor([[ 0.0900,0.6652]])In[11]: # 等同于 pytorch 提供的 softmaxIn[12]: org_softmax = F.softmax(data,dim=1)In[13]: org_softmaxOut[13]: tensor([[ 0.0900,0.6652]])In[14]: org_softmax == softmax # 计算结果相同Out[14]: tensor([[ 1,1,1]],dtype=torch.uint8)# 与log_softmax关系# log_softmax = log(softmax)In[15]: _log_softmax = torch.log(org_softmax)In[16]: _log_softmaxOut[16]: tensor([[-2.4076,-1.4076,-0.4076]])In[17]: log_softmax = F.log_softmax(data,dim=1)In[18]: log_softmaxOut[18]: tensor([[-2.4076,-0.4076]])

官方提供的softmax交叉熵求解结果

# -*- Coding: utf-8 -*-import torchimport torch.autograd as autogradfrom torch.autograd import Variableimport torch.nn.functional as Fimport torch.nn as nnimport numpy as npdata = Variable(torch.floatTensor([[1.0,requires_grad=True)log_softmax = F.log_softmax(data,dim=1)label = Variable(torch.zeros((3,0] = 1print("lable: ",label)# 交叉熵的计算方式之一loss_fn = torch.nn.NLLLoss() # reduce=True loss.sum/batch & grad/batch# NLLLoss输入是log_softmax,target是非one-hot格式的labelloss = loss_fn(log_softmax,torch.argmax(label,dim=1))loss.backward()print("loss: ",loss,"\ngrad: ",data.grad)"""# 交叉熵计算方式二loss_fn = torch.nn.CrossEntropyLoss() # the target label is NOT an one-hotted#CrossEntropyLoss适用于分类问题的损失函数#input:没有softmax过的nn.output,target是非one-hot格式labelloss = loss_fn(data,data.grad)""""""

输出

lable: tensor([[ 0.,0.]])loss: tensor(1.4076)grad: tensor([[ 0.0300,0.2217]])

通过和示例的输出对比,发现两者是一样的

以上这篇PyTorch的softmax交叉熵损失和梯度用法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

总结

以上是内存溢出为你收集整理的PyTorch的SoftMax交叉熵损失和梯度用法全部内容,希望文章能够帮你解决PyTorch的SoftMax交叉熵损失和梯度用法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1199384.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存