importtorch
x = torch.ones(2, 2, requires_grad=true) #
將其屬性.requires_grad設定為true,它將開始追蹤(track)在其上的所有操作。完成計算後,可以呼叫.backward()來完成所有梯度計算
(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(y)print
(y.grad_fn)
#tensor([[3., 3.],
#[3., 3.]], grad_fn=)
#
attension: x是直接建立的,所以他沒有grad_fn,而y通過乙個加法操作建立的,所以它有乙個的grad_fn
#x這種直接建立的稱為葉⼦節點,葉⼦節點對應的 grad_fn 是 none
(x.is_leaf, y.is_leaf)
#true false
z = y * y * 3out =z.mean()(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))
(a.requires_grad)
a.requires_grad_(true)
(a.requires_grad)
b = (a *a).sum()
(b.grad_fn)
#false
#true
#
#因為out是乙個標量,所以呼叫backward()時不需要指定求導變數
out.backward() #
等價於out.backward(torch.tensor(1.))
(x.grad)
#tensor([[4.5000, 4.5000],
#[4.5000, 4.5000]])
#再來一次反向傳播,注意 grad 是累加的
out2 =x.sum()
out2.backward()
(x.grad)
out3 =x.sum()
x.grad.data.zero_()
out3.backward()
(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)
(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)
(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
(x, x.requires_grad)
(y1, y1.requires_grad)
print(y2, y2.requires_grad) #
false,所以不能呼叫y2.backward()
(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()(x.grad)
#tensor(2.)
想修改tensor的數值,但又不希望被autograd記錄(即不影響反向傳播),那麼可對tensor.data操作
x = torch.ones(1, requires_grad=true)(x.data)
(x.data.requires_grad)
y = 2 *x
x.data *= 100y.backward()
(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 在深度學習中被廣泛使用。它的演算法很簡單 先選取一組模型引數的初始值,如隨機選取 接下來對引數進行多次迭代,使每次迭代都可能降低損失函式的值。在每次迭代中,先隨機均勻取樣乙個由...