MxNet预训练模型到Pytorch模型的转换方式

 更新时间:2020年05月25日 14:21:32   作者:sparkexpert  
这篇文章主要介绍了MxNet预训练模型到Pytorch模型的转换方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

预训练模型在不同深度学习框架中的转换是一种常见的任务。今天刚好DPN预训练模型转换问题,顺手将这个过程记录一下。

核心转换函数如下所示:

def convert_from_mxnet(model, checkpoint_prefix, debug=False):
 _, mxnet_weights, mxnet_aux = mxnet.model.load_checkpoint(checkpoint_prefix, 0)
 remapped_state = {}
 for state_key in model.state_dict().keys():
  k = state_key.split('.')
  aux = False
  mxnet_key = ''
  if k[0] == 'features':
   if k[1] == 'conv1_1':
    # input block
    mxnet_key += 'conv1_x_1__'
    if k[2] == 'bn':
     mxnet_key += 'relu-sp__bn_'
     aux, key_add = _convert_bn(k[3])
     mxnet_key += key_add
    else:
     assert k[3] == 'weight'
     mxnet_key += 'conv_' + k[3]
   elif k[1] == 'conv5_bn_ac':
    # bn + ac at end of features block
    mxnet_key += 'conv5_x_x__relu-sp__bn_'
    assert k[2] == 'bn'
    aux, key_add = _convert_bn(k[3])
    mxnet_key += key_add
   else:
    # middle blocks
    if model.b and 'c1x1_c' in k[2]:
     bc_block = True # b-variant split c-block special treatment
    else:
     bc_block = False
    ck = k[1].split('_')
    mxnet_key += ck[0] + '_x__' + ck[1] + '_'
    ck = k[2].split('_')
    mxnet_key += ck[0] + '-' + ck[1]
    if ck[1] == 'w' and len(ck) > 2:
     mxnet_key += '(s/2)' if ck[2] == 's2' else '(s/1)'
    mxnet_key += '__'
    if k[3] == 'bn':
     mxnet_key += 'bn_' if bc_block else 'bn__bn_'
     aux, key_add = _convert_bn(k[4])
     mxnet_key += key_add
    else:
     ki = 3 if bc_block else 4
     assert k[ki] == 'weight'
     mxnet_key += 'conv_' + k[ki]
  elif k[0] == 'classifier':
   if 'fc6-1k_weight' in mxnet_weights:
    mxnet_key += 'fc6-1k_'
   else:
    mxnet_key += 'fc6_'
   mxnet_key += k[1]
  else:
   assert False, 'Unexpected token'
 
  if debug:
   print(mxnet_key, '=> ', state_key, end=' ')
 
  mxnet_array = mxnet_aux[mxnet_key] if aux else mxnet_weights[mxnet_key]
  torch_tensor = torch.from_numpy(mxnet_array.asnumpy())
  if k[0] == 'classifier' and k[1] == 'weight':
   torch_tensor = torch_tensor.view(torch_tensor.size() + (1, 1))
  remapped_state[state_key] = torch_tensor
 
  if debug:
   print(list(torch_tensor.size()), torch_tensor.mean(), torch_tensor.std())
 
 model.load_state_dict(remapped_state)
 
 return model

从中可以看出,其转换步骤如下:

(1)创建pytorch的网络结构模型,设为model

(2)利用mxnet来读取其存储的预训练模型,得到mxnet_weights;

(3)遍历加载后模型mxnet_weights的state_dict().keys

(4)对一些指定的key值,需要进行相应的处理和转换

(5)对修改键名之后的key利用numpy之间的转换来实现加载。

为了实现上述转换,首先pip安装mxnet,现在新版的mxnet安装还是非常方便的。

第二步,运行转换程序,实现预训练模型的转换。

可以看到在相当的文件夹下已经出现了转换后的模型。

以上这篇MxNet预训练模型到Pytorch模型的转换方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • pip升级pip3的快速方法指南

    pip升级pip3的快速方法指南

    使用python时经常使用到pip命令,可以方便安装python的各种第三方库这篇文章主要给大家介绍了关于pip升级pip3的快速方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • python 数字转换为日期的三种实现方法

    python 数字转换为日期的三种实现方法

    在Python中,我们经常需要处理日期和时间,本文主要介绍了python 数字转换为日期的三种实现方法,包含datetime模块,strftime方法及pandas库,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • Python3 pandas 操作列表实例详解

    Python3 pandas 操作列表实例详解

    这篇文章主要介绍了Python3 pandas 操作列表实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • 浅谈keras中自定义二分类任务评价指标metrics的方法以及代码

    浅谈keras中自定义二分类任务评价指标metrics的方法以及代码

    这篇文章主要介绍了浅谈keras中自定义二分类任务评价指标metrics的方法以及代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • Python虚拟机栈帧对象及获取源码学习

    Python虚拟机栈帧对象及获取源码学习

    这篇文章主要为大家介绍了Python虚拟机栈帧对象及获取源码学习,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • Python写的Discuz7.2版faq.php注入漏洞工具

    Python写的Discuz7.2版faq.php注入漏洞工具

    这篇文章主要介绍了Python写的Discuz7.2版faq.php注入漏洞工具,全自动的一款注入工具,针对Discuz7.2版,需要的朋友可以参考下
    2014-08-08
  • python使用xlsx和pandas处理Excel表格的操作步骤

    python使用xlsx和pandas处理Excel表格的操作步骤

    python的神器pandas库就可以非常方便地处理excel,csv,矩阵,表格 等数据,下面这篇文章主要给大家介绍了关于python使用xlsx和pandas处理Excel表格的操作步骤,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • 在Python中使用循环进行迭代的方法小结

    在Python中使用循环进行迭代的方法小结

    Python中的循环结构是编程中的重要组成部分,本文详细介绍这两种循环的使用方法、它们之间的差异以及如何选择合适的循环类型,此外,我还将介绍一些高级循环控制技巧,如列表推导式和生成器表达式,感兴趣的朋友一起看看吧
    2024-01-01
  • Python中py文件引用另一个py文件变量的方法

    Python中py文件引用另一个py文件变量的方法

    下面小编就为大家分享一篇Python中py文件引用另一个py文件变量的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • python基于三阶贝塞尔曲线的数据平滑算法

    python基于三阶贝塞尔曲线的数据平滑算法

    这篇文章主要介绍了python基于三阶贝塞尔曲线的数据平滑算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12

最新评论