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,
        )
Esempio n. 9
0
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)
Esempio n. 10
0
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))
Esempio n. 12
0
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)