1. 概念说明

1.1 原理

表达式是一个延迟计算引擎,它提供如下功能:
(1)构造计算图
(2)加载、保存、修改计算图
(3)基于计算图进行计算(借助 MNN 推理引擎实现)

API 设计上使用”响应式编程”,修改输入的值之后,在对应的输出节点取值即可,没有显示的计算调用。
image.png

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 裁剪左半部分模型

image.png

  1. import MNN.expr as F
  2. vars = F.load_as_dict("Origin.mnn")
  3. output = vars["D"]
  4. 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”)

```