介绍
这期内容当中小编将会给大家带来有关如何在PyTorch中使用SoftMax交叉熵损失和梯度,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
<强>示例强>:
#, - *安康;编码:utf-8 - * - import 火炬 import torch.autograd  as autograd 得到torch.autograd import 变量 import torch.nn.functional  as F import torch.nn  as 神经网络 import numpy  as np #,对数据求梯度,,用于反向传播 时间=data 变量(torch.FloatTensor ([[1.0,, 2.0, 3.0),, (1.0, 2.0, 3.0),, (1.0, 2.0, 3.0]]),, requires_grad=True) #,多分类标签,一个炎热的格式 时间=label 变量(torch.zeros ((3), 3))) 标签(0,2),=,1 标签(1,1),=,1 标签(2,,0),=,1 打印(标签) #,for batch loss =,意味着(,总和(Pj * logSj),) #,for one : loss =,总和(Pj * logSj) 时间=loss torch.mean (-torch.sum (label *, torch.log (F.softmax(数据,昏暗的=1),,暗=1)) loss.backward () 打印(损失,data.grad)
输出:
张量([[0。,,0。,,1。), ,,,(0。,,1,,0), ,,,(0,1,,,0。]]) #,失:损失,和,输入# 39;s 研究生:输入的梯度 张量(1.4076),张量([[,0.0300,0.0816,-0.1116), (,,,,0.0300,-0.2518,0.2217), ,,,(-0.3033,0.0816,0.2217]])
<强>注意强>:
对于单输入的损失和研究生
data =,变量(torch.FloatTensor ([[1.0,, 2.0, 3.0]]),, requires_grad=True) 时间=label 变量(torch.zeros ((1,, 3))) #分别令不同索引位置标签为1 标签(0,0),=,1 #,标签[0,1],=,1 #,标签(0,2),=,1 打印(标签) #,for batch loss =,意味着(,总和(Pj * logSj),) #,for one : loss =,总和(Pj * logSj) 时间=loss torch.mean (-torch.sum (label *, torch.log (F.softmax(数据,昏暗的=1),,暗=1)) loss.backward () 打印(损失,data.grad)
其输出:
#,第一组: 标签:,张量([[0,1,,,0。]]) 损失:张量(2.4076), 研究生:张量([[-0.9100,,0.2447,0.6652))) #,第二组: 标签:,张量([[0。,,1,,0。]]) 损失:张量(1.4076), 研究生:张量([[-0.7553,0.0900,,0.6652]]) #,第三组: 标签:,张量([[0。,,0。,,1。]]) 损失:张量(0.4076), 研究生:张量([[0.2447,0.0900,,-0.3348]]) “““ 解释: 对于输入数据,张量([[1。,,2,,3。]]),softmax之后的结果如下 张量([[0.2447,0.0900,0.6652]]) 交叉熵求解梯度推导公式可知,年代(0,0)1,s [0, 1] 1, s(0, 2) 1,是上面三组标签对应的输入数据梯度 “““
pytorch提供的softmax,和log_softmax关系
#,官方提供的softmax实现 在[2]:import 火炬 ,……:import torch.autograd  as autograd ,……:得到torch.autograd import 变量 ,……:import torch.nn.functional  as F ,……:import torch.nn  as 神经网络 ,……:import numpy  as np 在[3]:data =,变量(torch.FloatTensor ([[1.0,, 2.0, 3.0]]),, requires_grad=True) 在[4]:数据 出[4]:张量([[1。,,2,,3。]]) 在[5]:e =, torch.exp(数据) 在[6]:e [6]:,张量([[,2.7183,,7.3891,20.0855]]) 在[7]:s =, torch.sum (e,昏暗的=1) 在[8]:s 出[8]:张量(30.1929 [,]) 在[9]:softmax =e/s 在[10]:softmax [10]:,张量([[,0.0900,0.2447,0.6652]]) 在[11]:#,等同于,pytorch 提供的,softmax 在[12],org_softmax =, F.softmax(数据,昏暗的=1) 在[13]:org_softmax [13]:,张量([[,0.0900,0.2447,0.6652]]) 在[14],org_softmax ==, softmax #,计算结果相同 [14]:,张量([[,1,1,1]],,dtype=torch.uint8) #,与log_softmax关系=#,log_softmax 日志(softmax) 在[15]:_log_softmax =, torch.log (org_softmax), 在[16]:_log_softmax 出[16]:张量([[-2.4076,,-1.4076,-0.4076))) 在[17],log_softmax =, F.log_softmax(数据,昏暗的=1) 在[18]:log_softmax [18]:,张量([[-2.4076,,-1.4076,-0.4076]])
官方提供的softmax交叉熵求解结果
#, - *安康;编码:utf-8 - * - import 火炬 import torch.autograd  as autograd 得到torch.autograd import 变量 import torch.nn.functional  as F import torch.nn  as 神经网络 import numpy  as np null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null如何在PyTorch中使用SoftMax交叉熵损失和梯度