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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011728480/article/details/81095268

#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加载具体的参数
这里的参数分为三类:
1 float32
相关读取如下:
这里写图片描述
2 float16
相关读取如下:
这里写图片描述
3 int8 的量化类型
这里写图片描述

这里重点介绍 int8的量化类型,其他的都是按照字节对齐的size进行读取
它会先读量化表(256的float数组)
然后读取量化表的索引
最后根据索引引索量化表,并建立mat数组,并返回

总结

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

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

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

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

猜你喜欢

转载自blog.csdn.net/u011728480/article/details/81095268