PyTorch Tutorial 03 - Gradient Calcul...

教程Python代碼如下:
import torch
x = torch.randn(5)
print(x)
#如果想計算一些函數(shù)的梯度,必須指定參數(shù),要求grad=True
"""
在Tensor上的所有操作,Autograd都能為它們自動提供微分,避免手動計算導數(shù)的復雜過程。
autograd.Variable是 Autograd 中的核心類,它簡單封裝了Tensor,并支持幾乎所有Tensor 的操作。
Tensor在被封裝為Variable之后,可以調(diào)用它的.backward實現(xiàn)反向傳播,自動計算所有梯度。
"""
x = torch.randn(5,requires_grad=True)
print(x)
y = x + 2
print(y)
z = y * y * 2
print(z)
z = z.mean()
print(z)
print("\n" + "計算z相當于x的梯度")
"""
計算z相當于x的梯度
注意:grad在反向傳播過程中是累加的( accumulated ),這意味著每次運行反向傳播,梯度都會累加之前的梯度,所以反向傳播之前需把梯度清零。
"""
print(x.grad)
z.backward() #dz9
print(x.grad)
#如果沒有z = z.mean()
x = torch.randn(3,requires_grad=True)
y = x + 2
z = y * y * 2
v = torch.tensor([0.1,0.01,0.001],dtype=torch.float32)
z.backward(v) #這里沒有z = z.mean(),所以z不是一個標量,而是一個矢量,所以我們要給它一個矢量
print(x.grad)
print("\n" + "防止跟蹤梯度的三種選擇")
"""
防止跟蹤梯度的三種選擇:
1:x.requires_grad_(False)
2:x.detach() #創(chuàng)建一個不需要梯度的新張量
3:with torch.no_grad(): #包裝在 with 語句中
"""
x = torch.randn(3,requires_grad=True)
print(x)
x.requires_grad_(False)
print(x)
x = torch.randn(3,requires_grad=True)
print(x)
y = x.detach()
print(y)
x = torch.randn(3,requires_grad=True)
print(x)
with torch.no_grad():
??y = x + 2
??print(y)
print("\n" + "梯度累加")
"""注意:grad在反向傳播過程中是累加的( accumulated ),這意味著每次運行反向傳播,梯度都會累加之前的梯度,所以反向傳播之前需把梯度清零。"""
print("\n" + "一次迭代")
weights = torch.ones(4,requires_grad=True)
for epoch in range(1):
??model_output = (weights*3).sum()
??model_output.backward()
??print(weights.grad)
print("\n" + "二次迭代")
weights = torch.ones(4,requires_grad=True)
for epoch in range(2):
??model_output = (weights*3).sum()
??model_output.backward()
??print(weights.grad)
print("\n" + "三次迭代")
weights = torch.ones(4,requires_grad=True)
for epoch in range(3):
??model_output = (weights*3).sum()
??model_output.backward()
??print(weights.grad)
"""梯度累加在很多時候顯然是不對的,所以我們在下一次運算前要先清空梯度"""
print("\n" + "清空梯度的三次迭代")
weights = torch.ones(4,requires_grad=True)
for epoch in range(3):
??model_output = (weights*3).sum()
??model_output.backward()
??print(weights.grad)
??weights.grad.zero_()