《TencentNCNN系列》 之bin文件(网络参数文件)格式分析


PS:要转载请注明出处,本人版权所有。

PS: 这个只是基于《我自己》的理解,
如果和你的原则及想法相冲突,请谅解,勿喷。

环境说明

  时间:2018.07.18

  ncnn master commit id:b3e24cafc37483dcc97ee61e6f0f6ff1b094300e

前言


  最近一段时间全在ncnn这个框架上折腾,现在有一点空闲时间,对之前的东西做一个总结。这里主要是对ncnn的参数加载做一个简要的分析。





格式分析(主要基于其源码)




前置的一些内容

  核心加载参数的代码如图所示:

rep_img

  这里靠一个for循环遍历所有在load_param中已经注册好的网络,每个特殊的网络继承于Layer基类,此类有以下的重要接口:

rep_img

  分别是加载模型,和加载网络,以及前向计算。



model文件对应的param文件举例
rep_img

  虽然在load_model中,遍历每一层layer,其会调用基类或者当前类的load_model,这里和load_param唯一的区别是,某些layer没有任何参数,但是还是会调用一遍基类的load_model(是一个空函数)。

  对于上图来说,Input 、Pooling 等层是没有任何参数的。但是Convolution层就有参数,在convolution.cpp中,就会实现一个具体的load_model方法覆盖父的load_model,其实现如下图:

rep_img


基于上图的Convolution层分析

  首先我们知道,在此层中,load_model 调用了mb.load加载具体的参数

  这里的参数分为三类:

  1. float32

  相关读取如下:

rep_img
  1. float16
      相关读取如下:

rep_img
  1. int8 的量化类型

rep_img

  这里重点介绍 int8的量化类型,其他的都是按照字节对齐的size进行读取

  • 它会先读量化表(256的float数组)

  • 然后读取量化表的索引

  • 最后根据索引引索量化表,并建立mat数组,并返回





后记


  对于不同的层,参数含义不太一样,若有需求,可针对分析。上文例子中,参数主要是卷积层的权重(weight),以及偏移量(blas)

参考文献




打赏、订阅、收藏、丢香蕉、硬币,请关注公众号(攻城狮的搬砖之路)
qrc_img

PS: 请尊重原创,不喜勿喷。

PS: 要转载请注明出处,本人版权所有。

PS: 有问题请留言,看到后我会第一时间回复。


文章作者: Sky
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Sky !
  目录