分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 软件开发

『MXNet』第十一弹_符号式编程专题

发布时间:2023-09-06 02:14责任编辑:胡小海关键词:暂无标签

一、符号分类

符号对我们想要进行的计算进行了描述, 下图展示了符号如何对计算进行描述.

我们定义了符号变量A, 符号变量B, 生成了符号变量C, 其中, A, B为参数节点, C为内部节点! mxnet.symbol.Variable可以生成参数节点, 用于表示计算时的输入.

二、常用符号方法

一个Symbol具有的属性和方法如下图所示:

关联节点查看

list_argument()用来检查计算图的输入参数;

list_output()返回此Symbol的所有输出,输出的自动命名遵循一定的规则

input = mx.sym.Variable(‘data‘) ?# 生成一个符号变量,名字是可以随便取的fc1 = mx.sym.FullyConnected(data=input, num_hidden=128,name=‘fc1‘) ?# 全连接层act1 = mx.sym.Activation(fc1, act_type=‘relu‘) ?# 激活type(fc1) ?# mxnet.symbol.Symbol, act1的类型也是这个!!!fc1.list_outputs() ?# [‘fc1_output‘],自动在输入name属性名的后面加上"_output"作为本节点名称fc1.list_arguments() ?# [‘data‘,‘fc1_weight‘,‘fc1_bias‘],自动生成fc1_weight,fc1_bias两个参数节点act1.list_outputs() ?# [‘actvation0_output‘] 这个名字就不是随便起的了!!!act1.list_arguments() ?# [‘data‘,‘fc1_weight‘,‘fc1_bias‘]

 返回逻辑如下图,

数据维度推断

mxnet.symbol.Symbol.infer_shape(self, *args, **kwargs): 推测输入参数和输出参数的shape, 返回一个list of tuple;

a = mx.sym.Variable(‘A‘)b = mx.sym.Variable(‘B‘)c = (a + b) / 10d = c + 1input_shapes = {‘A‘:(10,2), ‘B‘:(10,2)} ??# 定义输入的shaped.infer_shape(**input_shapes) # ([(10L, 2L), (10L, 2L)], [(10L, 2L)], [])arg_shapes, out_shapes, aux_shapes = d.infer_shape(**input_shapes)

In [1]: arg_shapes

Out[1]: [(10L, 2L), (10L, 2L)]

In [2]: out_shapes

Out[2]: [(10L, 2L)]

In [3]: aux_shapes

Out[3]: [] 

三、绑定执行

A = mx.sym.Variable(‘A‘)B = mx.sym.Variable(‘B‘)C = A * BD = mx.sym.Variable(‘D‘)E = C + Da = mx.nd.empty(1) ?# 生成一个维度为1的随机值b = mx.nd.ones(1) ???# b等于1d = mx.nd.ones(1)executor = E.bind(ctx=mx.cpu(), args={‘A‘:a, ‘B‘:b, ‘D‘:d})type(executor) ?# mxnet.executor.Executorexecutor.arg_dict ?# {‘A‘: <NDArray 1 @cpu(0)>, ‘B‘: <NDArray 1 @cpu(0)>, ‘D‘: <NDArray 1 @cpu(0)>}executor.forward() ?# [<NDArray 1 @cpu(0)>]executor.outputs[0] ?# <NDArray 1 @cpu(0)>, 值呢? 还是看不到值啊???executor.outputs[0].asnumpy() ?# array([ 1.], dtype=float32)

首先我们需要调用绑定函数(bind function:*.bind)来绑定NDArrays(下图中的a/b/d)到参数节点(argument nodes: A/B/D,不是内部节点C/E),从而获得一个执行器(Executor):

然后,调用Executor.Forward 便可以得到输出结果.

执行器属性方法如下:

绑定多个输出

我们可以使用mx.symbol.Group([])来将symbols进行分组,然后将它们进行绑定,从而得到更多的中间变量输出。

下图中,A/B/D为参数节点,C/E为内部节点,将E/C绑定为G,这样,E和C的计算结果都可以得到,但是出于优化计算图的考虑,不建议过多绑定输出节点。

梯度计算

在绑定函数中,可以指定NDArrays来保存梯度,在Executor.forward()的后面调用Executor.backward()可以得到相应的梯度值.

神经网络的简单绑定接口

反向传播时,我们需要定义很多新的grad节点并绑定给Executor,过程较为繁琐,Symbol.simple_bind()函数可以帮助我们简化这个过程,指定输入数据的大小(shape),这个函数可以定位梯度参数并将其绑定为Executor.

辅助变量

『MXNet』第十一弹_符号式编程专题

原文地址:https://www.cnblogs.com/hellcat/p/9639079.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved