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中的__new__与__init__魔术方法理解笔记
Nov 08 Python
Python中使用md5sum检查目录中相同文件代码分享
Feb 02 Python
简单介绍Python的Django框架加载模版的方式
Jul 20 Python
Django csrf 两种方法设置form的实例
Feb 03 Python
python multiprocessing模块用法及原理介绍
Aug 20 Python
python对文件的操作方法汇总
Feb 28 Python
python GUI库图形界面开发之PyQt5选项卡控件QTabWidget详细使用方法与实例
Mar 01 Python
Python基于time模块表示时间常用方法
Jun 18 Python
python virtualenv虚拟环境配置与使用教程详解
Jul 13 Python
Python 通过正则表达式快速获取电影的下载地址
Aug 17 Python
python爬虫判断招聘信息是否存在的实例代码
Nov 20 Python
pytorch中的 .view()函数的用法介绍
Mar 17 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 将bmp图片转为jpg等其他任意格式的图片
2009/06/29 PHP
IP138 IP地址查询小偷实现代码
2010/02/15 PHP
PHP开发中常用的十个代码样例
2016/02/02 PHP
yii2 commands模式以及配置crontab定时任务的方法
2017/08/19 PHP
Laravel 实现Controller向blade前台模板赋值的四种方式小结
2019/10/22 PHP
JavaScript 应用技巧集合[推荐]
2009/08/30 Javascript
jValidate 基于jQuery的表单验证插件
2009/12/12 Javascript
EasyUI 中 MenuButton 的使用方法
2012/07/14 Javascript
JavaScript高级程序设计(第3版)学习笔记11 内建js对象
2012/10/11 Javascript
js判断背景图片是否加载成功使用img的width实现
2013/05/29 Javascript
jquery的相对父元素和相对文档定位示例代码
2013/08/02 Javascript
js处理表格对table进行修饰
2014/05/26 Javascript
jQuery实现contains方法不区分大小写的方法
2015/02/13 Javascript
前端面试知识点锦集(JavaScript篇)
2016/12/28 Javascript
用 js 的 selection range 操作选择区域内容和图片
2017/04/18 Javascript
node.js + socket.io 实现点对点随机匹配聊天
2017/06/30 Javascript
thinkjs 文件上传功能实例代码
2017/11/08 Javascript
Ant Design Vue 添加区分中英文的长度校验功能
2020/01/21 Javascript
pandas中去除指定字符的实例
2018/05/18 Python
django中瀑布流写法实例代码
2019/10/14 Python
Python导入数值型Excel数据并生成矩阵操作
2020/06/09 Python
利用PyTorch实现VGG16教程
2020/06/24 Python
Python高并发解决方案实现过程详解
2020/07/31 Python
python tkinter的消息框模块(messagebox,simpledialog)
2020/11/07 Python
Selenium关闭INFO:CONSOLE提示的解决
2020/12/07 Python
实例讲解CSS3中的border-radius属性
2015/08/18 HTML / CSS
FOREO斐珞尔官方旗舰店:LUNA露娜洁面仪
2018/03/11 全球购物
Perfume’s Club美国官网:西班牙第一家在线美容店
2020/06/10 全球购物
大学同学聚会邀请函
2014/01/19 职场文书
生产操作工岗位职责
2014/09/16 职场文书
员工工作能力评语
2014/12/31 职场文书
李强优秀员工观后感
2015/06/16 职场文书
严以用权学习心得体会
2016/01/12 职场文书
创业计划书之冷饮店
2019/09/27 职场文书
oracle DGMGRL ORA-16603报错的解决方法(DG Broker)
2021/04/06 Oracle
python字符串的多行输出的实例详解
2021/06/08 Python