autograd
包是所有神經網路的核心,接下來我們先對其進行簡單地訪問,然後訓練我們的第乙個神經網路
autograd
包可以自動區分出張量上的所有操作,這意味著backprop
是由**的執行方式定義的,並且每次迭代都可以不同·
torch.tensor
是包的核心類。如果將它的屬性.requires_grad
設定為true
,它將跟蹤對其所有的操作。完成計算後,可以呼叫.backward()
會自動計算出所有梯度。該張量的梯度將累加到.grad屬性中
如果要停止張量跟蹤歷史記錄,可以呼叫.detach()
將其從計算歷史記錄中分離出來,並防止跟蹤接下來的計算。
為了防止跟蹤歷史記錄(與降低記憶體占用),還可以將**寫在with torch.no_grad():
中,這在評估模型時特別有用,因為模型可能具有可訓練的引數with require_grad = true
,我們不需要計算梯度。
tensor和function相互連線並建立乙個無環圖,該圖會對計算歷史進行編碼。每乙個張量都對應乙個.grad_fn
屬性,改屬性引用function
已建立的tensor
(除了使用者建立的tensor
(.grad_fn
為none
))
如果想要計算導數,可以呼叫tensor
上的.backward()
方法,如果tensor是乙個標量,則就無須指定backward()
的引數,但是如果具有更多元素的話,則需要指定gradient
引數,這個gradient
引數是乙個匹配形狀的張量
import torch
x = torch.ones(2,
2,requires_grad=
true
)x
tensor([[1., 1.],
[1., 1.]], requires_grad=true)
y = x +
2y
tensor([[3., 3.],
[3., 3.]], grad_fn=)
y.grad_fn
z = y*y*
3out = z.mean(
)print
(z, out)
tensor([[27., 27.],
[27., 27.]], grad_fn=) tensor(27., grad_fn=)
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
現在進行反向傳播
out.backward(
)
x.grad
tensor([[4.5000, 4.5000],
[4.5000, 4.5000]])
y.backward(x)
x
tensor([[1., 1.],
[1., 1.]], requires_grad=true)
print
(x.requires_grad)
print
((x **2)
.requires_grad)
with torch.no_grad():
print
((x **2)
.requires_grad)
true
true
false
print
(x.requires_grad)
y = x.detach(
)print
(y.requires_grad)
print
(x.eq(y)
.all()
)
true
false
tensor(true)
Pytorch官方指南(二) 翻譯版本
torch.cuda用於設定和執行cuda操作。它跟蹤當前選定的gpu,預設情況下,您分配的所有cuda tensor都將在該裝置上建立。無論怎麼樣,一旦分配了乙個張量,就可以對它進行操作,而不必考慮所選的裝置,結果將始終與張量放在同乙個裝置上。預設情況下不允許跨gpu操作,除了copy u 和其他...
pytorch學習筆記(二) gradient
在bp的時候,pytorch是將variable的梯度放在variable物件中的,我們隨時都可以使用variable.grad得到對應variable的grad。剛建立variable的時候,它的grad屬性是初始化為0.0的。import torch from torch.autograd im...
PyTorch學習筆記(二) 變數
在 torch 中,variable 是乙個存放會變化的值 變數 的地理位置。可以理解為乙個容器,裡面的值會不停的變化,就像乙個裝雞蛋的籃子,雞蛋數會不停變動。那誰是裡面的雞蛋呢,自然就是 torch 的 tensor 如果用乙個 variable 進行計算,那返回的也是乙個同型別的 variabl...