Python Gluon參數(shù)和模塊命名操作教程
本文實(shí)例講述了Python Gluon參數(shù)和模塊命名操作。分享給大家供大家參考,具體如下:
Gluon參數(shù)和模塊命名教程
在gluon里,每個(gè)參數(shù)和塊都有一個(gè)名字(和前綴)。參數(shù)名可以由用戶指定,block名也可以由用戶指定,也可以自動(dòng)創(chuàng)建。
本教程中,我們將討論命名方面的最佳實(shí)踐。首先,import MXNet和Gluon
from __future__ import print_function import mxnet as mx from mxnet import gluon
Blocks命名
在創(chuàng)建block時(shí),可以指定一個(gè)前綴給它:
mydense = gluon.nn.Dense(100, prefix='mydense_') print(mydense.prefix) mydense_
若沒有指定前綴,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_
參數(shù)命名
blocks中的參數(shù)將用過將block的前綴添加到參數(shù)的名稱來命名:
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ò)來說明這點(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沒有關(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_
建議手動(dòng)為頂層的model指定一個(gè)前綴,即model = Model(prefix=‘mymodel_'),以避免命名時(shí)可能出現(xiàn)的混淆。
相同的規(guī)則同樣適用于像Sequential這類容器block.name_scope 既可以在__init__內(nèi)使用,也可以在__init__ 外使用:
注意:這里
Sequential也有參數(shù)prefix,是可以自己指定名稱的,不指定的話就叫Sequential
net = gluon.nn.Sequential() with net.name_scope(): net.add(gluon.nn.Dense(20)) net.add(gluon.nn.Dense(20)) print(net.prefix) print(net[0].prefix) print(net[1].prefix) sequential0_ sequential0_dense0_ sequential0_dense1_
gluon.model_zoo也一樣
net = gluon.nn.Sequential() with net.name_scope(): net.add(gluon.model_zoo.vision.alexnet(pretrained=True)) net.add(gluon.model_zoo.vision.alexnet(pretrained=True)) print(net.prefix, net[0].prefix, net[1].prefix) sequential1_ sequential1_alexnet0_ sequential1_alexnet1_
保存和載入
由于model0和model1有不同的前綴,所以它們的參數(shù)是有不同名字的:
print(model0.collect_params(), '\n') print(model1.collect_params()) model0_ ( Parameter model0_dense0_weight (shape=(20L, 20L), dtype=<type 'numpy.float32'>) Parameter model0_dense0_bias (shape=(20L,), dtype=<type 'numpy.float32'>) Parameter model0_dense1_weight (shape=(20L, 20L), dtype=<type 'numpy.float32'>) Parameter model0_dense1_bias (shape=(20L,), dtype=<type 'numpy.float32'>) Parameter model0_mydense_weight (shape=(20L, 20L), dtype=<type 'numpy.float32'>) Parameter model0_mydense_bias (shape=(20L,), dtype=<type 'numpy.float32'>) ) model1_ ( Parameter model1_dense0_weight (shape=(20, 0), dtype=<type 'numpy.float32'>) Parameter model1_dense0_bias (shape=(20,), dtype=<type 'numpy.float32'>) Parameter model1_dense1_weight (shape=(20, 0), dtype=<type 'numpy.float32'>) Parameter model1_dense1_bias (shape=(20,), dtype=<type 'numpy.float32'>) Parameter model1_mydense_weight (shape=(20, 0), dtype=<type 'numpy.float32'>) Parameter model1_mydense_bias (shape=(20,), dtype=<type 'numpy.float32'>) )
若你嘗試將model0的參數(shù)載入到model1中,你將會(huì)得到一個(gè)名稱不匹配的錯(cuò)誤
model0.collect_params().save('model.params')
try:
model1.collect_params().load('model.params', mx.cpu())
except Exception as e:
print(e)
Parameter 'model1_dense0_weight' is missing in file 'model.params', which contains parameters: 'model0_mydense_weight', 'model0_dense1_bias', 'model0_dense1_weight', 'model0_dense0_weight', 'model0_dense0_bias', 'model0_mydense_bias'. Please make sure source and target networks have the same prefix.
為了解決這個(gè)問題,我們使用save_parameters/load_parameters而不是 collect_params 和save/load. save_parameters。使用模型結(jié)構(gòu)而非參數(shù)名稱來匹配參數(shù)。
model0.save_parameters('model.params')
model1.load_parameters('model.params')
print(mx.nd.load('model.params').keys())
['dense0.bias', 'mydense.bias', 'dense1.bias', 'dense1.weight', 'dense0.weight', 'mydense.weight']
替換網(wǎng)絡(luò)中的block并進(jìn)行fine-turning
有時(shí)需要加載一些預(yù)訓(xùn)練的模型,并替換其中某些block并進(jìn)行fine-turning。
For example, the alexnet in model zoo has 1000 output dimensions, but maybe you only have 100 classes in your application.
例如,alexnet有1000個(gè)輸出維度但你只有100類。
我們首先載入預(yù)訓(xùn)練的AlexNet
- 在Gluon Model Zoo,所有圖像分類模型的格式都是特征提取層叫
features,輸出層叫output. - 注意到輸出層是一個(gè)dense block,有1000個(gè)維度的輸出
alexnet = gluon.model_zoo.vision.alexnet(pretrained=True) print(alexnet.output) print(alexnet.output.prefix) Dense(4096 -> 1000, linear) alexnet0_dense2_
改變輸出為100維,使用一個(gè)新block替換它
with alexnet.name_scope(): alexnet.output = gluon.nn.Dense(100) alexnet.output.initialize() print(alexnet.output) print(alexnet.output.prefix) Dense(None -> 100, linear) alexnet0_dense3_
原文:http://mxnet.incubator.apache.org/versions/master/tutorials/gluon/naming.html
更多關(guān)于Python相關(guān)內(nèi)容可查看本站專題:《Python數(shù)學(xué)運(yùn)算技巧總結(jié)》、《Python圖片操作技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python入門與進(jìn)階經(jīng)典教程》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
- Python使用gluon/mxnet模塊實(shí)現(xiàn)的mnist手寫數(shù)字識(shí)別功能完整示例
- Python用imghdr模塊識(shí)別圖片格式實(shí)例解析
- Python基于whois模塊簡(jiǎn)單識(shí)別網(wǎng)站域名及所有者的方法
- python字符串編碼識(shí)別模塊chardet簡(jiǎn)單應(yīng)用
- 使用Python的OpenCV模塊識(shí)別滑動(dòng)驗(yàn)證碼的缺口(推薦)
- Python用sndhdr模塊識(shí)別音頻格式詳解
- python使用magic模塊進(jìn)行文件類型識(shí)別方法
- python實(shí)現(xiàn)識(shí)別相似圖片小結(jié)
- python實(shí)現(xiàn)人臉識(shí)別代碼
相關(guān)文章
nginx黑名單和django限速,最簡(jiǎn)單的防惡意請(qǐng)求方法分享
今天小編就為大家分享一篇nginx黑名單和django限速,最簡(jiǎn)單的防惡意請(qǐng)求方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-08-08
python操作redis數(shù)據(jù)庫的三種方法
這篇文章主要介紹了python操作redis數(shù)據(jù)庫的三種方法,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2020-09-09
pycharm調(diào)試功能如何實(shí)現(xiàn)跳到循環(huán)的某一步
這篇文章主要介紹了pycharm調(diào)試功能如何實(shí)現(xiàn)跳到循環(huán)的某一步問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
python 捕獲 shell/bash 腳本的輸出結(jié)果實(shí)例
下面小編就為大家?guī)硪黄猵ython 捕獲 shell/bash 腳本的輸出結(jié)果實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-01-01
python區(qū)塊鏈持久化和命令行接口實(shí)現(xiàn)簡(jiǎn)版
這篇文章主要為大家介紹了python區(qū)塊鏈持久化和命令行接口實(shí)現(xiàn)簡(jiǎn)版,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
Python標(biāo)準(zhǔn)模塊--ContextManager上下文管理器的具體用法
本篇文章主要介紹了Python標(biāo)準(zhǔn)模塊--ContextManager的具體用法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-11-11
OpenCV視頻流Python多線程處理方法詳細(xì)分析
為OpenCV是搞計(jì)算機(jī)視覺必須要掌握的基礎(chǔ),這篇文章主要給大家介紹了關(guān)于OpenCV視頻流多線程處理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11

