1. 概念说明
1.1 原理
表达式是一个延迟计算引擎,它提供如下功能:
(1)构造计算图
(2)加载、保存、修改计算图
(3)基于计算图进行计算(借助 MNN 推理引擎实现)
API 设计上使用”响应式编程”,修改输入的值之后,在对应的输出节点取值即可,没有显示的计算调用。
1.2 变量(VARP)
用户操作的数据类型为 VARP,可按Tensor去读取它的值,按保存时的方式不同,分成三类
1.2.1 Input
由 MNN.expr.placeholder 创建,或者加载模型而得,在保存时仅存储维度信息(shape),可以写入值
1.2.2 Const / Trainable
由 MNN.expr.const / trainable 创建,或者加载模型而得,在保存时存储数值,不能写入,只能读取
1.2.2 Function
非输入或者常量,一切由计算而得的变量,不能写入,在保存时存储与之相关的计算图
Function 变量可通过 fix_as_const / fix_as_input 调用转换为相应类型,转换时将值计算出来,并去除前置节点依赖。
2. 图管理
2.1 主要API
2.1.1 MNN.expr.save
输入:VARP 数组,文件名
功能:将一系列变量保存为 MNN 模型文件,若包含若干 Function 类型的变量,会保存它们的最小计算图。
2.1.2 MNN.expr.load_dict
输入模型文件名,将模型文件读取为 name-var 的字典模式。
2.1.3 MNN.expr.var.replace
2.2 示例
2.2.1 裁剪左半部分模型
import MNN.expr as F
vars = F.load_as_dict("Origin.mnn")
output = vars["D"]
F.save([output], "New.mnn")
3. 加载与运行模型
3.1 变量接口
3.1.1 信息查看与重置
- VARP.shape :返回形状信息(int数组)
- VARP.data_format:返回数据排列方式
- VARP.size:返回数据总长度
VARP.resize() : 输入形状信息(int 数组),修改变量的大小,仅对输入有效
3.1.2 输入输出
写: write ,传入等长数组,替换变量原有数据,仅对输入节点有效
- 读: read ,输出等长数组,必要时会进行计算
3.2 示例
```python import MNN.expr as F vars = F.load_as_dict(“model.mnn”) inputVar = vars[“input”]查看输入信息
print(inputVar.shape) print(inputVar.data_format)修改原始模型的 NC4HW4 输入为 NCHW,便于输入
if (inputVar.data_format == F.NC4HW4): inputVar.reorder(F.NCHW)写入数据
inputVar.write(numpy.ones([1, 3, 224, 224], dtype=”float32”).tolist())
查看中间结果的值
midVar = vars[‘mid’] print(midVar.shape)
切换布局便于查看结果
if (midVar.data_format == F.NC4HW4): midVar = F.convert(midVar, F.NCHW) print(midVar.read())
查看输出结果
outputVar = vars[‘output’] print(outputVar.shape)
切换布局便于查看结果
if (outputVar.data_format == F.NC4HW4): outputVar = F.convert(outputVar, F.NCHW) print(outputVar.read())
将关注的变量数值保存为 mnn 模型,可用 MNNDump2Json 打印查看
midVar.fix_as_const() outputVar.fix_as_const()
F.save([midVar, outputVar], “outputs.mnn”)
```