1. 程式人生 > 其它 >Pytorch學習筆記-2-Autograd

Pytorch學習筆記-2-Autograd

技術標籤:深度學習pytorchpython人工智慧

Autograd自動梯度

PyTorch提供的autograd包能夠根據輸入和前向傳播過程自動構建計算圖,並執行反向傳播。

  1. Autograd相關概念
  2. 程式碼演示(一定要看程式碼中的註釋,裡面都是解釋

1. 相關概念

這部分是官網上的介紹,簡單的看一下,具體可以看下面程式碼。
官網地址:pytorch-Autograd

筆記1介紹的Tensor是這個包的核心類,如果將其屬性.requires_grad設定為True,它將開始追蹤(track)在其上的所有操作(這樣就可以利用鏈式法則進行梯度傳播了)。完成計算後,可以呼叫.backward()來完成所有梯度計算。此Tensor的梯度將累積到.grad屬性中。

如果不想要被繼續追蹤,可以呼叫.detach()將其從追蹤記錄中分離出來,這樣就可以防止將來的計算被追蹤,這樣梯度就傳不過去了。此外,還可以用with
torch.no_grad()將不想被追蹤的操作程式碼塊包裹起來,這種方法在評估模型的時候很常用,因為在評估模型時,我們並不需要計算可訓練引數(requires_grad=True)的梯度。

Function是另外一個很重要的類。Tensor和Function互相結合就可以構建一個記錄有整個計算過程的有向無環圖(DAG)。每個Tensor都有一個.grad_fn屬性,該屬性即建立該Tensor的Function,
就是說該Tensor是不是通過某些運算得到的,若是,則grad_fn返回一個與這些運算相關的物件,否則是None。

2.程式碼演示

autograd包為張量上的所有操作提供了自動求導。它是一個在執行時定義的框架,這意味著反向傳播是根據你的程式碼來確定如何執行,並且每次迭代可以是不同的。

2.1 建立一個Tensor 設定requires_grad=True,表示追蹤在矩陣x上的所有操作(請結合註釋看)

import torch
# 建立一個Tensor 設定requires_grad=True,表示追蹤在矩陣x上的所有操作
x = torch.ones(2,2,requires_grad=True)
print(x.grad_fn) # grad.fn這個屬性表示建立x的Function,意思就說矩陣x是不是通過某些運算得到的
# 這裡的x.grad_fn結果是None,因為x是直接建立的,所以它沒有grad_fn(並不是通過運算得到的) y = x + 2 print(y) print(y.grad_fn) # 這裡的y.grad_fn結果是<AddBackward0 object at 0x0000018C87C853D0>, # 因為y不是直接建立的,y是通過x+2運算得到的 # is.leaf表示是否是直接建立的葉子節點 # 大白話就是是不是用torch直接建立的變數,而不是通過運算得到的 print(x.is_leaf,y.is_leaf) # 結果是:True ,False z = y * y * 3 # z的grad_fn肯定不是None,大家可以自己試試 print(z.grad_fn) out = z.mean() # 計算平均值 print(z) print(out) # 結果是tensor(27., grad_fn=<MeanBackward0>) # 這裡大家可能有疑問,out就是計算一個平均值,怎麼就是Tensor張量了呢? # 這是因為out求解的是矩陣z的平均值,z是張量那麼out也是張量 #我們可以通過筆記1講到的item()方法來打印出out的數值 print(out.item()) # 上面提到過設定requires_grad=True,表示追蹤在矩陣x上的所有操作 # 如果沒有寫requires_grad=True,預設為False,表示不追蹤 # 測試一下 a = torch.rand(2,2) print(a.requires_grad) # 結果為false # 我們可以通過 .requires_grad_() 來改變 requires_grad屬性 a.requires_grad_(True) print(a.requires_grad) # 結果為True

2.2 自動求導Autograd 過程

out.backward()
print(x.grad)
'''
我們先看看結果:
tensor([[4.5000, 4.5000],
        [4.5000, 4.5000]])

為什麼是這個結果呢?
根據上面的過程我們可以得到(其中o指的是out):
在這裡插入圖片描述
2.3 再舉個例子

import torch
x = torch.randn(3,requires_grad=True)
print(x)

y = x * 2
print(y.data)
while y.data.norm() <1000:
    y = y * 2
print(y)

# 在這個情形中,y不再是個標量。torch.autograd無法直接計算出完整的雅可比行列,
# 但是如果我們只想要vector-Jacobian product,只需將向量作為引數傳入backward:

gradients = torch.tensor([0.1, 1.0, 0.0001], dtype=torch.float)
y.backward(gradients)

print(x.grad)

Autograd 這一節還是比較重要的。