动手学深度学习1-1

#自动求梯度  MXNet 提供的autograd包来自动求梯度
from mxnet import autograd,nd

x=nd.arange(4).reshape((4,1))#创建变量`x`,并赋初值
#为了求有关变量x的梯度,我们需要先调用attach_grad函数来申请存储梯度所需要的内存。
x.attach_grad()
#定义有关变量x的函数。为了减少计算和内存开销,默认条件下 MXNet 不会记录用于求梯度的计算。
#我们需要调用record函数来要求 MXNet 记录与求梯度有关的计算。
with autograd.record():
    y=2*nd.dot(x.T,x)    #求梯度后y=4x
#由于x的形状为(4, 1),y是一个标量。接下来我们可以通过调用backward函数自动求梯度。
#需要注意的是,如果y不是一个标量,MXNet 将默认先对y中元素求和得到新的变量,再求该变量有关x的梯度。
y.backward()#求y关于x的梯度
x.grad#就是相当于y=4x时当x=0 1 2 3 时的y的取值



#对 Python 控制流求梯度
#使用 MXNet 的一个便利之处是,即使函数的计算图包含了 Python 的控制流(例如条件和循环控制),我们也有可能对变量求梯度。
#其中包含 Python 的条件和循环控制。也就是说MXNet的用法就和python差不多

#例

def f(a):
    b = a * 2
    while b.norm().asscalar() < 1000:
        b = b * 2
    if b.sum().asscalar() > 0:
        c = b
    else:
        c = 100 * b
    return c

a=nd.random.normal(shape=2)#样子为[ x1 x2] 两个数值
a.attach_grad()#使用这个函数申请求梯度时所需内存
with autograd.record():
      c=f(a)
#给定任意输入a,其输出必然是 f(a) = x * a的形式,其中标量系数x的值取决于输入a。
#由于c = f(a)有关a的梯度为x,且值为c / a,我们可以像下面这样验证对本例中控制流求梯度的结果的正确性。
c.backward()

a.grad==c/a

 

发布了33 篇原创文章 · 获赞 64 · 访问量 5万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术工厂 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览