動手學深度學習 2 2 autograd

2022-05-15 08:08:58 字數 3311 閱讀 8005

import

torch

x = torch.ones(2, 2, requires_grad=true) #

將其屬性.requires_grad設定為true,它將開始追蹤(track)在其上的所有操作。完成計算後,可以呼叫.backward()來完成所有梯度計算

print

(x)print(x.grad_fn) #

每個tensor都有乙個.grad_fn屬性,該屬性即建立該tensor的function(除非使用者建立的tensors時設定了grad_fn=none)

# tensor([[1., 1.],

#        [1., 1.]], requires_grad=true)

# none

y = x + 2

print

(y)print

(y.grad_fn)

#tensor([[3., 3.],

#[3., 3.]], grad_fn=)

#

attension: x是直接建立的,所以他沒有grad_fn,而y通過乙個加法操作建立的,所以它有乙個的grad_fn

#

x這種直接建立的稱為葉⼦節點,葉⼦節點對應的 grad_fn 是 none

print

(x.is_leaf, y.is_leaf)

#true false

z = y * y * 3out =z.mean()

print

(z, out)

#tensor([[27., 27.],

#[27., 27.]], grad_fn=) tensor(27., grad_fn=)

#

通過.requires_grad_()來用in-place的方式改變requires_grad屬性

a = torch.randn(2, 2) #

缺失情況下預設requires_grad=false

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()時不需要指定求導變數

out.backward() #

等價於out.backward(torch.tensor(1.))

print

(x.grad)

#tensor([[4.5000, 4.5000],

#[4.5000, 4.5000]])

#

再來一次反向傳播,注意 grad 是累加的

out2 =x.sum()

out2.backward()

print

(x.grad)

out3 =x.sum()

x.grad.data.zero_()

out3.backward()

print

(x.grad)

#tensor([[5.5000, 5.5000],

#[5.5000, 5.5000]])

#tensor([[1., 1.],

#[1., 1.]])

#

y.backward(w) 求的不是 y 對 x 的導數,而是 l = torch.sum(y*w) 對 x 的導數。

x = torch.tensor([1.0, 2.0, 3.0, 4.0], requires_grad=true)

y = 2 *x

z = y.view(2, 2)

print

(z)#

tensor([[2., 4.],

#[6., 8.]], grad_fn=)

現在y不是乙個標量,所以在呼叫backward時需要傳入乙個和y同行的權重向量進行甲醛求和得到乙個標量

v = torch.tensor([[1.0, 0.1], [0.01, 0.001]], dtype=torch.float)

z.backward(v)

print

(x.grad)

#tensor([2.0000, 0.2000, 0.0200, 0.0020])

#

中斷梯度追蹤

x = torch.tensor(1.0, requires_grad=true)

y1 = x ** 2with torch.no_grad():

#與y2有關的梯度是不會回傳的,只有與y1有關的梯度才會回傳

y2 = x ** 3y3 = y1 +y2

print

(x, x.requires_grad)

print

(y1, y1.requires_grad)

print(y2, y2.requires_grad) #

false,所以不能呼叫y2.backward()

print

(y3, y3.requires_grad)

#tensor(1., requires_grad=true) true

#tensor(1., grad_fn=) true

#tensor(1.) false

#tensor(2., grad_fn=) true

y3.backward()

print

(x.grad)

#tensor(2.)

想修改tensor的數值,但又不希望被autograd記錄(即不影響反向傳播),那麼可對tensor.data操作

x = torch.ones(1, requires_grad=true)

print

(x.data)

print

(x.data.requires_grad)

y = 2 *x

x.data *= 100y.backward()

print

(x)print

(x.grad)

#tensor([1.])

#false

#tensor([100.], requires_grad=true)

#tensor([2.])

動手學深度學習

線性回歸的基本要素 模型 為了簡單起見,這裡我們假設 只取決於房屋狀況的兩個因素,即面積 平方公尺 和房齡 年 接下來我們希望探索 與這兩個因素的具體關係。線性回歸假設輸出與各個輸入之間是線性關係 price warea area wage age b price warea area wage a...

動手學深度學習(一)

其中 w1 和 w2 是權重 weight b 是偏差 bias 且均為標量。訓練資料 損失函式 通常,我們用訓練資料集中所有樣本誤差的平均來衡量模型 的質量 w 1,w 2,b 為使訓練樣本平均損失最小的解 優化演算法 b 代表每個小批量中的樣本個數 批量大小,batch size 稱作學習率 l...

筆記 動手學深度學習

在求數值解的優化演算法中,小批量隨機梯度下降 mini batch stochastic gradient descent 在深度學習中被廣泛使用。它的演算法很簡單 先選取一組模型引數的初始值,如隨機選取 接下來對引數進行多次迭代,使每次迭代都可能降低損失函式的值。在每次迭代中,先隨機均勻取樣乙個由...