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--> ...
随机推荐
- GAE相关
Google App Engine for Java是可以在Google托管服务器基础架构上托管和运行用户Web应用程序.出于安全原因,这些应用程序在沙盒环境中执行. 沙箱本身由两层组成.第一层是GA ...
- 【转】解决maven无法加载本地lib/下的jar包问题(程序包XXX不存在)
原文链接:https://www.cnblogs.com/adeng/p/7096484.html 这次一个项目用到maven编译,我在本地开发的时候jar包都是放在WEB-INF/lib目录下,通过 ...
- 实用mysql数据库命令
连接:mysql -h主机地址 -u用户名 -p用户密码 (注:u与root可以不用加空格,其它也一样)断开:exit (回车) 创建授权:grant select on 数据库.* to 用户名@登 ...
- 《Exception》第五次作业:项目需求分析改进与系统设计
一.项目基本介绍 项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 作业链接地址 团队名称 Exception 作业学习目标 1掌握面向对象需求分析方法:2.学习软件系统总 ...
- java中List集合
List集合是一个元素有序可以重复的集合,集合中每个元素都有其对应的顺序索引.List集合允许使用重复集合,前面博客写到Set不允许有重复集合.List集合可以通过索引来访问指定位置的集合元素. Li ...
- 关于JDBCUtils的模糊查询问题
1.JDBCUtils的模糊查询问题解决方法 数据库jdbc工具类的模糊查询最核心的就是用like %内容%,但是我们对于界面输入进来的东西都是用?来替代的,那么就代表着我们不能吧%%写在问号旁边.否 ...
- WSGI原理
web_server: import socket import time import multiprocessing import re import mini_frame class WSGIS ...
- SpringBoot整合Gson(转)
第一步:移除jackson依赖 参考代码 <dependency> <groupId>org.springframework.boot</groupId> < ...
- go条件变量同步机制
sync.Cond代表条件变量,需要配置锁才能有用 package main import ( "fmt" "runtime" "sync" ...
- 如何识别和解决SQL Server中的热闩锁(PAGELATCH_EX)
描述 在SQL Server中,内部闩锁体系结构可在SQL操作期间保护内存.通过页面上的读写操作,可以确保内存结构的一致性.从根本上讲,它具有两个类:缓冲区锁存器和非缓冲区锁存器,它们在SQL Eng ...