《20天吃透Pytorch》Pytorch自动微分机制学习
生活随笔
收集整理的這篇文章主要介紹了
《20天吃透Pytorch》Pytorch自动微分机制学习
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
自動(dòng)微分機(jī)制
Pytorch一般通過反向傳播 backward 方法 實(shí)現(xiàn)這種求梯度計(jì)算。該方法求得的梯度將存在對(duì)應(yīng)自變量張量的grad屬性下。
除此之外,也能夠調(diào)用torch.autograd.grad 函數(shù)來(lái)實(shí)現(xiàn)求梯度計(jì)算。
這就是Pytorch的自動(dòng)微分機(jī)制。
一,利用backward方法求導(dǎo)數(shù)
backward 方法通常在一個(gè)標(biāo)量張量上調(diào)用,該方法求得的梯度將存在對(duì)應(yīng)自變量張量的grad屬性下。
如果調(diào)用的張量非標(biāo)量,則要傳入一個(gè)和它同形狀 的gradient參數(shù)張量。
相當(dāng)于用該gradient參數(shù)張量與調(diào)用張量作向量點(diǎn)乘,得到的標(biāo)量結(jié)果再反向傳播。
1, 標(biāo)量的反向傳播
x = torch.tensor(0.0,requires_grad = True) # x需要被求導(dǎo) #注意:這里的x是一維的 a = torch.tensor(1.0) b = torch.tensor(-2.0) c = torch.tensor(1.0) y = a*torch.pow(x,2) + b*x + cy.backward() dy_dx = x.grad print(dy_dx)2, 非標(biāo)量的反向傳播
""" 2, 非標(biāo)量的反向傳播 """ import numpy as np import torch# f(x) = a*x**2 + b*x + cx = torch.tensor([[0.0,0.0],[1.0,2.0]],requires_grad = True) # x需要被求導(dǎo) #這里的x是二維的 a = torch.tensor(1.0) b = torch.tensor(-2.0) c = torch.tensor(1.0) y = a*torch.pow(x,2) + b*x + cgradient = torch.tensor([[1.0,1.0],[1.0,1.0]])print("x:\n",x) print("y:\n",y) y.backward(gradient = gradient) #非標(biāo)量的區(qū)別在這里:相當(dāng)于用該gradient參數(shù)張量與調(diào)用張量作向量點(diǎn)乘,得到的標(biāo)量結(jié)果再反向傳播。 x_grad = x.grad print("x_grad:\n",x_grad)3, 非標(biāo)量的反向傳播可以用標(biāo)量的反向傳播實(shí)現(xiàn)
""" 3, 非標(biāo)量的反向傳播可以用標(biāo)量的反向傳播實(shí)現(xiàn) """ x = torch.tensor([[0.0,0.0],[1.0,2.0]],requires_grad = True) # x需要被求導(dǎo) a = torch.tensor(1.0) b = torch.tensor(-2.0) c = torch.tensor(1.0) y = a*torch.pow(x,2) + b*x + cgradient = torch.tensor([[1.0,1.0],[1.0,1.0]]) z = torch.sum(y*gradient) #將Y與權(quán)值相乘然后取和print("x:",x) print("y:",y) z.backward() x_grad = x.grad print("x_grad:\n",x_grad)二,利用autograd.grad方法求導(dǎo)數(shù)
利用autograd.grad方法對(duì)單個(gè)變量求導(dǎo)數(shù)
""" 二,利用autograd.grad方法求導(dǎo)數(shù) """ x = torch.tensor(0.0,requires_grad = True) # x需要被求導(dǎo) a = torch.tensor(1.0) b = torch.tensor(-2.0) c = torch.tensor(1.0) y = a*torch.pow(x,2) + b*x + c# create_graph 設(shè)置為 True 將允許創(chuàng)建更高階的導(dǎo)數(shù) dy_dx = torch.autograd.grad(y,x,create_graph=True)[0] print(dy_dx.data)# 求二階導(dǎo)數(shù) dy2_dx2 = torch.autograd.grad(dy_dx,x)[0]print(dy2_dx2.data)利用autograd.grad方法對(duì)多個(gè)變量求導(dǎo)數(shù)
""" 利用autograd.grad方法對(duì)多個(gè)變量求導(dǎo)數(shù) """ x1 = torch.tensor(1.0,requires_grad = True) # x需要被求導(dǎo) x2 = torch.tensor(2.0,requires_grad = True)y1 = x1*x2 y2 = x1+x2# 允許同時(shí)對(duì)多個(gè)自變量求導(dǎo)數(shù) (dy1_dx1,dy1_dx2) = torch.autograd.grad(outputs=y1,inputs = [x1,x2],retain_graph = True) print(dy1_dx1,dy1_dx2)# 如果有多個(gè)因變量,相當(dāng)于把多個(gè)因變量的梯度結(jié)果求和 (dy12_dx1,dy12_dx2) = torch.autograd.grad(outputs=[y1,y2],inputs = [x1,x2]) print(dy12_dx1,dy12_dx2)三,利用自動(dòng)微分和優(yōu)化器求最小值
""" 三,利用自動(dòng)微分和優(yōu)化器求最小值 """x = torch.tensor(0.0,requires_grad = True) # x需要被求導(dǎo) a = torch.tensor(1.0) b = torch.tensor(-2.0) c = torch.tensor(1.0)optimizer = torch.optim.SGD(params=[x],lr = 0.01)def f(x):result = a*torch.pow(x,2) + b*x + creturn(result)for i in range(500):optimizer.zero_grad()y = f(x)y.backward()optimizer.step()print("y=",f(x).data,";","x=",x.data)完整代碼
import torch import numpy as np""" 1, 標(biāo)量的反向傳播 """ x = torch.tensor(0.0,requires_grad = True) # x需要被求導(dǎo) #注意:這里的x是一維的 a = torch.tensor(1.0) b = torch.tensor(-2.0) c = torch.tensor(1.0) y = a*torch.pow(x,2) + b*x + cy.backward() dy_dx = x.grad print(dy_dx)""" 2, 非標(biāo)量的反向傳播 """ import numpy as np import torch# f(x) = a*x**2 + b*x + cx = torch.tensor([[0.0,0.0],[1.0,2.0]],requires_grad = True) # x需要被求導(dǎo) #這里的x是二維的 a = torch.tensor(1.0) b = torch.tensor(-2.0) c = torch.tensor(1.0) y = a*torch.pow(x,2) + b*x + cgradient = torch.tensor([[1.0,1.0],[1.0,1.0]])print("x:\n",x) print("y:\n",y) y.backward(gradient = gradient) #非標(biāo)量的區(qū)別在這里:相當(dāng)于用該gradient參數(shù)張量與調(diào)用張量作向量點(diǎn)乘,得到的標(biāo)量結(jié)果再反向傳播。 x_grad = x.grad print("x_grad:\n",x_grad)""" 3, 非標(biāo)量的反向傳播可以用標(biāo)量的反向傳播實(shí)現(xiàn) """ x = torch.tensor([[0.0,0.0],[1.0,2.0]],requires_grad = True) # x需要被求導(dǎo) a = torch.tensor(1.0) b = torch.tensor(-2.0) c = torch.tensor(1.0) y = a*torch.pow(x,2) + b*x + cgradient = torch.tensor([[1.0,1.0],[1.0,1.0]]) z = torch.sum(y*gradient) #將Y與權(quán)值相乘然后取和print("x:",x) print("y:",y) z.backward() x_grad = x.grad print("x_grad:\n",x_grad)""" 二,利用autograd.grad方法求導(dǎo)數(shù) """ x = torch.tensor(0.0,requires_grad = True) # x需要被求導(dǎo) a = torch.tensor(1.0) b = torch.tensor(-2.0) c = torch.tensor(1.0) y = a*torch.pow(x,2) + b*x + c# create_graph 設(shè)置為 True 將允許創(chuàng)建更高階的導(dǎo)數(shù) dy_dx = torch.autograd.grad(y,x,create_graph=True)[0] print(dy_dx.data)# 求二階導(dǎo)數(shù) dy2_dx2 = torch.autograd.grad(dy_dx,x)[0]print(dy2_dx2.data) """ 利用autograd.grad方法對(duì)多個(gè)變量求導(dǎo)數(shù) """ x1 = torch.tensor(1.0,requires_grad = True) # x需要被求導(dǎo) x2 = torch.tensor(2.0,requires_grad = True)y1 = x1*x2 y2 = x1+x2# 允許同時(shí)對(duì)多個(gè)自變量求導(dǎo)數(shù) (dy1_dx1,dy1_dx2) = torch.autograd.grad(outputs=y1,inputs = [x1,x2],retain_graph = True) print(dy1_dx1,dy1_dx2)# 如果有多個(gè)因變量,相當(dāng)于把多個(gè)因變量的梯度結(jié)果求和 (dy12_dx1,dy12_dx2) = torch.autograd.grad(outputs=[y1,y2],inputs = [x1,x2]) print(dy12_dx1,dy12_dx2)""" 三,利用自動(dòng)微分和優(yōu)化器求最小值 """x = torch.tensor(0.0,requires_grad = True) # x需要被求導(dǎo) a = torch.tensor(1.0) b = torch.tensor(-2.0) c = torch.tensor(1.0)optimizer = torch.optim.SGD(params=[x],lr = 0.01)def f(x):result = a*torch.pow(x,2) + b*x + creturn(result)for i in range(500):optimizer.zero_grad()y = f(x)y.backward()optimizer.step()print("y=",f(x).data,";","x=",x.data)總結(jié)
以上是生活随笔為你收集整理的《20天吃透Pytorch》Pytorch自动微分机制学习的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到陌生的地方预示什么
- 下一篇: 做梦梦到瓜子壳什么意思