深度学习-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.总结
将递归调用改为循环模式,为后面灵活性,高性能图计算做准备