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


Posted in Python onDecember 18, 2019

本文实例讲述了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_

建议手动为顶层的model指定一个前缀,即model = Model(prefix=‘mymodel_'),以避免命名时可能出现的混淆。

相同的规则同样适用于像Sequential这类容器block.name_scope 既可以在__init__内使用,也可以在__init__ 外使用:

注意:这里Sequential也有参数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有不同的前缀,所以它们的参数是有不同名字的:

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的参数载入到model1中,你将会得到一个名称不匹配的错误

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.

为了解决这个问题,我们使用save_parameters/load_parameters而不是 collect_paramssave/load. save_parameters。使用模型结构而非参数名称来匹配参数。

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']

替换网络中的block并进行fine-turning

有时需要加载一些预训练的模型,并替换其中某些block并进行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个输出维度但你只有100类。

我们首先载入预训练的AlexNet

  • 在Gluon Model Zoo,所有图像分类模型的格式都是特征提取层叫 features ,输出层叫 output.
  • 注意到输出层是一个dense block,有1000个维度的输出
alexnet = gluon.model_zoo.vision.alexnet(pretrained=True)
print(alexnet.output)
print(alexnet.output.prefix)
Dense(4096 -> 1000, linear)
alexnet0_dense2_

改变输出为100维,使用一个新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

更多关于Python相关内容可查看本站专题:《Python数学运算技巧总结》、《Python图片操作技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python实现的飞速中文网小说下载脚本
Apr 23 Python
详解Python网络爬虫功能的基本写法
Jan 28 Python
Python的requests网络编程包使用教程
Jul 11 Python
Python聊天室程序(基础版)
Apr 01 Python
对Python中实现两个数的值交换的集中方法详解
Jan 11 Python
对python中字典keys,values,items的使用详解
Feb 03 Python
python+opencv实现摄像头调用的方法
Jun 22 Python
如何基于Python创建目录文件夹
Dec 31 Python
Python获取对象属性的几种方式小结
Mar 12 Python
Python Socketserver实现FTP文件上传下载代码实例
Mar 27 Python
使用Numpy对特征中的异常值进行替换及条件替换方式
Jun 08 Python
python3.7 openpyxl 在excel单元格中写入数据实例
Sep 01 Python
python turtle 绘制太极图的实例
Dec 18 #Python
Python使用gluon/mxnet模块实现的mnist手写数字识别功能完整示例
Dec 18 #Python
简单了解Python读取大文件代码实例
Dec 18 #Python
python 比较2张图片的相似度的方法示例
Dec 18 #Python
使用Python的Turtle库绘制森林的实例
Dec 18 #Python
python3 requests库实现多图片爬取教程
Dec 18 #Python
在notepad++中实现直接运行python代码
Dec 18 #Python
You might like
PHP通过串口实现发送短信
2015/07/08 PHP
PHP开发之归档格式phar文件概念与用法详解【创建,使用,解包还原提取】
2017/11/17 PHP
PHP+Ajax简单get验证操作示例
2019/03/02 PHP
让IE8支持DOM 2(不用框架!)
2009/12/31 Javascript
JavaScript 内置对象属性及方法集合
2010/07/04 Javascript
修改jQuery Validation里默认的验证方法
2012/02/14 Javascript
js通过地址栏给action传值(中文乱码全是问号)
2013/05/02 Javascript
jQuery获取和设置表单元素的方法
2014/02/14 Javascript
一个html5播放视频的video控件只支持android的默认格式mp4和3gp
2014/05/08 Javascript
JavaScript和CSS交互的方法汇总
2014/12/02 Javascript
setinterval()与clearInterval()JS函数的调用方法
2015/01/21 Javascript
EasyUI实现二级页面的内容勾选的方法
2015/03/01 Javascript
前端学习笔记style,currentStyle,getComputedStyle的用法与区别
2016/05/28 Javascript
JS获取和修改元素样式的实例代码
2016/08/06 Javascript
jQuery查找节点方法完整实例
2016/09/13 Javascript
利用Node.js+Koa框架实现前后端交互的方法
2017/02/27 Javascript
JavaScript实现时间表动态效果
2017/07/15 Javascript
使用Vue制作图片轮播组件思路详解
2018/03/21 Javascript
Vue兼容ie9的问题全面解决方案
2018/06/19 Javascript
解决vue 打包发布去#和页面空白的问题
2018/09/04 Javascript
javascrpt密码强度校验函数详解
2020/03/18 Javascript
详解微信小程序入门从这里出发(登录注册、开发工具、文件及结构介绍)
2020/07/21 Javascript
PyTorch的自适应池化Adaptive Pooling实例
2020/01/03 Python
使用tensorboard可视化loss和acc的实例
2020/01/21 Python
Jupyter打开图形界面并画出正弦函数图像实例
2020/04/24 Python
学python最电脑配置有要求么
2020/07/05 Python
Python绘制数码晶体管日期
2021/02/19 Python
使用canvas实现黑客帝国数字雨效果
2020/01/02 HTML / CSS
YSL圣罗兰美妆俄罗斯官网:Yves Saint Lauret RU
2020/09/23 全球购物
什么是反射
2012/03/17 面试题
考试违纪检讨书
2014/02/02 职场文书
长征观后感
2015/06/09 职场文书
步步惊心观后感
2015/06/12 职场文书
收入证明怎么写
2015/06/12 职场文书
大学宣传委员竞选稿
2015/11/19 职场文书
闭幕词的写作格式与范文!
2019/06/24 职场文书