梯度详解与优化实战

什么是梯度

对所有自变量求偏微分构成的向量,它是一个向量(有大小和函数值增长方向)

导数是一个标量
梯度详解与优化实战_第1张图片

找最小值点坐标的案例

在这里插入图片描述

import torch

import numpy as np
import matplotlib.pyplot as plt
def himmelblau(x):
    return (x[0]**2+x[1]-11)**2 + (x[0]+x[1]**2-7)**2

x = np.arange(-6,6,0.1)
# print(x)
y = np.arange(-6,6,0.1)

X,Y = np.meshgrid(x,y)
# print(X,"hhhhh\n",Y)

Z = himmelblau([X,Y])

fig = plt.figure("himmelbu")
ax = fig.gca(projection="3d")
ax.plot_surface(X,Y,Z)
ax.view_init(60,-30)

plt.show()

# 使得x包含x,y两个变量,最终要求最小值
x = torch.tensor([4,0],requires_grad=True,dtype=float)

# a.下面这句话相当于 x' = x - 0.001*△x  y'=...
optimizer = torch.optim.Adam([x],lr=1e-3)

for step in range(20000):
    pred = himmelblau(x)

    # 先将梯度清零  防止梯度累积
    optimizer.zero_grad()

    # 生成x y的梯度信息
    pred.backward()

    # 这句话相当于执行a  有了梯度信息后,代入a式求值
    optimizer.step()

    if step%2000==0:
        print('step:{} x={} f(x)={}'.format(step,x.tolist(),pred.item()))


你可能感兴趣的:(workHappy,pytorch,深度学习)