本文實(shí)例講述了Python Gluon參數(shù)和模塊命名操作。分享給大家供大家參考,具體如下:
在gluon里,每個(gè)參數(shù)和塊都有一個(gè)名字(和前綴)。參數(shù)名可以由用戶指定,block名也可以由用戶指定,也可以自動(dòng)創(chuàng)建。
本教程中,我們將討論命名方面的最佳實(shí)踐。首先,import MXNet和Gluon
from __future__ import print_functionimport mxnet as mxfrom mxnet import gluon
在創(chuàng)建block時(shí),可以指定一個(gè)前綴給它:
mydense = gluon.nn.Dense(100, prefix='mydense_')print(mydense.prefix)mydense_
若沒(méi)有指定前綴,gluon會(huì)自動(dòng)生成一個(gè)前綴
dense0 = gluon.nn.Dense(100)print(dense0.prefix)dense0_
當(dāng)你創(chuàng)建更多同類塊時(shí),它們將遞增后綴命名,以避免沖突:
dense1 = gluon.nn.Dense(100)print(dense1.prefix)dense1_
blocks中的參數(shù)將用過(guò)將block的前綴添加到參數(shù)的名稱來(lái)命名:
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的名稱,每個(gè)塊附加有一個(gè)name_scope(名稱空間)。在name_scope中創(chuàng)建的block都會(huì)在其名稱前加上父block的名稱。
我們將定義一個(gè)簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)來(lái)說(shuō)明這點(diǎn):
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))
現(xiàn)在實(shí)例化這個(gè)神經(jīng)網(wǎng)絡(luò)
注意:model0.dense0
的名稱是model0_dense0_
而非dense0_
注意:我們指定model.mydense
的前綴為mydense_
,它的父類前綴會(huì)自動(dòng)生成并添加到前面變成model0_mydense_
這里的名稱前綴和變量名model0沒(méi)有關(guān)系,這里就算把model0換成其他變量名比如net,前綴還是model?,? 表示這是一個(gè)遞增的數(shù)字,這里的名稱前綴和
class Model
有關(guān) 若將類名Model換成Hodel,那么后面的前綴都會(huì)變成 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_
若我們?cè)俅螌?shí)例化Model
,在Dense
前會(huì)生成一個(gè)不同的名稱。
model1.dense0
的名稱依然是dense0_
而非dense2_
,遵循之前在model0
中創(chuàng)建的dense層的命名規(guī)則。這是因?yàn)槊總€(gè)model的命名空間是相互獨(dú)立model1 = Model()print(model1.prefix)print(model1.dense0.prefix)print(model1.dense1.prefix)print(model1.mydense.prefix)model1_model1_dense0_model1_dense1_model1_mydense_
|
新聞熱點(diǎn)
疑難解答
圖片精選