如何在PyTorch中使用SoftMax交叉熵损失和梯度

  介绍

这期内容当中小编将会给大家带来有关如何在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交叉熵损失和梯度