学习目的:掌握自动微分模块的使用
训练神经网络时,最常用的算法就是反向传播。在该算法中,参数(模型权重)会根据损失函数关于对应参数的梯度进行调整。为了计算这些梯度,PyTorch 内置了名为 torch.autograd
的微分引擎。它支持任意计算图的自动梯度计算:
接下来我们使用这个结构进行自动微分模块的介绍。我们使用 backward 方法、grad 属性来实现梯度的计算和访问。
-
当X为标量时梯度的计算
pythonimport 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()
输出结果:
texW的梯度: tensor(80.) B的梯度: tensor(16.)
-
当X为多维张量时梯度计算
pythonimport torch def test02(): # 输入张量 2*5 x = torch.ones(2,5) # 目标张量 2*3 y = 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()
输出结果:
texW的梯度: 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])