3.3 计算图与动态图机制
点击此处返回总目录 一、计算图 二、动态图与静态图的区别
一、计算图 计算图是用来描述运算的有向无环图。 计算图有两个主要元素:节点(Node)和边(Edge)。节点表示数据,比如张量、矩阵、向量等。边表示运算,如加减乘除卷积等。
比如:下面的计算图就是描述y = (x + w )* (w+1)这个操作的。
采用计算图来描述运算的好处,不仅仅是让运算更加简洁,它有一个更加重要的作用就是使得求导更加方便。
通过求导法则,我们可以知道:
可以看到y对w求导,就是找到所有y到w的路径。
我们用代码来看一下:
结果:
1. 叶子节点属性 在前面讲张量的属性的时候,讲到Tensor的is_leaf属性,指示张量是否为叶子节点。 什么是叶子节点呢?用户创建的节点称为叶子节点,比如上面的w和x。 叶子节点是整个计算图的根基。刚才看到y,a,b都是依据w和x进行计算的。
为什么要设置叶子节点的概念? 主要是为了节省内存。在反向传播结束之后,非叶子节点的梯度就被释放掉。【例1】
例1:
结果:
可以看到w和x是叶子,a、b、y不是叶子。 w和b有梯度,而a、b、y没有梯度。这是因为在反向传播之后,非叶子节点的梯度被释放掉了。
如果想要使用a/b/y这些非叶子节点的梯度,怎么办呢? 在pytorch中,有一个retain_grad()方法,在执行反向传播之前,执行这个方法就可以保存梯度。【例2】
例2:
结果:
可以看到执行了backward()之后,非叶子节点a的梯度还是保留了。
2.grad_fu属性 除了叶子节点这个属性,还有一个属性grad_fn,它用来记录创建张量时所用的方法(函数)。 记录方法主要是在反向传播的时候用到。比如由a*b得到y,y就记录下用了乘法,当由y求a和b的梯度的时候就会用到。 比如,刚才的图,记录的方法为:
例:
结果:
可以看到w和x是没有grad_fn的。因为他们是叶子节点,没有通过什么运算得到。
二、动态图 我们常常听说,pytorch是使用动态图机制,而tensorflow是采用静态图机制。
根据计算图的搭建方式,可以将计算图分为静态图和动态图。 动态图:运算和搭建同时进行。灵活、易调节。 静态图:先搭建图,后运算。高效、不灵活。
比如,Tensorflow是先搭建所有的计算图,然后传入数据,运算。 而pytorch是没执行一步操作的时候,才会在图中创建。
|
以上是 3.3 计算图与动态图机制 的全部内容, 来源链接: utcz.com/a/53296.html