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 中网络和参数的存取方式的更多相关文章

  1. CNN中减少网络的参数的三个思想

    CNN中减少网络的参数的三个思想: 1) 局部连接(Local Connectivity) 2) 权值共享(Shared Weights) 3) 池化(Pooling) 局部连接 局部连接是相对于全连 ...

  2. 在Docker容器中搭建MXNet/Gluon开发环境

    在这篇文章中没有直接使用MXNet官方提供的docker image,而是从一个干净的nvidia/cuda镜像开始,一步一步部署mxnet需要的相关软件环境,这样做是为了更加细致的了解mxnet的运 ...

  3. 关于Retrofit网络请求URL中含有可变参数的处理

    开题:在此默认各位看官对Retrofit.以及Okhttp已经有过一定的了解及应用,所以今天我们不谈基础入门的东西,今天我们谈在Retrofit请求接口管理类中URL参数含有动态参数的处理方式.一般我 ...

  4. mxnet(gluon) 实现DQN简单小例子

    参考文献 莫凡系列课程视频 增强学习入门之Q-Learning 关于增强学习的基本知识可以参考第二个链接,讲的挺有意思的.DQN的东西可以看第一个链接相关视频.课程中实现了Tensorflow和pyt ...

  5. Production环境中iptables常用参数配置

    production环境中iptables常用参数配置 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我相信在实际生产环境中有很多运维的兄弟跟我一样,很少用到iptables的这个 ...

  6. 用WIN7系统IIS的提示:数据库连接出错,请检查Conn.asp文件中的数据库参数设置

    我用科讯的从4.0开始,去年开始很少用科讯做新站了,今天拿来做一下,结果悲剧了,数据库路径老是不对,百度一番又一番的,,最后终于给度娘解决了.分享出来给遇到同样的问题的人. 用WIN7系统IIS的注意 ...

  7. JS中URL编码参数(UrlEncode)

    JS中URL编码参数(UrlEncode) 网上有很多文字作品写涉及在JS中呈现类似UrlEncode功能时都是自定义参数来呈现,其实JS中本身就有那样的参数.参数parameter由于用类似URL的 ...

  8. caffe 中的一些参数介绍

    转自:http://blog.csdn.net/cyh_24/article/details/51537709 solver.prototxt net: "models/bvlc_alexn ...

  9. VB.NET中网络编程所需组件WinHTTP的添加

    VB.NET中网络编程所需组件: WinHTTP组件:项目-->添加引用-->COM选项卡-->Microsoft WinHTTP Services,version 5.1--> ...

随机推荐

  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 ...

  2. helm笔记

    一.注意事项 1.values.yaml   中可以使用'#'号注释行,而/templates 下的文件不能用#号,如果要注释可以使用 {{/*  context  */}} 2.{{-    #忽略 ...

  3. SpringCloud学习心得—1.2—Eureka注册中心的密码认证、高可用的设置

      SpringCloud学习心得—1.2—Eureka注册中心的密码认证.高可用的设置 这是相关代码 链接 Eureka开启密码配置 添加依赖 <dependency> <grou ...

  4. 51nod 1720 祖玛

    吉诺斯在手机上玩祖玛的游戏.在这个游戏中,刚开始有n个石头排成一排,第i个石头的颜色是ci.游戏的目标是尽可能快的把所有石头都消掉. 每一秒钟,吉诺斯可以选择一段连续的子段,并且这个子段是回文,然后把 ...

  5. 【贪心】Allowance POJ 3040

    题目链接:http://poj.org/problem?id=3040 题目大意:你有n种不同面值的硬币,面值为vi的有bi个."硬币的面额均匀地分配下一个更大的面额",即下一个更 ...

  6. go函数类型的使用

    Go函数类型的使用 type myfunc func() string // 声明函数变量 func main() { fn := func() string { return "bbb&q ...

  7. mongodb 副本集的主的选举

    primary的选举依赖于各个实例的优先权重,默认权重都是1 复本集的主挑选权重最高的,权重一样的无法控制谁为主 设置各个实例的优先权重,挑选自己想要的实例为主,只有primary可以更改权重配置 c ...

  8. C# 可为空?及(??、?. )

    可空类型修饰符(?): 引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空. 例如:string str=null; 是正确的,int i=null; 编译器就会报错. 为了使值类型也 ...

  9. Distributed PostgreSQL on a Google Spanner Architecture – Storage Layer

    转自:https://blog.yugabyte.com/distributed-postgresql-on-a-google-spanner-architecture-storage-layer/ ...

  10. Linux工具[转]

    ref: https://github.com/linw7/Skill-Tree/blob/master/Linux%E5%B7%A5%E5%85%B7.md Linux工具 Linux下还是有很多超 ...