使用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:
《动手学深度学习》