当前位置: 首页 > news >正文

做网站优化的价格徐州市建设局官方网站

做网站优化的价格,徐州市建设局官方网站,西安网站建设开发公司怎么样,网站建设好后的手续交接深度学习-07-反向传播的自动化 本文是《深度学习入门2-自製框架》 的学习笔记,记录自己学习心得,以及对重点知识的理解。如果内容对你有帮助,请支持正版,去购买正版书籍,支持正版书籍不仅是尊重作者的辛勤劳动&#xf…
深度学习-07-反向传播的自动化


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

当前笔记内容主要为:步骤7 反向传播的自动化 章节的相关理解。

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

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


1.为反向传播的自动化创造条件

之前我们在实现反向传播的时候,我们是手动编写进行反向传播计算的代码,这意味着我们每次都要编写这些代码。例如下面的:

    A = Square()
    B = Exp()
    C = Square()

    x = Variable(np.array(0.5))
    a = A(x)
    b = B(a)
    y = C(b)

    y.grad = np.array(1.0)
    b.grad = C.backward(y.grad)
    a.grad = B.backward(b.grad)
    x.grad = A.backward(a.grad)
    print(x.grad)

如果计算图不一样,那么我们每次就需要白那些不一样的代码来计算反向传播。

图:不同计算图的例子。

那我们就开始思考如果自动化这块内容?书中讲解了一种机制:无论普通的计算流程(正向传播)中是什么样的计算,反向传播都能 自动进行 。这里引入一个概念:Define- by-Run。
Define-by-Run;是在深度学习中进行计算时 ,在计算之间建立"连接"的机 制 。 这种机制也称为动态计算图


计算图都是流水线式的计算 。 因此,只要以列表的形式记录函数的顺序,就可以通过反向回溯自动进行反向传播
    
    
在实现反向传播的自动化之前,我们先思考一下变量和函数之间的关系。解决方案主要从这里入手。我们需要考察变量和函数的关系并且用代码表示出来。

函数的变量包括"输入变量 "(input) 和"输出变量"(output)。函数是变量的 "父母" 如果没有父母,说明这个变量是用户的输入变量。

修改Variable 定义,函数和变量之间的"连接,让这个"连接"在执行普通计算(正向传播)的那一刻创建。

class Variable:def __init__(self, data):self.data = dataself.grad = Noneself.creator = Nonedef set_creator(self,func):self.creator = func

上面代码,定义了熟悉 creator 标识是那个函数。并且定义了set 方法,来进行变量与函数之间的关联。

修改 Function 定义:

class Function:def __call__(self, input):x = input.datay = self.forward(x)output = Variable(y)output.set_creator(self)  # 输出者保存创造者对象self.input = inputself.output = output  # 保存输出者。我是创造者的信息,这是动态建立 "连接"这 一 机制的核心return outputdef forward(self, x):raise NotImplementedError()  # 使用Function  这个方法forward 方法的人 , 这个方法应该通过继承采实现def backward(self, gy):raise NotImplementedError()


在函数执行时,就设置输出变量的 creator 为”自己“。并且将输出保存起来。

经过上面的操作后,变量和函数之间建立的联系,并且这两种联系的建立时代码执行过程中创建的。

有了连接,我们手动检查下,计算下反向遍历计算图  

    A = Square()B = Exp()C = Square()x = Variable(np.array(0.5))a = A(x)b = B(a)y = C(b)assert y.creator == Cassert y.creator.input == bassert y.creator.input.creator == Bassert y.creator.input.creator.input == aassert y.creator.input.creator.input.creator == Aassert y.creator.input.creator.input.creator.input == x

没有抛出异常,这意味着 assert 语句的所有条件都得到了满足。


2.尝试反向传播

利用上面的变量与函数之间的关系。进行反向传播计算。

先 y ---> b 

    y.grad = np.array(1.0)C = y.creator  # 获取函数b = C.input     # 获取函数的输入b.grad = C.backward(y.grad)    # 调用函数的backward 方法

然后  b ---> a
    
 

    B = b.creatorb = B.inputa.grad = B.backward(b.grad)

最后  a----> x 

    A = a.creatorx = A.inputx.grad = A.backward(a.grad)print(x.grad)


    
其实每一步的规律是:
1 获取函数 
2 获取函数的输入 
3 调用函数的 backward 方法


最后执行的结果为  
3.29744

3.增加backward 方法

前面这些反向传播的代码可以看山,它们有着相同的处理流程准确 来说,是从一个变量到前一个变量的反向传播逻辑相同。

修改Variable 类,增加一个新的方法-backward 


