学习目的:掌握自动微分模块的使用
训练神经网络时,最常用的算法就是反向传播。在该算法中,参数(模型权重)会根据损失函数关于对应参数的梯度进行调整。为了计算这些梯度,PyTorch 内置了名为 torch.autograd
的微分引擎。它支持任意计算图的自动梯度计算:
接下来我们使用这个结构进行自动微分模块的介绍。我们使用 backward 方法、grad 属性来实现梯度的计算和访问。
-
当X为标量时梯度的计算
import torch # 1. 当X为标量时梯度的计算 def test01():x = torch.tensor(5)# 目标值y = torch.tensor(0.)# 设置要更新的权重和偏置的初始值w = torch.tensor(1.0,requires_grad=True,dtype=torch.float32)b = torch.tensor(3.0,requires_grad=True,dtype=torch.float32)#设置网络的输出值z = x*w + b #矩阵乘法# 设置损失函数,并进行损失计算loss = torch.nn.MSELoss()loss = loss(z,y)# 自动微分loss.backward()# 打印w,b变量的梯度# backward 函数计算的梯度值会存储在张量的grad 变量中print('W的梯度:',w.grad)print('B的梯度:',b.grad)test01()
输出结果:
W的梯度: tensor(80.) B的梯度: tensor(16.)
-
当X为多维张量时梯度计算
import torch def test02():# 输入张量 2*5x = torch.ones(2,5)# 目标张量 2*3y = torch.zeros(2,3)# 设置要更新的权重和偏置的初始值w = torch.randn(5,3,requires_grad=True)b = torch.randn(3,requires_grad=True)#设置网络的输出值z = torch.matmul(x,w)+ b #矩阵乘法# 设置损失函数,并进行损失计算loss = torch.nn.MSELoss()loss = loss(z,y)# 自动微分loss.backward()# 打印w,b变量的梯度# backward 函数计算的梯度值会存储在张量的grad 变量中print('W的梯度:',w.grad)print('B的梯度:',b.grad)test02()
输出结果:
W的梯度: tensor([[-1.7502, 0.8537, 0.6175],[-1.7502, 0.8537, 0.6175],[-1.7502, 0.8537, 0.6175],[-1.7502, 0.8537, 0.6175],[-1.7502, 0.8537, 0.6175]]) B的梯度: tensor([-1.7502, 0.8537, 0.6175])