首页人工智能MXNet2.自动求梯度

2.自动求梯度

使用MXNet提供的autograd模块类自动求梯度。

from mxnet import autograd , nd
# 创建x并赋值
x = nd.arange(4).reshape((4,1))
x
Out[4]: 

[[0.]
 [1.]
 [2.]
 [3.]]
<NDArray 4x1 @cpu(0)>
# 为了求变量x的梯度,需要先调用attach_grad函数来申请储存梯度所需的内存
x.attach_grad()
# 为了减少计算和内存开销,默认条件下MXNet不会记录用于求梯度的计算。需要调用record函数来要求MXNet记录与求梯度有关的计算
with autograd.record():
    y = 2*nd.dot(x.T,x)
# 调用backward函数自动求梯度
y.backward()
# 查看x的梯度信息
x.grad
Out[10]: 

[[ 0.]
 [ 4.]
 [ 8.]
 [12.]]
<NDArray 4x1 @cpu(0)>

另外,默认情况下,autograd还会将运行模式从预测模式转为训练模式。

print(autograd.is_training())
False

with autograd.record():
    print(autograd.is_training())
    
True

此外,如果函数中包含了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=1)

a.attach_grad()

with autograd.record():
    c = f(a)
    

c.backward()

a.grad
Out[19]: 

[1024.]
<NDArray 1 @cpu(0)>

Reference:
《动手学深度学习》

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments