SNPE
- DlcConverter
-
- _resolve_graph_operations_from_model
- _resolve_descriptors_from_nodes
DlcConverter
_resolve_graph_operations_from_model
周遊 Graph 中所有 operation,從 output_nodes 開始周遊,通路的 operation 加入到
visited
清單,并将周遊結果作為清單傳回,具體周遊過程如下:
...
for output_op_name in model.out_nodes_names:
queue = [operations_map[output_op_name]]
visited = set()
while len(queue) > 0:
head = queue.pop(0)
if head in visited:
continue
visited.add(head)
if head in input_ops:
continue
for t in head.inputs:
queue.append(t.op)
all_ops_in_paths.update(visited)
從上述代碼中可以知道,如果目前隊列的 head operation 在
input_ops
中,則不會将該 head operation 加入到
visited
清單中。 head operation 通路完成以後,再将該 head operation 對應的 inputs 加入到待通路清單
queue
中:
for t in head.inputs:
queue.append(t.op)
_resolve_descriptors_from_nodes
首先找到所有的 layer_resolvers,然後根據 tf.Operation 清單建構 TFGraphBuilder:
resolvers = self._create_layer_resolvers()
constructor = TFGraphBuilder(ops)
constructor.link_nodes()
constructor.link_nodes()
将所有 TFOperationNode 根據 tf.Operation 的 inputs 的關系重建立立起和 TensorFlow Graph 一樣的節點聯系, link_nodes 主要功能代碼如下:
for tf_tensor in node.original_node.inputs:
input_node = self.nodes_map.get(tf_tensor.op.name, None)
if input_node is None:
input_node = NonConsumableTFOperationNode(tf_tensor.op)
self.nodes_map[tf_tensor.op.name] = input_node
node.inputs.append(input_node)
上述代碼中
original_node
即為
tf.Operation
類型,
nodes_map
為
tf.Operation name
和
TFOperationNode
的組成一個字典。
node.inputs.append(input_node)
建構 node 的 input 清單,完成 link 的建立。