PS:要转载请注明出处,本人版权所有。
PS: 这个只是基于《我自己》的理解,
如果和你的原则及想法相冲突,请谅解,勿喷。
环境说明
时间:2018.07.18
ncnn master commit id:b3e24cafc37483dcc97ee61e6f0f6ff1b094300e
前言
最近一段时间全在ncnn这个框架上折腾,现在有一点空闲时间,对之前的东西做一个总结。这里主要是对ncnn的参数加载做一个简要的分析。
格式分析(主要基于其源码)
前置的一些内容
核心加载参数的代码如图所示:

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

分别是加载模型,和加载网络,以及前向计算。
model文件对应的param文件举例

虽然在load_model中,遍历每一层layer,其会调用基类或者当前类的load_model,这里和load_param唯一的区别是,某些layer没有任何参数,但是还是会调用一遍基类的load_model(是一个空函数)。
对于上图来说,Input 、Pooling 等层是没有任何参数的。但是Convolution层就有参数,在convolution.cpp中,就会实现一个具体的load_model方法覆盖父的load_model,其实现如下图:

基于上图的Convolution层分析
首先我们知道,在此层中,load_model 调用了mb.load加载具体的参数
这里的参数分为三类:
-
float32
相关读取如下:

-
float16
相关读取如下:

-
int8 的量化类型

这里重点介绍 int8的量化类型,其他的都是按照字节对齐的size进行读取
-
它会先读量化表(256的float数组)
-
然后读取量化表的索引
-
最后根据索引引索量化表,并建立mat数组,并返回
后记
对于不同的层,参数含义不太一样,若有需求,可针对分析。上文例子中,参数主要是卷积层的权重(weight),以及偏移量(blas)
参考文献
-
无

PS: 请尊重原创,不喜勿喷。
PS: 要转载请注明出处,本人版权所有。
PS: 有问题请留言,看到后我会第一时间回复。