网站建设如何运营,太原网站优化推广,做网站 前端,网络营销就业方向自动微分机制
Pytorch一般通过反向传播 backward 方法 实现这种求梯度计算。该方法求得的梯度将存在对应自变量张量的grad属性下。
除此之外#xff0c;也能够调用torch.autograd.grad 函数来实现求梯度计算。
这就是Pytorch的自动微分机制。
一#xff0c;利用backward方…自动微分机制
Pytorch一般通过反向传播 backward 方法 实现这种求梯度计算。该方法求得的梯度将存在对应自变量张量的grad属性下。
除此之外也能够调用torch.autograd.grad 函数来实现求梯度计算。
这就是Pytorch的自动微分机制。
一利用backward方法求导数
backward 方法通常在一个标量张量上调用该方法求得的梯度将存在对应自变量张量的grad属性下。 如果调用的张量非标量则要传入一个和它同形状 的gradient参数张量。 相当于用该gradient参数张量与调用张量作向量点乘得到的标量结果再反向传播。
1, 标量的反向传播
x torch.tensor(0.0,requires_grad True) # x需要被求导
#注意这里的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, 非标量的反向传播 2, 非标量的反向传播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需要被求导
#这里的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)
#非标量的区别在这里相当于用该gradient参数张量与调用张量作向量点乘得到的标量结果再反向传播。
x_grad x.grad
print(x_grad:\n,x_grad)3, 非标量的反向传播可以用标量的反向传播实现 3, 非标量的反向传播可以用标量的反向传播实现x torch.tensor([[0.0,0.0],[1.0,2.0]],requires_grad True) # 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]])
z torch.sum(y*gradient) #将Y与权值相乘然后取和print(x:,x)
print(y:,y)
z.backward()
x_grad x.grad
print(x_grad:\n,x_grad)
二利用autograd.grad方法求导数
利用autograd.grad方法对单个变量求导数 二利用autograd.grad方法求导数x torch.tensor(0.0,requires_grad True) # x需要被求导
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 设置为 True 将允许创建更高阶的导数
dy_dx torch.autograd.grad(y,x,create_graphTrue)[0]
print(dy_dx.data)# 求二阶导数
dy2_dx2 torch.autograd.grad(dy_dx,x)[0]print(dy2_dx2.data)利用autograd.grad方法对多个变量求导数 利用autograd.grad方法对多个变量求导数x1 torch.tensor(1.0,requires_grad True) # x需要被求导
x2 torch.tensor(2.0,requires_grad True)y1 x1*x2
y2 x1x2# 允许同时对多个自变量求导数
(dy1_dx1,dy1_dx2) torch.autograd.grad(outputsy1,inputs [x1,x2],retain_graph True)
print(dy1_dx1,dy1_dx2)# 如果有多个因变量相当于把多个因变量的梯度结果求和
(dy12_dx1,dy12_dx2) torch.autograd.grad(outputs[y1,y2],inputs [x1,x2])
print(dy12_dx1,dy12_dx2)三利用自动微分和优化器求最小值 三利用自动微分和优化器求最小值
x torch.tensor(0.0,requires_grad True) # x需要被求导
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, 标量的反向传播x torch.tensor(0.0,requires_grad True) # x需要被求导
#注意这里的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, 非标量的反向传播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需要被求导
#这里的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)
#非标量的区别在这里相当于用该gradient参数张量与调用张量作向量点乘得到的标量结果再反向传播。
x_grad x.grad
print(x_grad:\n,x_grad)
3, 非标量的反向传播可以用标量的反向传播实现x torch.tensor([[0.0,0.0],[1.0,2.0]],requires_grad True) # 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]])
z torch.sum(y*gradient) #将Y与权值相乘然后取和print(x:,x)
print(y:,y)
z.backward()
x_grad x.grad
print(x_grad:\n,x_grad)
二利用autograd.grad方法求导数x torch.tensor(0.0,requires_grad True) # x需要被求导
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 设置为 True 将允许创建更高阶的导数
dy_dx torch.autograd.grad(y,x,create_graphTrue)[0]
print(dy_dx.data)# 求二阶导数
dy2_dx2 torch.autograd.grad(dy_dx,x)[0]print(dy2_dx2.data)利用autograd.grad方法对多个变量求导数x1 torch.tensor(1.0,requires_grad True) # x需要被求导
x2 torch.tensor(2.0,requires_grad True)y1 x1*x2
y2 x1x2# 允许同时对多个自变量求导数
(dy1_dx1,dy1_dx2) torch.autograd.grad(outputsy1,inputs [x1,x2],retain_graph True)
print(dy1_dx1,dy1_dx2)# 如果有多个因变量相当于把多个因变量的梯度结果求和
(dy12_dx1,dy12_dx2) torch.autograd.grad(outputs[y1,y2],inputs [x1,x2])
print(dy12_dx1,dy12_dx2)
三利用自动微分和优化器求最小值
x torch.tensor(0.0,requires_grad True) # x需要被求导
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)