《深度学习入门2:自制框架》Rosenbrock修改备忘

在经过“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()
  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值