numpy 梯度下降
x=1
lr = 0.01 # 学习率
epochs = 100 # 迭代次数
y = lambda x:x**2+2*x+1 # 抛物线函数
for epochs in range(epochs):
dx = 2*x + 2 # 求导
x = x-lr *dx # 梯度下降
print(x)
pytorch 梯度下降
- torch.Tensor是这个包的核心类。如果设置它的属性 .requires_grad为True,那么它将会追踪对于该张量的所有操作。当完成计算后可以通过调用.backward(),来自动计算所有的梯度。这个张量的所有梯度将会自动累加到.grad属性.
import torch
from torch.autograd import Variable # 这里的Variable是torch里的一个自动求导函数
x = torch.Tensor([1]) # 定义一个torch.float 张量,相当于numpy的array,其中[1]只是列表,torch.Tensor 就是创建一个张量,也就是和numpy中的矩阵一样,numpy.array有的运算torch.Tensor都有
x = Variable(x,requires_grad=True) # 定义一个自动求导函数,建立一个计算图的起点。
print(
'\ngrad:',x.grad, # 梯度的综合
'\ndata:',x.data
) # grad 和 data 是Variable的两个属性,x.data就是前面x包含的tensor
# Pytorch 本质,建立一个计算图,自动求导
lr = 0.01
epochs = 100
for epochs in range(epochs):
y = x ** 2 + 2 * x + 1
y.backward(x) # 这里是反向传导,反向传导后就有grad
print('grad:',x.grad.data)
x.data = x.data - lr * x.grad.data
x.grad.data.zero_() # 梯度清零
print(x.data)