zoukankan      html  css  js  c++  java
  • MXNet符号编程

    构成符号:

    符号对我们想要进行的计算进行了描述, 下图展示了符号如何对计算进行描述. 下图定义了符号变量A, 符号变量B, 生成了符号变量C, 其中, A, B为参数节点, C为内部节点mxnet.symbol.Variable可以生成参数节点, 用于表示计算时的输入.

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

    对神经网络进行配置:

    一个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) / 10
    d = c + 1
    input_shapes = {'A':(10,2), 'B':(10,2)}   # 定义输入的shape
    d.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]: []

    多输入网络实例:

    下面的图对一个多输入神经网络进行配置:

    绑定以及执行Symbol:

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

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

    A = mx.sym.Variable('A')
    B = mx.sym.Variable('B')
    C = A * B
    D = mx.sym.Variable('D')
    E = C + D
    a = mx.nd.empty(1)  # 生成一个维度为1的随机值
    b = mx.nd.ones(1)    # b等于1
    d = mx.nd.ones(1)
    executor = E.bind(ctx=mx.cpu(), args={'A':a, 'B':b, 'D':d})
    type(executor)  # mxnet.executor.Executor
    executor.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)

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

    绑定多个输出:

    我们可以使用mx.symbol.Group([])来将symbols进行分组,然后将它们进行绑定: 下图中,A/B/D为参数节点,C/E为内部节点,将E/C绑定为G,这样,E和C的计算结果都可以得到! 但是建议如果我们只需要E的计算结果的话,建议只绑定E自己,这样更加优化!

    梯度计算:

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

    神经网络的简单绑定接口:

    有时,将一大推的NDArrays传递给绑定函数是很繁琐的,Symbol.simple_bind()这个函数可以帮助我们简化这个过程,你仅仅需要指定输入数据的大小(shape),这个函数可以定位到这个参数并将其绑定为Executor.

    辅助变量:

    参考文献:

    [1] Symbolic Configuration and Execution in Pictures: http://mxnet-bing.readthedocs.io/en/latest/supported_languages/python/symbol_in_pictures.html

    [2] MXNet实战: http://www.linuxeden.com/html/news/20160413/165698.html

  • 相关阅读:
    我见过的最完善的log4net配置
    根据身份证号中的日期判断某人是否已满18岁及是否已满60岁
    第三届“百越杯”福建省高校网络空间安全大赛
    PHP-上传文件
    PHP-操作Mysql
    PHP-异常处理
    PHP-错误处理
    Python(算法)-时间复杂度和空间复杂度
    Python-集合
    Python-字典
  • 原文地址:https://www.cnblogs.com/zhao441354231/p/6081055.html
Copyright © 2011-2022 走看看