MXNet/Gluon 中网络和参数的存取方式
https://blog.csdn.net/caroline_wendy/article/details/80494120
Gluon是MXNet的高层封装,网络设计简单易用,与Keras类似。随着深度学习技术的普及,类似于Gluon这种,高层封装的深度学习框架,被越来越多的开发者接受和使用。
在开发深度学习算法时,必然会涉及到网络(symbol)和参数(params)的存储与加载,Gluon模型的存取接口,与MXNet略有不同。在MXNet体系中,网络与参数是分离的,这样的设计,有利于迁移学习(Transfer Learning)中的参数复用。
本文分别介绍MXNet和Gluon中网络和参数的存取方式。
在MXNet体系中,net = symbol + params。
本文地址:https://blog.csdn.net/caroline_wendy/article/details/80494120
MXNet
MXNet中网络和参数是分离的,这两部分需要分别存储和读取。
网络
MXNet的网络(symbol)使用json格式存储:
创建填充变量data,即mx.sym.var('data');
将填充变量置入网络,即net_triplet(vd);
获取填充之后的网络结构,转换为json对象,即vnet.tojson();
将json对象写入文件,即write_line(json_file, sym_json)。
则,最终的json文件就是MXNet的网络结构。
实现:
vd = mx.sym.var('data')
vnet = net_triplet(vd)
sym_json = vnet.tojson()
json_file = os.path.join(ROOT_DIR, 'experiments', 'sym.json')
write_line(json_file, sym_json)
1
2
3
4
5
或
sym_json = net_triplet(mx.sym.var('data')).tojson()
json_file = os.path.join(ROOT_DIR, 'experiments', 'sym.json')
write_line(json_file, sym_json)
1
2
3
这种存储网络的方式,同时适用于MXNet和Gluon网络。
参数
MXNet的参数(params)存储比较简单:
在训练过程中,自动调整网络的参数;
在训练过程中,调用网络的save_params()函数,即可保存参数。
在参数的文件名中,加入epoch和准确率,有利于参数选择。
实现:
params_path = os.path.join(
ROOT_DIR, self.config.cp_dir,
"triplet_loss_model_%s_%s.params" % (epoch, '%0.4f' % dist_acc)
) # 模型文件位置
self.model.save_params(params_path) # 存储模型
1
2
3
4
5
读取
MXNet网络和参数的加载方式:
网络:调用SymbolBlock()创建网络,output是已加载的Json结构,input是填充的data变量;
参数:调用load_params()加载参数,params是参数路径,ctx是上下文,即CPU或GPU环境。
实现:
sym = os.path.join(ROOT_DIR, self.config.cp_dir, "sym.json")
params = os.path.join(ROOT_DIR, self.config.cp_dir, "triplet_loss_model_88_0.9934.params")
self.model = gluon.nn.SymbolBlock(outputs=mx.sym.load(sym), inputs=mx.sym.var('data'))
self.model.load_params(params, ctx=ctx)
1
2
3
4
Gluon
Gluon对比与MXNet,提供更加高层的存取方法,简单高效。
存储
除了MXNet的存储方式之外,Gluon网络提供特定的export()方法,同时支持导出网络和参数:
输入:path是文件前缀;epoch是epoch数,支持训练中多次保存;
输出:[前缀]-symbol.json的网络;[前缀]-[epoch 4位].params的参数;
实现:
symbol_file = os.path.join(ROOT_DIR, self.config.cp_dir, 'triplet-net')
self.model.export(path=symbol_file, epoch=epoch) # gluon的export
1
2
注意:export()方法只能位于训练阶段,不能位于设计阶段。
读取
Gluon支持通过文件前缀(即export()的输出)的方式,加载网络与参数:
load_checkpoint(),读取前缀数据:
输入:prefix是前缀,epoch是epoch数;
输出:sym是网络,arg_params是权重参数,aux_params是辅助状态;
SymbolBlock(),设置网络结构,与MXNet类似:
outputs:已加载的Json结构;
inputs:填充的data变量;
设置collect_params()参数,区分:
权重参数,arg_params;
辅助状态,net_params;
当加载完成网络和参数之后,就完成了Gluon模型的创建。
实现:
prefix = os.path.join(ROOT_DIR, self.config.cp_dir, "triplet-net") # export导出的前缀
sym, arg_params, aux_params = mx.model.load_checkpoint(prefix=prefix, epoch=5)
net = gluon.nn.SymbolBlock(outputs=sym, inputs=mx.sym.var('data')) # 加载网络结构
# 设置网络参数
net_params = net.collect_params()
for param in arg_params:
if param in net_params:
net_params[param]._load_init(arg_params[param], ctx=ctx)
for param in aux_params:
if param in net_params:
net_params[param]._load_init(aux_params[param], ctx=ctx)
1
2
3
4
5
6
7
8
9
10
11
错误
当出现如下错误时,即表示网络与参数的前缀不一致:
AssertionError: Parameter 'net_conv0_weight' is missing in file 'xxxx.params',
which contains parameters: 'dense0_bias', ..., 'batchnorm2_gamma'.
Please make sure source and target networks have the same prefix.
1
2
3
也就是网络中的单元名称与参数中的单元名称不同,前缀不同。
解决方案:按照参数中的前缀,统一设置prefix即可,没有前缀则设置为空字符串,如:
net_triplet = HybridSequential(prefix='')
1
因为,参数训练较慢,而网络容易修改,因此,优先修改网络的参数名称。
MXNet网络的存取方式,也可以用于Gluon网络,即Gluon是兼容MXNet的。在MXNet的基础上,Gluon还在不断地迭代和完善中,期待更多简洁的接口,降低深度学习的开发门槛,All with AI。
OK, that’s all! Enjoy it!
---------------------
作者:SpikeKing
来源:CSDN
原文:https://blog.csdn.net/caroline_wendy/article/details/80494120
版权声明:本文为博主原创文章,转载请附上博文链接!
MXNet/Gluon 中网络和参数的存取方式的更多相关文章
- CNN中减少网络的参数的三个思想
CNN中减少网络的参数的三个思想: 1) 局部连接(Local Connectivity) 2) 权值共享(Shared Weights) 3) 池化(Pooling) 局部连接 局部连接是相对于全连 ...
- 在Docker容器中搭建MXNet/Gluon开发环境
在这篇文章中没有直接使用MXNet官方提供的docker image,而是从一个干净的nvidia/cuda镜像开始,一步一步部署mxnet需要的相关软件环境,这样做是为了更加细致的了解mxnet的运 ...
- 关于Retrofit网络请求URL中含有可变参数的处理
开题:在此默认各位看官对Retrofit.以及Okhttp已经有过一定的了解及应用,所以今天我们不谈基础入门的东西,今天我们谈在Retrofit请求接口管理类中URL参数含有动态参数的处理方式.一般我 ...
- mxnet(gluon) 实现DQN简单小例子
参考文献 莫凡系列课程视频 增强学习入门之Q-Learning 关于增强学习的基本知识可以参考第二个链接,讲的挺有意思的.DQN的东西可以看第一个链接相关视频.课程中实现了Tensorflow和pyt ...
- Production环境中iptables常用参数配置
production环境中iptables常用参数配置 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我相信在实际生产环境中有很多运维的兄弟跟我一样,很少用到iptables的这个 ...
- 用WIN7系统IIS的提示:数据库连接出错,请检查Conn.asp文件中的数据库参数设置
我用科讯的从4.0开始,去年开始很少用科讯做新站了,今天拿来做一下,结果悲剧了,数据库路径老是不对,百度一番又一番的,,最后终于给度娘解决了.分享出来给遇到同样的问题的人. 用WIN7系统IIS的注意 ...
- JS中URL编码参数(UrlEncode)
JS中URL编码参数(UrlEncode) 网上有很多文字作品写涉及在JS中呈现类似UrlEncode功能时都是自定义参数来呈现,其实JS中本身就有那样的参数.参数parameter由于用类似URL的 ...
- caffe 中的一些参数介绍
转自:http://blog.csdn.net/cyh_24/article/details/51537709 solver.prototxt net: "models/bvlc_alexn ...
- VB.NET中网络编程所需组件WinHTTP的添加
VB.NET中网络编程所需组件: WinHTTP组件:项目-->添加引用-->COM选项卡-->Microsoft WinHTTP Services,version 5.1--> ...
随机推荐
- The Essential Burp Suite
OK we have download teh burp suite .let's begin start the tool 1.if we want to use the total mem ...
- helm笔记
一.注意事项 1.values.yaml 中可以使用'#'号注释行,而/templates 下的文件不能用#号,如果要注释可以使用 {{/* context */}} 2.{{- #忽略 ...
- SpringCloud学习心得—1.2—Eureka注册中心的密码认证、高可用的设置
SpringCloud学习心得—1.2—Eureka注册中心的密码认证.高可用的设置 这是相关代码 链接 Eureka开启密码配置 添加依赖 <dependency> <grou ...
- 51nod 1720 祖玛
吉诺斯在手机上玩祖玛的游戏.在这个游戏中,刚开始有n个石头排成一排,第i个石头的颜色是ci.游戏的目标是尽可能快的把所有石头都消掉. 每一秒钟,吉诺斯可以选择一段连续的子段,并且这个子段是回文,然后把 ...
- 【贪心】Allowance POJ 3040
题目链接:http://poj.org/problem?id=3040 题目大意:你有n种不同面值的硬币,面值为vi的有bi个."硬币的面额均匀地分配下一个更大的面额",即下一个更 ...
- go函数类型的使用
Go函数类型的使用 type myfunc func() string // 声明函数变量 func main() { fn := func() string { return "bbb&q ...
- mongodb 副本集的主的选举
primary的选举依赖于各个实例的优先权重,默认权重都是1 复本集的主挑选权重最高的,权重一样的无法控制谁为主 设置各个实例的优先权重,挑选自己想要的实例为主,只有primary可以更改权重配置 c ...
- C# 可为空?及(??、?. )
可空类型修饰符(?): 引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空. 例如:string str=null; 是正确的,int i=null; 编译器就会报错. 为了使值类型也 ...
- Distributed PostgreSQL on a Google Spanner Architecture – Storage Layer
转自:https://blog.yugabyte.com/distributed-postgresql-on-a-google-spanner-architecture-storage-layer/ ...
- Linux工具[转]
ref: https://github.com/linw7/Skill-Tree/blob/master/Linux%E5%B7%A5%E5%85%B7.md Linux工具 Linux下还是有很多超 ...