东阳企业网站微商城建设,网站域名 过期,服务外包下的网站开发,做视频网站带宽不够怎么办通过反向传播进行自动求梯度1-requires_grad问题2-梯度3- detach() 和 with torch.no_grad(#xff09;4- Tensor.data.requires_gradPyTorch提供的autograd包能够根据输入和前向传播过程自动构建计算图#xff0c;并执行反向传播.
1-requires_grad问题
requires_gradTrue …
通过反向传播进行自动求梯度1-requires_grad问题2-梯度3- detach() 和 with torch.no_grad(4- Tensor.data.requires_gradPyTorch提供的autograd包能够根据输入和前向传播过程自动构建计算图并执行反向传播.
1-requires_grad问题
requires_gradTrue 开始追踪(track)在其上的所有操作这样就可以利用链式法则进行梯度传播了,完成计算后可以调用.backward()来完成所有梯度计算。默认 requires_grad False 完成计算后可以调用**.backward()来完成所有梯度计算。此Tensor的梯度将累积到.grad**属性中。
#x是直接创建的所以它没有grad_fn, 而
x torch.ones(2, 2, requires_gradTrue)
print(x)#tensor([[1., 1.],[1., 1.]], requires_gradTrue)
print(x.grad_fn)#None#y是通过一个加法操作创建的所以它有一个为的grad_fn。
y x 2
print(y)#tensor([[3., 3.],[3., 3.]], grad_fnAddBackward)
print(y.grad_fn)#AddBackward object at 0x1100477b8#打印是否有叶子节点
print(x.is_leaf, y.is_leaf) # True False若开始没有设置requires_grad 属性可通过 .requires_grad_()来用in-place的方式改requires_grad属性
a torch.randn(2, 2) # 缺失情况下默认 requires_grad False
a ((a * 3) / (a - 1))
print(a.requires_grad) # False
a.requires_grad_(True)
print(a.requires_grad) # True
b (a * a).sum()
print(b.grad_fn)#SumBackward0 object at 0x118f50cc02-梯度
标量标量就是一个数字。标量也称为0维数组 向量向量是一组标量组成的列表。向量也称为1维数组。 矩阵矩阵是由一组向量组成的集合。矩阵也称为2维数组。 张量张量是矩阵的推广可以用来描述N维数据
注意在y.backward()时如果y是标量则不需要为backward()传入任何参数否则需要传入一个与y同形的Tensor
out.backward() # 等价于 out.backward(torch.tensor(1.)) 反向转播#求导
x torch.tensor([1.0, 2.0, 3.0, 4.0], requires_gradTrue)
y 2 * x
z y.view(2, 2)
print(z)#tensor([[2., 4.],[6., 8.]], grad_fnViewBackward)现在 z 不是一个标量所以在调用backward时需要传入一个和z同形的权重向量进行加权求和得到一个标量。
v torch.tensor([[1.0, 0.1], [0.01, 0.001]], dtypetorch.float)
z.backward(v)
print(x.grad)#tensor([2.0000, 0.2000, 0.0200, 0.0020]) x.grad是和x同形的张量3- detach() 和 with torch.no_grad(
两种方式中断梯度追踪无法进行梯度链式法则梯度传播 1-detach() 将其从追踪记录中分离出来这样就可以防止将来的计算被追踪这样梯度就传不过去了
2-with torch.no_grad() 将不想被追踪的操作代码块包裹起来这种方法在评估模型的时候很常用因为在评估模型时我们并不需要计算可训练参数requires_gradTrue的梯度。
x torch.tensor(1.0, requires_gradTrue)
y1 x ** 2
with torch.no_grad():y2 x ** 3
y3 y1 y2print(x.requires_grad)#true
print(y1, y1.requires_grad) #tensor(1., grad_fnPowBackward0) True
print(y2, y2.requires_grad) # False
print(y3, y3.requires_grad) # tensor(2., grad_fnThAddBackward)Truey3.backward()#y2被包裹 所以y2有关的梯度是不会回传的 结果只是y1 对x的梯度
print(x.grad)#tensor(2.)#使用y2的传播会报错
#RuntimeError: element 0 of tensors does not require grad and does not have a grad_fn4- Tensor.data.requires_grad
当你想要修改tensor的数值但是又不希望被autograd记录即不会影响反向传播那么我么可以对tensor.data进行操作。
x torch.ones(1,requires_gradTrue)print(x.data) # tensor([1.]) #还是一个tensor
print(x.data.requires_grad) #False #但是已经是独立于计算图之外y 2 * x
x.data * 100 # 只改变了值不会记录在计算图所以不会影响梯度传播y.backward()#tensor([100.], requires_gradTrue)
print(x) # 更改data的值也会影响tensor的值
print(x.grad)#tensor([2.])