class Variable:def __init__(self, data):self.data = dataself.grad = Noneself.creator = Nonedef set_creator(self,func):self.creator = funcdef backward(self):f = self.creator  # 获取函数if f is not None:x = f.input # 获取函数的输入x.grad =f.backward(self.grad) # 调用函数的backward() 方法x.backward()  # 调用自己前面的那个变量的 backward()方法
4.项目代码
'''
step07.py
自动实现反向传播'''import numpy as npclass Variable:def __init__(self, data):self.data = dataself.grad = Noneself.creator = Nonedef set_creator(self,func):self.creator = funcdef backward(self):f = self.creator  # 获取函数if f is not None:x = f.input # 获取函数的输入x.grad =f.backward(self.grad) # 调用函数的backward() 方法x.backward()  # 调用自己前面的那个变量的 backward()方法class Function:def __call__(self, input):x = input.datay = self.forward(x)output = Variable(y)output.set_creator(self)  # 输出者保存创造者对象self.input = inputself.output = output  # 保存输出者。我是创造者的信息,这是动态建立 "连接"这 一 机制的核心return outputdef forward(self, x):raise NotImplementedError()  # 使用Function  这个方法forward 方法的人 , 这个方法应该通过继承采实现def backward(self, gy):raise NotImplementedError()class Square(Function):def forward(self, x):y = x ** 2return ydef backward(self, gy):x= self.input.datagx = 2 * x * gy     #方法的参数 gy 是 一个 ndarray 实例 , 它是从输出传播而来的导数 。return gxclass Exp(Function):def forward(self, x):y = np.exp(x)return ydef backward(self, gy):x = self.input.datagx = np.exp(x) * gyreturn gxif __name__ == '__main__':A = Square()B = Exp()C = Square()x = Variable(np.array(0.5))a = A(x)b = B(a)y = C(b)assert y.creator == Cassert y.creator.input == bassert y.creator.input.creator == Bassert y.creator.input.creator.input == aassert y.creator.input.creator.input.creator == Aassert y.creator.input.creator.input.creator.input == x# 反向传播y.grad = np.array(1.0)C = y.creator  # 获取函数b = C.input     # 获取函数的输入b.grad = C.backward(y.grad)    # 调用函数的backward 方法B = b.creatorb = B.inputa.grad = B.backward(b.grad)A = a.creatorx = A.inputx.grad = A.backward(a.grad)print(x.grad)# 自动反向传播x = Variable(np.array(0.5))a = A(x)b = B(a)y = C(b)y.grad = np.array(1.0)y.back()print(x.grad)
5.总结

经过此小节的代码丰富,目前我们可以执行自动反向传播计算。

http://www.yayakq.cn/news/707011/

相关文章:

  • 网站开发需要什么技能网推怎么推广
  • 建站哪家好联系兴田德润优是是什么网站
  • 龙华住房和建设局网站怎么无法登陆山东济南城乡建设厅网站
  • 小学网站建设教程网站开发是否属于技术合同
  • 中国招标网官方网站石家庄小学网站建设
  • 哪个网站有老外教做蛋糕设计公司名字参考
  • 政务门户网站建设思想wordpress媒体库
  • 手机网站最小宽度南京网站设计公司兴田德润放心
  • 精神文明建设网站专栏做网站怎么这么贵
  • 丹东制作网站公司广告公司简介及制作经验
  • 网站建设前期准备方案c2c交易是什么意思
  • 郑州网站推广流程小米商城的网站建站
  • 做哈尔滨本地门户网站赚钱吗大连外贸网站建设
  • 网站建设过程中要注意沟通网站建设专员 岗位职责
  • 网站制作公司权威乐云践新专家建设网站注意什么
  • 西安哪些做网站的公司怎样做网商网站
  • 阿里国际网站官网入口市场营销策略范文
  • 旅游网站建设研究综述广东省建设交易中心网站首页
  • 网站审批号如何刷seo关键词排名
  • 顺德乐从网站建设西安竞价托管代运营
  • 雄安做网站要多少钱工业设计专业最佳出路
  • 西安网站群建设设计网站公司的账务处理
  • 网站采集被降权网站收录少的原因
  • 网站和网页的设计原则商标怎么设计
  • 深圳摇号申请网站qq空间破解版免费下载
  • 西峡网站建设会计公司网站模板
  • 品牌建设计划青岛企业网站建设优化
  • 网站做多少层级广州商务网站建设
  • 建设网站毕业设计无锡网站排名哪里有
  • 做一个网站如何做wordpress投票系统