如何通过FlowOperator构建FlowGraph
功能介绍
用户使用创建好的FlowOperator节点,创建一个FlowGraph实例,并在FlowGraph中设置输入、输出,从而完成Graph构建。
使用FlowOperator衍生接口定义节点
- 包含的头文件。
1
#include "flow_graph/data_flow.h"
- 创建FlowOperator实例。
- FlowData
1 2
auto data0 = dflow::FlowData("Data0", 0); auto data1 = dflow::FlowData("Data1", 1);
- FlowNode
1
auto node0 = dflow::FlowNode("node0", 2, 1);
注意:图中的data名称和node名称必须唯一。
- FlowData
- 设置FlowOperator输入。
只有FlowNode类型的FlowOperator才需要设置输入。
设置FlowOperator输入:通过“SetInput”设置,例如:1 2 3
auto node0 = dflow::FlowNode("node0", 2, 1) // 创建FlowNode的FlowOperator实例 .SetInput(0, data0) // 设置FlowNode第一个输入为data0 .SetInput(1, data1); // 设置FlowNode第二个输入为data1
FlowOperator连接边表达
FlowOperator之间的连边为数据边。数据边用于指定FlowOperator的输入。数据边表达如下。
上图的示例代码和注释如下。
1 2 3 4 5 |
auto data0 = dflow::FlowData("Data0", 0); auto data1 = dflow::FlowData("Data1", 1); auto node0 = dflow::FlowNode("flow_node0", 2, 2).SetInput(0, data0).SetInput(1, data1); // FlowData只有一个输出,因此在作为FlowNode的输入时,SetInput时不需要传FlowData的输出index。 auto node1 = dflow::FlowNode("flow_node1", 1, 1).SetInput(0, flow_node0, 0); // node0有两个输出,第一个输出作为node1的第一输入,SetInput时需要传node0的输出index=0。 auto node2 = dflow::FlowNode("flow_node2", 1, 1).SetInput(0, flow_node0, 1); // node0有两个输出,第二个输出作为node2的第一个输入,SetInput时需要传node0的输出index=1。 |
创建FlowGraph实例
完成FlowOperator后,需要创建FlowGraph实例,并在FlowGraph中设置输入FlowOperator、输出FlowOperator,主要过程为:
- 包含所需的头文件。
1
#include "flow_graph/data_flow.h"
- 创建FlowGraph对象。
1
dflow::FlowGraph flow_graph("flow_graph");
- 设置FlowGraph输入和输出节点,使用到的主要接口为:
- 设置FlowGraph内的输入节点:SetInputs。
- 设置FlowGraph内的输出节点:SetOutputs。
- 如果作为输出节点的flownode存在多个输出,也可以指定该flownode的某个输出为模型输出SetOutputs。
如下例子是将整个node2的所有输出作为模型输出场景,如果需要设置部分节点部分输出为模型输出请参考SetOutputs:
1 2 3
std::vector<FlowOperator> inputs{data0, data1}; std::vector<FlowOperator> outputs{node2}; flow_graph.SetInputs(inputs).SetOutputs(outputs);
如果输入为多个FlowData节点,需要保证inputs入参顺序和FlowData节点index属性指定的顺序保持一致,否则后面生成模型时会报错。例如:
1 2 3 4 5 6
// 准备第一个输入数据 auto data0 = dflow::FlowData("Data0", 0); // 创建data0节点,index属性为0 // 准备第二个输入数据 auto data1 = dflow::FlowData("Data1", 1); // 创建data1节点,index属性为1 // 设置FlowGraph输入节点 std::vector<FlowOperator> inputs{data0, data1};