自动求梯度

深度学习中,我们经常要对函数求梯度,那么梯度是什么?

如:z=x+y

则:z的梯度为:(dz/dx,dz/dy)=(1,1),即由多元函数的各一阶导数构成的向量.

代码演示:

from mxnet import autograd, nd 
#创建变量x 并赋值
x = nd.arange(4).reshape((4,1))

#为了求得有关变量x的梯度,要调用函数 attach_grad 来申请存储梯度所需要的内存
x.attach_grad()

#为了减少计算和内存的开销,默认条件下MXNet不会记录用于求梯度的计算。我们需要调用record函数来要求#MXNet 记录与 求 梯度有关计算。
with autograd.record():
    y = 2 * nd.dot(x.T,x)

#由于x的形状是(4,1),y是一个标量。接下来我们可以通过调用backward函数自动求梯度。
y.backward()

#函数的梯度应该是4x,我们来验证一下求出来的梯度是正确的
assert (x.grad - 4*x).norm().asscalar() == 0
x.grad

#[[ 0.]
#[ 4.]
#[ 8.]
#[12.]]
#<NDArray 4x1 @cpu(0)>
#举例2
x = nd.arange(5).reshape((5,1))
x.attach_grad()
with autograd.record():
    y = 4 * nd.dot(x.T,x) + 3
y.backward()

x.grad
#[[ 0.]
# [ 8.]
# [16.]
# [24.]
# [32.]]
#<NDArray 5x1 @cpu(0)>

if((x.grad - 8*x).norm().asscalar() == 0):
    print(1)

#1
#在调用record函数后,MXNet会记录并计算梯度。
#此外,默认情况下,autograd还会将运行模式从预测模式转化为训练模式。
#可以通过is_training函数来查看
print(autograd.is_training())
with autograd.record():
    print(autograd.is_training())

#False
#True

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值