动手学深度学习笔记--autograd

MXNet提供自动求梯度,from mxnet import autograd as ag,nd

这有个很大的好处在于,不需要去写求导的式子,只需要知道原函数是什么样,然后需要给哪个求导就给谁开一个求导内存就行。

基本步骤:

  1. 创建初始变量x
  2. 求关于x的梯度,所以为x申请一个储存梯度的内存x.attach_grad()
  3. 定义关于x的函数(被求导的函数)。减少计算和内存开销,MXNET默认不记录求梯度的计算。调用record记录
    调用record后,mxnet默认将“autograd”的运行模式从预测模式转为训练模式。用is_training查看
  4. With autograd.record():
             y = fun(x)
  5. 调用backward()求导数
     

注意:y是一个标量。接下来我们可以通过调用backward函数自动求梯度。需要注意的是,如果y不是一个标量,MXNet将默认先对y中元素求和得到新的变量,再求该变量有关x的梯度。

  1. 输出求导结果x.grad,基于x为变量,y为函数的导数
  2. Assert函数-->断言功能,

lists = [0,1,2]

assert len(lists) >=5,'列表元素个数小于5'

如果为假,则反馈

AssertionError: 列表元素个数小于5

  1. 使用MXNET的一个便利之处,即使函数的计算图里包含了python的控制流(如条件和循环控制),我们也有可能对变量求梯度

【来自讨论区问题集合】

1.MXNET默认是不储存求梯度的过程的,什么意思呢?如下面问题:

可以看出,中间变量y的求导是没有被记录下来的,这是为了节约内存的原因。那么如果想要得到y的求导结果怎么做呢?

猜你喜欢

转载自blog.csdn.net/weixin_42273201/article/details/86539533
今日推荐