in onnxconverter_common/optimizer.py [0:0]
def build_from_onnx(onnx_nodes, nchw_inputs, inputs, outputs, initializers=None, target_opset=None):
view = []
var_map = {}
for o_ in onnx_nodes:
ln = LinkedNode(o_, target_opset=target_opset)
view.append(ln)
for var_ in o_.output:
assert var_map.get(var_) is None
var_map[var_] = ln
additional_nodes = []
count_nchw = 0
initializer_map = None
if initializers is not None:
initializer_map = {k.name: k for k in initializers}
for n_ in view:
for var_ in n_.origin.input:
target = var_map.get(var_)
if target is None:
assert var_ == '' or var_ in inputs
if initializer_map is not None and var_ in initializer_map:
target = LinkedNode(out_n=[var_],
tensors_n=[initializer_map[var_]],
target_opset=target_opset) # create an empty node as input
else:
target = LinkedNode(out_n=[var_], target_opset=target_opset)
new_output = var_ + '_nhwc'
if var_ in nchw_inputs:
nnode = LinkedNode(
helper.make_node(
'Transpose',
[var_],
[new_output],
name='Transpose_nchw_' + str(count_nchw),
perm=[0, 2, 3, 1]),
target_opset=target_opset)
count_nchw = count_nchw + 1
var_map[new_output] = nnode
nnode.add_precedence(target, var_)
n_.in_redirect(var_, new_output)
target = nnode
var_ = new_output
additional_nodes.append(nnode)
n_.add_precedence(target, var_)
for n_ in view: # add a dummy output node.
for var_ in n_.origin.output:
if var_ in outputs:
LinkedNode(in_n=[var_], target_opset=target_opset).add_precedence(n_, var_)
return view + additional_nodes