第 3 章:NCNN 模型解析
1. Param 模型文件解析
我们先来分析一下 NCNN 的 .param
文件,这是一个文本文件,例如:
txt
7767517
3 3
Input input 0 1 data 0=4 1=4 2=1
InnerProduct ip 1 1 data fc 0=10 1=1 2=80
Softmax softmax 1 1 fc prob 0=0
第一行只有一个数,被称为 魔数(Magic Number),大致可以理解为文件类型识别码,就是说只要是 NCNN 的 .param
文件第一行一定是 7767517
。
什么是魔数
ELF 文件头会写入一个魔数,检查这个数和自己预想的是否一致可以判断文件是否损坏。在缓冲区数组旁放一个魔数,这种做法被称为 金丝雀测试(Canary Testing),通过检查是否一致可检测缓冲区溢出攻击。关于魔数的详细解释和作用可以参考网络更多资料。
第二行有两个数,分别是层行的数量,和 Blob 的数量。
其实 .param
文件从第三行开始每一行都是一层,也就是说层数是该文件非空行数减 2。Blob 的数量通常大于等于层数。
从第三行开始,文件的内容有固定格式,每一行都是一层,按照下面的格式确定:
层类型 | 层名字 | 输入 Blob 数量 | 输出 Blob 数量 | 输入 Blob | 输出 Blob | 参数字典 |
---|
参数字典使用 的格式,用空格隔开,一个参数如果是向量则使用逗号区分每个数。对于不同的层类型,参数字典的含义也不同:
层类型 | 层类型译名 | 参数含义 | 举例 |
---|---|---|---|
Input | 输入层 | [宽度, 高度, 通道数] | 0=227 1=227 2=3 |
参考
[1] https://github.com/Tencent/ncnn/wiki/param-and-model-file-structure
[2] https://github.com/Tencent/ncnn/wiki/operation-param-weight-table