pytorch使用-自动微分
一、自动微分
在整个Pytorch框架中,所有的神经网络本质上都是一个autograd package(自动求导工具包),autograd package提供了一个对Tensors上所有的操作进行自动微分的功能.
以前的pytorch使用Variable来作为自动求导的类型。但是较新版本将tensor和variable合并了,Tensor的数据结构如下:

Tensor 主要包含三个属性:
.
data:保存Tensor数据。
grad:保存data对应的梯度,grad也是个Tensor,它和data的形状一样。
grad_fn:指向一个Function对象,这个Function用来反向传播计算输入的梯度,
二、Tensor自动微分
当 requires_grad 设置为True,为Tensor 增加梯度:
x = torch.ones(2, 2)
print(x)
y = torch.ones(2, 2, requires_grad=True)
print(y)

当进行运算时,grad_fn会记录当前操作:
x = torch.ones(2, 2, requires_grad=True)
print(x)
y = x + 2
print(y)

.requires_grad_ () 原地增加梯度
y = torch.full([2, 2], 3, dtype=torch.float32)
# y 增加梯度
y.requires_grad_(True)
print(y)
z = y * y * 3
out = z.mean()
print(z)
print(out)

三、backward 反向传播
a = torch.randn(2, 3, requires_grad=True) # 创建一个张量
b = 3 * a
print(b)
# 给 loss.backward() 指定传递给后向的参数维度:torch.ones_like(b)
b.backward(torch.ones_like(b)) # 自动计算所有梯度
print(a.grad)

with torch.no_grad(): 关闭梯度更新
with torch.no_grad():
a = torch.randn(2, 3, requires_grad=True) # 创建一个张量
b = 3 * a
print(b.requires_grad)
# 给 loss.backward() 指定传递给后向的参数维度:torch.ones_like(b)
b.backward(torch.ones_like(b)) # 自动计算所有梯度
# print(a.grad)

.detach() 删除单个tensor的梯度
a = torch.randn(2, 3, requires_grad=True) # 创建一个张量
b = 3 * a
print(b)
c = b.detach()
print(c)

本文详细介绍了PyTorch中的自动微分机制,包括Tensor的自动求导功能,如何通过`.requires_grad_()`跟踪计算图,以及使用`.backward()`进行反向传播计算梯度。通过实例展示了在不同情况下如何设置和使用自动微分,以便于理解和应用在神经网络训练中。

674

被折叠的 条评论
为什么被折叠?



