當目標張量為標量時,backward()無需傳入引數。
import torch
如果需要對tensor求導,requires_grad要設定為true。
# 定義輸入張量x
x = torch.tensor([2
])# 初始化權重引數w,偏置b,#設定requires_grad為true,使用自動求導
w = torch.randn(
1,requires_grad=
true
)b = torch.randn(
1,requires_grad=
true
)# 設定前向傳播
y = torch.mul(w,x)
z = torch.add(y,b)
# 檢視requires_grad屬性
print
(x.requires_grad)
print
(y.requires_grad)
# 因為與w,b具有y依賴關係,所以x,y的requires_grad也是true。
false
true
通過運算建立的tensor(非葉子結點)會自動被賦予grad_fn屬性。葉子結點的grad_fn為none。
# 檢視非葉子結點y,z的requires_grad屬性。
print
(y.requires_grad)
# 檢視各節點是不是葉子節點
print
(x.is_leaf)
print
(y.is_leaf)
# 葉子結點:x,w,b
# 非葉子結點:y,z
# 檢視葉子結點的grad_fn屬性
print
("x的grad_fn屬性:"
,x.grad_fn)
# 檢視非葉子結點的grad_fn屬性
print
("y的grad_fn屬性:"
,y.grad_fn)
true
true
false
x的grad_fn屬性: none
y的grad_fn屬性:
非葉子節點的梯度呼叫backward()之後,梯度將被清空。
# 基於z對張量進行反向傳播,執行backward之後計算圖會清空。
z.backward(
)# 如果需要多次backward()需要設定引數retain_graph為true。此時梯度是累加的。
# z.backward(retain_graph=true)
# 檢視葉子結點的梯度。
# 因為x未設定requires_grad屬性,預設為false,不求導,所以grad為none。
print
("x的梯度是:"
,x.grad)
print
("w的梯度是:"
,w.grad)
# 檢視非葉子結點的梯度
# 非葉子節點的梯度呼叫backward()之後,梯度將被清空。故y,z此時沒有梯度。
# print("y的梯度是:",y.grad)
# print("z的梯度是:",z.grad)
x的梯度是: none
w的梯度是: tensor([2.])
pytorch只允許標量對張量進行求導
import torch
# 定義葉子張量x,形狀為1x2
x = torch.tensor([[
2,3]
],dtype=torch.
float
,requires_grad=
true
)print
(x)# 初始化雅可比矩陣
j = torch.zeros(2,
2)print
(j[0])
# 初始化目標張量,形狀為1x2
y = torch.zeros(1,
2)# 定義y與x之間的對映關係
# y1 = x1**2+3*x2
# y2 = x2**2+2*x1y[0
,0]=x[0,
0]**2
+3*x[0,1
]y[0,
1]=x[0,1
]**2+
2*x[0,
0]print
(y)
tensor([[2., 3.]], requires_grad=true)
tensor([0., 0.])
tensor([[13., 13.]], grad_fn=)
需要重複使用backward()時,retain_graph=true
# 生成y1對x的梯度
y.backward(torch.tensor([[
1,0]
]),retain_graph=
true)j[
0]=x.grad
# 因為梯度是累加的,所以需要清除對x的梯度
x.grad = torch.zeros_like(x.grad)
# 生成y2對x的梯度
y.backward(torch.tensor([[
0,1]
]))j[
1]=x.grad
# 雅可比矩陣的值
print
(j)
tensor([[4., 3.],
[2., 6.]])
pytorch自動求導數機制
如果有乙個單一的輸入操作需要梯度,它的輸出也需要梯度 相反,只有所有輸入都不需要梯度,輸出才不需要。如果其中所有的變數都不需要梯度進行,反向傳播計算不會在子圖中執行。import torch from torch.autograd import variable x variable torch.r...
Pytorch02 自動求導機制
不同於靜態計算圖中網路結構一開始就被預設好,動態計算圖中乙個節點只有被執行到且requires gard true時,才被加入計算圖。深入淺出動態計算圖 作用 從loss向前對葉節點鏈式求導,計算得到的引數儲存在每個葉節點的grad中。不需要更新梯度的tensor。如果乙個節點根本就不需要更新梯度,...
pytorch自動求導實現感知機模型
感知機理論知識鏈結。usr bin env python encoding utf 8 created on 2019 12 31 21 17 author phil import torch.nn as nn import torch import numpy as np import torch...