在经过“step 32 高阶导数(实现篇)”的代码修改后:
class Variable:
...
def backward(self, retain_grad=False, create_graph=False):
"""
定义反向传播方法, 并设定保持导数的参数为False,在设定为False的情况下,计算过程中会删除过程导数,只保留结果导数
如果是True,就会保留所有导数
"""
if self.grad is None: # 如果self.grad为空值,则开始执行求导工作
# self.grad = np.ones_like(self.data) # ones_like 方法的用处,返回括号内对象的数据格式
self.grad = Variable(np.ones_like(self.data)) # 从ndarray实例转换为Variable实例
funcs = []
seen_set = set() # 防止一个函数被多次添加到funcs列表中
...
原“step 28 函数优化”部分的Rosenbrock函数部分,init.py文件里的相应代码做如下调整即可正确计算及打印成图:
import math
import numpy as np
import matplotlib.pyplot as plt
def rosenbrock(x0, x1):
y = 100 * (x1 - x0 ** 2) ** 2 + (x0 - 1) ** 2
return y
x0 = Variable(np.array(0.0))
x1 = Variable(np.array(2.0))
lr = 0.001 # 学习率
iters = 1000 # 迭代次数
x0_results = []
x1_results = []
for i in range(iters):
y = rosenbrock(x0, x1)
x0.cleargrad()
x1.cleargrad()
y.backward()
x0_result = x0.grad
x1_result = x1.grad
x0.data -= lr * x0_result.data
x1.data -= lr * x1_result.data
x0_results.append(x0.data.astype(float))
x1_results.append(x1.data.astype(float))
fig = plt.figure()
plt.plot(x0_results)
plt.plot(x1_results)
plt.show()