热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Gluonparameters和Blocks命名

API:gluon中每个Parameters或者Block都有前缀prefix,Parameters的名字由用户指定,Block的名字可以由用户指定或自动生成。from__futu

API:gluon中每个Parameters或者Block都有前缀prefix,Parameters的名字由用户指定,Block的名字可以由用户指定或自动生成。


from __future__ import print_function
import mxnet as mx
from mxnet import gluon

 

Naming Blocks

创建Block时可以手动施加前缀:


mydense = gluon.nn.Dense(100, prefix=mydense_)
print(mydense.prefix)

mydense_

 

当不给定前缀时,gluon会自动生成:


dense0 = gluon.nn.Dense(100)
print(dense0.prefix)

dense0_

 

当创建更多同类型的Blocks时,会自动递增前缀名以免冲突:


dense1 = gluon.nn.Dense(100)
print(dense1.prefix)

dense1_

 

Naming Parameters

Block中的参数将通过在参数名称前加上块的前缀来命名:


print(dense0.collect_params())
dense0_ (
Parameter dense0_weight (shape
=(100, 0), dtype=numpy.float32>)
Parameter dense0_bias (shape
=(100,), dtype=numpy.float32>)
)

 


Name scopes

要管理嵌套Block的名称,每个Block都附加一个名称范围name_scope。在名称作用域内创建的所有块的名称前都会加上其父块的前缀。


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 = 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进行实例化,则也会进行递增前缀以免冲突:


model1 = Model()
print(model1.prefix)
print(model1.dense0.prefix)
print(model1.dense1.prefix)
print(model1.mydense.prefix)


model1_
model1_dense0_
model1_dense1_
model1_mydense_

 

强烈推荐手动在最高level的Block指定前缀,例如:model=Molde(prefix=‘mymodel_’)。

以上原则适用于所有的container:

技术分享图片

并且name_scope可以用在__init__里,或者__init__外面,像这样:


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_

 


Saving and loading

由于上面定义的model0和model1前缀不同,所以其参数名字也不同:


print(model0.collect_params(), \n)
print(model1.collect_params())

model0_ (

Parameter model0_dense0_weight (shape
=(20L, 20L), dtype=numpy.float32>)
Parameter model0_dense0_bias (shape
=(20L,), dtype=numpy.float32>)
Parameter model0_dense1_weight (shape
=(20L, 20L), dtype=numpy.float32>)
Parameter model0_dense1_bias (shape
=(20L,), dtype=numpy.float32>)
Parameter model0_mydense_weight (shape
=(20L, 20L), dtype=numpy.float32>)
Parameter model0_mydense_bias (shape
=(20L,), dtype=numpy.float32>)
)
model1_ (
Parameter model1_dense0_weight (shape
=(20, 0), dtype=numpy.float32>)
Parameter model1_dense0_bias (shape
=(20,), dtype=numpy.float32>)
Parameter model1_dense1_weight (shape
=(20, 0), dtype=numpy.float32>)
Parameter model1_dense1_bias (shape
=(20,), dtype=numpy.float32>)
Parameter model1_mydense_weight (shape
=(20, 0), dtype=numpy.float32>)
Parameter model1_mydense_bias (shape
=(20,), dtype=numpy.float32>)
)

这时如果保存了model0的参数,想load进model1,那么由于名字不匹配,就可能导致load失败:


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_params 和 save/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]

 

 


Replacing Blocks from networks and fine-tuning

将预训练模型的output为1000类,改为100类的分类层:


alexnet = gluon.model_zoo.vision.alexnet(pretrained=True)
print(alexnet.output)
print(alexnet.output.prefix)


Dense(4096 -> 1000, linear)
alexnet0_dense2_

更改分类层:


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_

 


推荐阅读
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文讲述了作者通过点火测试男友的性格和承受能力,以考验婚姻问题。作者故意不安慰男友并再次点火,观察他的反应。这个行为是善意的玩人,旨在了解男友的性格和避免婚姻问题。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
author-avatar
k57784506
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有