MXNET深度学习框架-02-autograd求导
程序员文章站
2022-03-06 10:00:38
...
Autograd求导
在机器(深度)学习中,我们通常使用梯度下降的方法来求解参数的最优解,在回归\分类模型中,通常对损失函数进行梯度(优化)求解,但在一个数据量十分庞大的模型中,手工沿着梯度方向更新模型并不现实。因此,mxnet中提供了一个autograd包来自动化求导。
1、为变量附上梯度
首先先定义一个函数f(x)=,接下来对其进行求导。
x=nd.array([[1,2],[3,4]]) # x的初始值
x.attach_grad() # 计算x的导数时,需要一个地方来存放x的导数,使用NDarra中的attach_grad()来申请
# 下面定义f(x)
with ag.record():# mxnet不会记录用于求导的计算图,需要使用ag.record()来进行记录
y=2*(x**2)
print(y)
y.backward() # 求导
print(x.grad)
运行结果:
由于f(x)的导数g(x)=4*x,所以把x代入可得上述结果。
2、控制流求导
当逻辑中包含if、else等条件或循环命令时,依旧可以进行求导
def f(a): # 条件函数
b=a*2
while nd.norm(b).asscalar()<1000: # norm()是对所有元素求平方在相加,最后开根号
b=b*2
if nd.sum(b).asscalar()>0:
c=b
else:
c=100*b
return c
a=nd.random_normal(shape=3)
a.attach_grad()
with ag.record():
c=f(a)
c.backward()
print(a.grad)
运行结果:
f(a)的求导函数为g(a)=c/a,我们可以验证一下:
print(c/a) # f(a)求导结果
运行结果:
所有代码:
import mxnet.autograd as ag
import mxnet.ndarray as nd
'''---为变量附上梯度---'''
# 求解f(x)=2*(x^2)
x=nd.array([[1,2],[3,4]]) # x的初始值
x.attach_grad() # 计算x的导数时,需要一个地方来存放x的导数,使用NDarra中的attach_grad()来申请
# 下面定义f(x)
with ag.record():# mxnet不会记录用于求导的计算图,需要使用ag.record()来进行记录
y=2*(x**2)
print(y)
y.backward() # 求导
print(x.grad)
'''---对控制流求导---'''
def f(a): # 条件函数
b=a*2
while nd.norm(b).asscalar()<1000: # norm()是对所有元素求平方在相加,最后开根号
b=b*2
if nd.sum(b).asscalar()>0:
c=b
else:
c=100*b
return c
a=nd.random_normal(shape=3)
a.attach_grad()
with ag.record():
c=f(a)
c.backward()
print(a.grad)
print(c/a) # f(a)求导结果
推荐阅读
-
MXNet设计笔记:深度学习的编程模式比较
-
TensorFlow实战Google深度学习框架-人工智能教程-自学人工智能的第二天-深度学习
-
深度学习框架Caffe解析:从代码层面定制新功能
-
浪潮在美国发布深度学习计算框架Caffe-MPI
-
TensorFlow与主流深度学习框架对比 TensorFlowTensorFlow实战
-
TensorFlow与主流深度学习框架对比 TensorFlowTensorFlow实战
-
【tensorflow:实战Google深度学习框架】-Chapter9 对于TED(en-zh)数据集切词
-
【TensorFlow实战Google深度学习框架】学习笔记(tensorflow入门)
-
深度学习零基础使用 PyTorch 框架跑 MNIST 数据集的第四天:单例测试
-
MXNet动手学深度学习笔记:Gluon实现Dropout