Mxnet(Gluon)模型导出和加载

使用Mxnet中的Gluoncv工具包训练模型,默认选项一般都只保存了参数文件,模型文件需要在测试的时候通过单独的程序文件加载,对于部署和测试来说有一定的麻烦。而Gluon中提供API可以将模型和参数一同保存,测试时不需要模型程序。我们以分类网络为例,介绍保存和加载模型的方法。

首先使用model_zoo加载模型和参数:

import gluoncv
from gluoncv.model_zoo import get_model
model_name = 'resnet50_v1d'
net = get_model(model_name, pretrained=True)

如果修改了网络并本地保存了参数,需要使用修改的模型程序加载net,并使用load_parameters加载本地参数:

net.load_parameters('./model/resnet50_v1d.params')

load_parameters中具有两个需要注意的参数:allowing_missing和ignore_extra,这两个参数负责提示参数文件和模型文件是否匹配。allowing_missing=True表示允许参数文件中保存的参数数量少于模型文件中的参数数量,也就是参数文件只保存了模型文件中一部分参数的值,可以用于构建复杂网络时,用多个参数文件分别初始化网络的一部分。ignore_extra=True表示允许参数文件中保存的参数数量多于模型文件中的参数数量,也就是,除了模型文件需要的参数外,参数文件还保存着一部分冗余参数。两个参数的灵活使用,可以实现复杂模型的构建和初始化,当两个参数都设置为True时,允许使用参数文件中的一部分数值去初始化模型文件中的一部分参数。

如果将定义网络时使用的是HybridSequential,则需要使用hybridize去activate,才能导出成json格式的模型文件。

net.hybridize()

hybridize()对网络模型具有一定的要求,官方说明文档中指出:“hybridize可以编译和优化HybridSequential实例中串联层的计算,只有继承HybridBlock类的层才会被优化计算,如果一个层只是继承自Block类而不是HybridBlock类,那么它将不会被优化。在一个HybridSequential实例调用hybridize函数后,它可以通过符号式编程提升计算性能,在调用hybridize函数后运行net(x)时,符号式程序已经得到,之后再运行net(x)时,Mxnet将不再访问Python代码,而是直接在C++后端执行符号式程序,这也是调用hybridize函数后模型性能会提升的一个原因。但是对于像少数asnumpy这样symbol所不支持的函数,以及想a+=b和a[:]=a+b这样的原地(in-place)操作,无法在hybrid_forward函数中使用并在调用hybridize后进行前向计算。”。除了上述注意事项外,有些Mxnet实现的命令编程和符号编程函数名不一样,也会报错,比如指数函数,在两种接口中使用的命名方式不同(分别使用了pow和power),而且也不支持索引切片操作,但是可以用函数slice_axis根据索引得到想要的数据块。

在导出模型文件和参数文件之前,需要进行一次前向传播:

img = mx.image.imread('./test_img/1.jpg')
transformed_img = gluoncv.data.transforms.presets.imagenet.transform_eval(img, resize_short=224)
output = net(transformed_img)

其实并不需要真实图像,使用全0或者全1的tensor也可以:

from mxnet import nd
data = nd.zeros(shape=(1,3,224,224))
output = net(data)

然后使用export在指定路径导出json和params文件,这句话在模型训练时也可以使用:

net.export('./json_resnet/resnet', epoch=0)

测试时,便可以直接加载模型和参数:

import mxnet as mx
from mxnet import gluon
ctx = mx.gpu(0)
net = gluon.SymbolBlock.imports(symbol_file='resnet-symbol.json', 
input_names=['data'], param_file='resnet-0000.params', ctx=ctx)

 

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值