什么是梯度
对所有自变量求偏微分构成的向量,它是一个向量(有大小和函数值增长方向)
导数是一个标量
找最小值点坐标的案例
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()))