当前位置 主页 > 服务器问题 > Linux/apache问题 >

    Python Gluon参数和模块命名操作教程

    栏目:Linux/apache问题 时间:2019-12-18 22:56

    本文实例讲述了Python Gluon参数和模块命名操作。分享给大家供大家参考,具体如下:

    Gluon参数和模块命名教程

    在gluon里,每个参数和块都有一个名字(和前缀)。参数名可以由用户指定,block名也可以由用户指定,也可以自动创建。

    本教程中,我们将讨论命名方面的最佳实践。首先,import MXNet和Gluon

    from __future__ import print_function
    import mxnet as mx
    from mxnet import gluon
    
    

    Blocks命名

    在创建block时,可以指定一个前缀给它:

    mydense = gluon.nn.Dense(100, prefix='mydense_')
    print(mydense.prefix)
    mydense_
    
    

    若没有指定前缀,gluon会自动生成一个前缀

    dense0 = gluon.nn.Dense(100)
    print(dense0.prefix)
    dense0_
    
    

    当你创建更多同类块时,它们将递增后缀命名,以避免冲突:

    dense1 = gluon.nn.Dense(100)
    print(dense1.prefix)
    dense1_
    
    

    参数命名

    blocks中的参数将用过将block的前缀添加到参数的名称来命名:

    print(dense0.collect_params())
    dense0_ (
     Parameter dense0_weight (shape=(100, 0), dtype=<type 'numpy.float32'>)
     Parameter dense0_bias (shape=(100,), dtype=<type 'numpy.float32'>)
    )
    
    

    名称空间

    为了管理嵌套block的名称,每个块附加有一个name_scope(名称空间)。在name_scope中创建的block都会在其名称前加上父block的名称。

    我们将定义一个简单的神经网络来说明这点:

    class Model(gluon.Block):
     def __init__(self, **kwargs):
      super(Model, self).__init__(**kwargs)
      with self.name_scope():
       self.dense0 = gluon.nn.Dense(20)
       self.dense1 = gluon.nn.Dense(20)
       self.mydense = gluon.nn.Dense(20, prefix='mydense_')
     def forward(self, x):
      x = mx.nd.relu(self.dense0(x))
      x = mx.nd.relu(self.dense1(x))
      return mx.nd.relu(self.mydense(x))
    
    

    现在实例化这个神经网络

    注意:model0.dense0的名称是model0_dense0_而非dense0_ 注意:我们指定model.mydense的前缀为mydense_,它的父类前缀会自动生成并添加到前面变成model0_mydense_

    这里的名称前缀和变量名model0没有关系,这里就算把model0换成其他变量名比如net,前缀还是model?,? 表示这是一个递增的数字,这里的名称前缀和class Model有关 若将类名Model换成Hodel,那么后面的前缀都会变成 hodel?

    model0 = Model()
    model0.initialize()
    model0(mx.nd.zeros((1, 20)))
    print(model0.prefix)
    print(model0.dense0.prefix)
    print(model0.dense1.prefix)
    print(model0.mydense.prefix)
    model0_
    model0_dense0_
    model0_dense1_
    model0_mydense_
    
    

    若我们再次实例化Model,在Dense前会生成一个不同的名称。

    注意:model1.dense0的名称依然是dense0_而非dense2_,遵循之前在model0中创建的dense层的命名规则。这是因为每个model的命名空间是相互独立
    model1 = Model()
    print(model1.prefix)
    print(model1.dense0.prefix)
    print(model1.dense1.prefix)
    print(model1.mydense.prefix)
    model1_
    model1_dense0_
    model1_dense1_
    model1_mydense_