PyTorch自動求導

2021-10-10 12:23:22 字數 3022 閱讀 2840

當目標張量為標量時,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...