本文实例讲述了Python Gluon参数和模块命名操作。分享给大家供大家参考,具体如下:
在gluon里,每个参数和块都有一个名字(和前缀)。参数名可以由用户指定,block名也可以由用户指定,也可以自动创建。
本教程中,我们将讨论命名方面的最佳实践。首先,import MXNet和Gluon
from __future__ import print_functionimport mxnet as mxfrom mxnet import gluon
在创建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_
新闻热点
疑难解答