深度学习-08-从递归到循环

深度学习-08-从递归到循环


本文是《深度学习入门2-自製框架》 的学习笔记,记录自己学习心得,以及对重点知识的理解。如果内容对你有帮助,请支持正版,去购买正版书籍,支持正版书籍不仅是尊重作者的辛勤劳动,也是鼓励更多优秀作品问世。

当前笔记内容主要为:步骤8 从递归到循环 章节的相关理解。

书籍总共分为5个阶段,每个阶段分很多步骤,最终是一步一步实现一个深度学习框架。例如前两个阶段为:

第 1 阶段共包括 10 个步骤 。 在这个阶段,将创建自动微分的机制
第 2 阶段,从步骤11-24,该阶段的主要目标是扩展当前的 DeZero ,使它能够执行更复杂的计算 ,使它能 够处理接收多个输入的函数和返回多个输出的函数


1.现在的Variable类

上一节我们为变量类Variable 增加了backward 方法,实现了从一个变量到前一个变量得到反向传播。前面实现的方法是递归的结构,我们知道递归的结构在调用嵌入很深的时候,效率会很低。
            

class Variable:
    def __init__(self, data):
        self.data = data
        self.grad = None
        self.creator = None

    def set_creator(self,func):
        self.creator = func

    def backward(self):
        f = self.creator  # 获取函数
        if f is not None:
            x = f.input # 获取函数的输入
            x.grad =f.backward(self.grad) # 调用函数的backward() 方法
            x.backward()  # 调用自己前面的那个变量的 backward()方法

考虑如何优化。

2.使用循环实现

将递归调用改为循环调用

class Variable:
    def __init__(self, data):
        self.data = data
        self.grad = None
        self.creator = None

    def set_creator(self,func):
        self.creator = func

    def backward(self):
        funcs = [self.creator]
        while funcs:
            f = funcs.pop()  #获取到函数
            x, y =f.input, f.output
            x.grad = f.backward(y.grad) #backward 调用backward方法

            if x.creator is not None:
                funcs.append(x.creator)  # 将前一个函数加入到列表中

3.代码验证

实现方式就从递归变成了循环。我们将感受到循环带来的好处 。 届时要处理的是复杂的计算图,不过在使用循环的情况下,代码实现也是很容易扩展到复杂的计算图的处理,而且循环的执行效率也会变高

修改后执行,结果是一样的:
 

C:\Users\Administrator\AppData\Local\Programs\Python\Python39-32\python.exe D:/pyworkspace/dezero-01/step08.py
3.297442541400256
3.297442541400256
4.总结

将递归调用改为循环模式,为后面灵活性,高性能图计算做准备

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值