def convert_concat(onnx_graph, node): xs = oc.ONNXValue(onnx_graph,node.args.keywords['xs']) axis = oc.try_get_attribute(node.args.keywords['axis']) if isinstance(node.args.inputs[0], values.TupleValue) and node.args.inputs[0].has_constant_value(): vs = [] for v in xs.value.get_constant_value(): v_ = oc.ONNXValue(onnx_graph, v) vs.append(v_) onnx_graph.add_node( "Concat", vs, node.outputs, str(node.lineprop), axis=axis, ) elif isinstance(node.args.inputs[0], values.ListValue): onnx_graph.add_node( "ChainerSequenceConcat", [xs.create_sequence()], node.outputs, str(node.lineprop), axis=axis, )
def convert_matmul(onnx_graph, node): a = oc.ONNXValue(onnx_graph,node.args.keywords['a']) b = oc.ONNXValue(onnx_graph,node.args.keywords['b']) transa = oc.try_get_attribute(node.args.keywords['transa']) transb = oc.try_get_attribute(node.args.keywords['transb']) assert not transa # TODO(hamaji): Not supported yet. assert not transb # TODO(hamaji): Not supported yet. onnx_graph.add_node( "MatMul", [a.create_tensor(), b.create_tensor()], node.outputs, str(node.lineprop), )
def convert_reshape(onnx_graph, node): onnx_graph.add_node( "Reshape", [node.inputs[0],oc.ONNXValue(onnx_graph,node.inputs[1]).create_tensor()], node.outputs, str(node.lineprop))
def convert_split_axis(onnx_graph, node): force_tuple = oc.try_get_attribute(node.args.keywords['force_tuple']) assert(force_tuple is True) # TODO(hamaji): Not supported yet. onnx_graph.add_node( "ChainerSequenceSplitAxis", [node.inputs[0],oc.ONNXValue(onnx_graph,node.args.keywords['indices_or_sections']).create_tensor()], node.outputs, str(node.lineprop), axis = oc.try_get_attribute(node.args.keywords['axis']))
def convert_broadcast_to(onnx_graph, node): node_ = node shape = oc.ONNXValue(onnx_graph, node_.args.keywords['shape']) onnx_graph.add_node( "Expand", [node_.inputs[0], shape.create_tensor()], node_.outputs, str(node.lineprop)) return
def convert_dropout(onnx_graph, node): x = oc.ONNXValue(onnx_graph,node.args.keywords['x']) ratio = oc.try_get_attribute(node.args.keywords['ratio']) onnx_graph.add_node( "Dropout", [x], node.outputs, str(node.lineprop), ratio=ratio, )
def convert_roi_average_pooling_2d(onnx_graph, node): x = oc.ONNXValue(onnx_graph,node.args.keywords['x']) rois = oc.ONNXValue(onnx_graph,node.args.keywords['rois']) roi_indices = oc.ONNXValue(onnx_graph,node.args.keywords['roi_indices']) outsize = oc.ONNXValue(onnx_graph,node.args.keywords['outsize']) spatial_scale = oc.ONNXValue(onnx_graph,node.args.keywords['spatial_scale']) def _pair(x): if isinstance(x, collections.Iterable): return x return (x, x) onnx_graph.add_node( "ChainerROIAveragePool2D", [x.create_tensor(), rois.create_tensor(), roi_indices.create_tensor()], node.outputs, str(node.lineprop), output_shape=_pair(oc.try_get_attribute(outsize.value)), spatial_scale=oc.try_get_attribute(spatial_scale.value)) return
def convert_concat(onnx_graph, node): xs = oc.ONNXValue(onnx_graph,node.args.keywords['xs']) axis = oc.try_get_attribute(node.attribute_args.keywords['axis']) onnx_graph.add_node( "ChainerSequenceConcat", [xs.create_sequence()], node.outputs, str(node.lineprop), axis=axis, )
def convert_onnx_chainer_convolution2d(onnx_graph: 'ONNXGraph', node: 'nodes.NodeCall'): chainer_inst = node.func.owner.inst # type: chainer.links.Convolution2D ksize = oc.size2d(chainer_inst.ksize) stride = oc.size2d(chainer_inst.stride) ps = oc.size2d(chainer_inst.pad) pads = ps + ps x = oc.ONNXValue(onnx_graph, node.args.get_value('x')) o = oc.ONNXValue(onnx_graph, node.outputs[0]) w = oc.ONNXValue(onnx_graph, chainer_inst.W) b = None if chainer_inst.b is not None: b = oc.ONNXValue(onnx_graph, chainer_inst.b) onnx_graph.add_node('Conv', [x, w] + ([] if b is None else [b]), [o], str(node.lineprop), kernel_shape=ksize, pads=pads, strides=stride)
def convert_onnx_chainer_linear(onnx_graph: 'ONNXGraph', node: 'nodes.NodeCall'): chainer_inst = node.func.owner.inst # type: chainer.links.Linear onnx_name = oc.node2onnx_parameter[node].onnx_name x = oc.ONNXValue(onnx_graph, node.args.get_value('x')) o = oc.ONNXValue(onnx_graph, node.outputs[0]) if chainer_inst.W.data is None: print("W is unknown. Please infer this model.") w = oc.ONNXValue(onnx_graph, chainer_inst.W) (x_shape, ) = onnx_graph.add_node('Shape', [x], [None], str(node.lineprop)) (batch_size_1, ) = onnx_graph.add_node('Gather', [ x_shape, oc.ONNXValue(onnx_graph, np.array(0, dtype=np.int64), [onnx_name, '/Zero']) ], [None], str(node.lineprop)) (batch_size_2, ) = onnx_graph.add_node('Unsqueeze', [batch_size_1], [None], str(node.lineprop), axes=[0]) (mat_shape, ) = onnx_graph.add_node('Concat', [ batch_size_2, oc.ONNXValue(onnx_graph, np.array([-1], dtype=np.int64), [onnx_name, '/Minus1']) ], [None], str(node.lineprop), axis=0) (x_reshape, ) = onnx_graph.add_node('Reshape', [x, mat_shape], [None], str(node.lineprop)) if chainer_inst.b is not None: b = oc.ONNXValue(onnx_graph, chainer_inst.b) onnx_graph.add_node('Gemm', [x_reshape, w, b], [o], str(node.lineprop), transA=0, transB=1) else: temp = oc.ONNXValue(onnx_graph, np.float32, [onnx_name, '/Temp']) onnx_graph.add_node('Transpose', [w], [temp], str(node.lineprop), perm=[1, 0]) onnx_graph.add_node('MatMul', [x_reshape, temp], [o], str(node.lineprop))
def convert_unpooling_2d(onnx_graph, node : 'nodes.NodeCall'): ksize = oc.try_get_attribute(node.args.keywords['ksize']) stride = oc.try_get_attribute(node.args.keywords['stride']) pad = oc.try_get_attribute(node.args.keywords['pad']) outsize = oc.try_get_attribute(node.args.keywords['outsize']) cover_all = oc.try_get_attribute(node.args.keywords['cover_all']) assert(stride is None) # TODO(hamaji): Not supported yet. assert(pad == 0) # TODO(hamaji): Not supported yet. assert(outsize is None) # TODO(hamaji): Not supported yet. assert(cover_all is False) # TODO(hamaji): Not supported yet. scales = np.array([1, 1] + list(_pair(ksize)), dtype=np.float32) scales_ = oc.ONNXValue(onnx_graph, scales, [node, '/Scale'], is_constant = True) onnx_graph.add_node( "Upsample", [node.inputs[0], scales_], [node.outputs[0]], name=str(node.lineprop))
def convert_onnx_chainer_batch_normalization(onnx_graph: 'ONNXGraph', node: 'nodes.NodeCall'): chainer_inst = node.func.owner.inst # type: chainer.links.BatchNormalization assert (chainer_inst.axis is None) # not support yet x = oc.ONNXValue(onnx_graph, node.args.get_value('x')) o = oc.ONNXValue(onnx_graph, node.outputs[0]) gamma = oc.ONNXValue(onnx_graph, chainer_inst.gamma) beta = oc.ONNXValue(onnx_graph, chainer_inst.beta) avg_mean = oc.ONNXValue(onnx_graph, chainer_inst.avg_mean, [node, 'mean']) avg_var = oc.ONNXValue(onnx_graph, chainer_inst.avg_var, [node, 'var']) eps = chainer_inst.eps momentum = chainer_inst.decay onnx_graph.add_node('BatchNormalization', [x, gamma, beta, avg_mean, avg_var], [o], str(node.lineprop), epsilon=eps, momentum=momentum)