pytorch中的自动求导机制

pytorch中的自动求导

在实践中很简单,如果我们想计算某些的tensor的梯度,我么只需要要在简历这个tensor时加入这么一句:requires_grad=True。这个tensor上的任何pytorch的操作都将构造一个计算图,从而允许我们稍后再途中执行反向传播。如果这个tensor X的requires_grads=True,那么反向传播之后x.grad将会时另一个张量,其为关于x某个标量值的梯度。
有时,可能希望pytorch在requires_grads=True的张量执行某些操作时构建计算图;例如,在训练神经网络时,我们通常不希望通过权重更新步骤进行反向传播。在这种情况下,我们可以使用torch.no_grad()上下文管理器来防止构造计算图。

以下我们使用pytorch的tensor和autograd来实现我们的两侧神经网络;我们不再需要手动执行网络的反向传播:

import torch

dtype = torch.float
device = torch.device('cpu')  # 在cpu上运行
#  device = torch.device('cuda': 0)  # 在GPU上运行

#  N是批量大小;D_in是输入维度;H是隐藏的维度;D_out是输出维度
H, D_in, H, D_out = 64, 1000, 100, 10

#  创建随机tensor以保持输入和输出
#  设置requires_grad = False表示我们不需要计算渐变,默认的就是False
x = torch.randn(N, D_in, device = device, dtype = dtype)
y = torch.randn(N, D_out, device = device, dtype = dtype)

#  为权重创建随机tensor
#  设置requires_grad = True表示我们想要计算渐变
w1 = torch.randn(D_in, H, device = device, dtype = dtype, requires_grad = True)
w2 = torch.randn(D_out, H, device = device, dtype = dtype, requires_grad = True)

learning_rate = 1e-6
for t in range(500):
	#  前向传播,使用tensors上的操作计算预测值y,
	#  由于w1和w2有requires_grad=True,涉及这些张量的操作将让pytorch构架计算图
	#  从而允许自动计算梯度,由于我们不再手工实现反向传播,所以不需要保留中间值的引用
	y_pred = x.mm(w1).clamp(min = 0).mm(w2)
	
	#  使用tensors上的操作计算和打印丢失
	#  loss是一个形状为()的张量
	#  loss.item() 得到这个张量对应的python数值
	loss = (y_pres - y).pow(2).sum()
	print(t, loss.item())

#  使用autograd计算反向传播,这个调用将计算loss对所有requires_grad=True的tensor的梯度。
#  这次调用后,w1.grad和w2.grad将分别是loss对w1和w2的梯度张量
loss.backward()

with torch.no_grad():
	w1 -= learning_rate * w1.grad
	w2 -= learning_rate * w2.grad

	w1.grad.zero_()
	w2.grad.zero_()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值