本文實例講述了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_
新聞熱點
疑難解答