PyTorch 自动微分示例
PyTorch 自動微分示例
autograd 包是 PyTorch 中所有神經網絡的核心。首先簡要地介紹,然后訓練第一個神經網絡。autograd 軟件包為 Tensors 上的所有算子提供自動微分。這是一個由運行定義的框架,以代碼運行方式定義后向傳播,并且每次迭代都可以不同。從 tensor 和 gradients 來舉一些例子。
1、TENSOR
torch.Tensor 是包的核心類。如果將其屬性 .requires_grad 設置為 True,則會開始跟蹤針對 tensor 的所有操作。完成計算后,可以調用 .backward() 來自動計算所有梯度。該張量的梯度將累積到 .grad 屬性中。
要停止 tensor 歷史記錄的跟蹤,可以調用 .detach(),將其與計算歷史記錄分離,防止將來的計算被跟蹤。
要停止跟蹤歷史記錄(和使用內存),還可以將代碼塊使用 with torch.no_grad(): 包裝起來。在評估模型時,這是特別有用,因為模型在訓練階段具有 requires_grad = True ,可訓練參數有利于調參,但在評估階段不需要梯度。
還有一個類對于 autograd 實現非常重要那就是 Function。Tensor 和 Function 互相連接并構建一個非循環圖,保存整個完整的計算過程的歷史信息。每個張量都有一個 .grad_fn 屬性,保存著創建了張量的 Function 的引用,(如果用戶自己創建張量,則g rad_fn 是 None )。
如果想計算導數,可以調用 Tensor.backward()。如果 Tensor 是標量(即包含一個元素數據),則不需要指定任何參數backward(),如果有更多元素,則需要指定一個gradient 參數來指定張量的形狀。
import torch
創建一個張量,設置 requires_grad=True 來跟蹤相關的計算
x = torch.ones(2, 2, requires_grad=True)
print(x)
輸出:
tensor([[1., 1.],
[1., 1.]], requires_grad=True)
針對張量做一個操作
y = x + 2
print(y)
輸出:
tensor([[3., 3.],
[3., 3.]], grad_fn=)
y 作為操作的結果被創建,所以它有 grad_fn
print(y.grad_fn)
輸出:
<AddBackward0 object at 0x7fe1db427470>
針對 y 做更多的操作:
z = y * y * 3
out = z.mean()
print(z, out)
輸出:
tensor([[27., 27.],
[27., 27.]], grad_fn=)
tensor(27., grad_fn=)
.requires_grad_( … ) 會改變張量的 requires_grad 標記。輸入的標記默認為 False ,如果沒有提供相應的參數。
a = torch.randn(2, 2)
a = ((a * 3) / (a - 1))
print(a.requires_grad)
a.requires_grad_(True)
print(a.requires_grad)
b = (a * a).sum()
print(b.grad_fn)
輸出:
False
True
<SumBackward0 object at 0x7fe1db427dd8>
梯度:
現在后向傳播,因為輸出包含了一個標量,out.backward() 等同于out.backward(torch.tensor(1.))。
out.backward()
打印梯度 d(out)/dx
print(x.grad)
輸出:
tensor([[4.5000, 4.5000],
[4.5000, 4.5000]])
原理解釋:
看一個雅可比向量積的例子:
x = torch.randn(3, requires_grad=True)
y = x * 2
while y.data.norm() < 1000:
y = y * 2
print(y)
輸出:
tensor([ -444.6791, 762.9810, -1690.0941], grad_fn=)
在這種情況下,y 不再是一個標量。torch.autograd 不能夠直接計算整個雅可比,但是如果想要雅可比向量積,需要簡單的傳遞向量給 backward 作為參數。
v = torch.tensor([0.1, 1.0, 0.0001], dtype=torch.float)
y.backward(v)
print(x.grad)
輸出:
tensor([1.0240e+02, 1.0240e+03, 1.0240e-01])
可以通過將代碼包裹在 with torch.no_grad(),來停止對從跟蹤歷史中 的 .requires_grad=True 的張量自動求導。
print(x.requires_grad)
print((x ** 2).requires_grad)
with torch.no_grad():
print((x ** 2).requires_grad)
輸出:
True
True
False
總結
以上是生活随笔為你收集整理的PyTorch 自动微分示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PyTorch Data Parrall
- 下一篇: 北汽蓝谷和北汽新能源