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--> ...
随机推荐
- Analysis of Autherntication Protocol with Scyther :Case Study ---补充整理
1.Needham-Schroeder public Key Protocol (基于非对称的加密协议) the Protocol's authors are Roger NeedHam and Mi ...
- mysql5.7切换导致gtid不一致
今天在公司的工程环境中做了个案例,手动切换关闭主库的mysql服务,从库上升为主库之后,发现主库处于read_only状态,通过高可用的组件观察了剩余主从库的alive以及delay的状态发现均正常. ...
- Spring Boot+STOMP解决消息乱序问题
当我们使用Spring Boot+websocket进行前后端进行通信时,我们需要注意:服务器可以随时向客户端发送消息.默认的情况下,不保证:服务器发送的消息与到达客户端的消息的顺序是一致的.可能先发 ...
- SpringCloud组件相关
一.前言 原文地址:https://mp.weixin.qq.com/s/mwn2X0G9UgUDz1sgGgL1mA 认识我的朋友可能都知道我这阵子去实习啦,去的公司说是用SpringCloud(但 ...
- maven的使用和环境搭建
请在博客分类的未分类中找到这篇文章
- java中split函数参数特殊字符的处理(转义),如:"." 、"\"、"|"
内容介绍 本文主要介绍java中特殊字符做为split函数的参数,如:"." ."\"."|",双引号等,不能正确分隔源字符串的处理方法. ...
- ascii、unicode、utf-8、gbk 区别?
发展史: https://www.cnblogs.com/houxt/p/11250878.html python2内容进行编码(默认ascii),而python3对内容进行编码的默认为utf-8. ...
- codepush安装
https://github.com/lisong/code-push-server/blob/master/docs/README.md =====> 安装mysql下载mysql yum r ...
- nowcoder73E 白兔的刁难 单位根反演+NTT
感觉很套路? #include <bits/stdc++.h> #define ll long long #define setIO(s) freopen(s".in" ...
- CF19D Points 平衡树
题意:支持插入/删除点 $(x,y)$,查询一个点右上方横坐标与之最接近的点坐标. 我们可以对于每一个操作过的横坐标都开一个 $set$,然后再开一个平衡树,维护每个横坐标上最大的纵坐标. 然后查询点 ...