Пример #1
0
def convert_average_pool_2d(onnx_graph, node):
    parser = oc.NodeParse()
    parser.add_def('x', oc.ParseType.In)
    parser.add_def('ksize', oc.ParseType.AttPad)
    parser.add_def('stride', oc.ParseType.AttPad)
    parser.add_def('pad', oc.ParseType.AttPad)
    parser.parse(onnx_graph, node)

    kwargs = {}

    kwargs['kernel_shape'] = parser.get('ksize')
    if parser.get('stride') is not None:
        kwargs['strides'] = parser.get('stride')
    else:
        kwargs['strides'] = parser.get('ksize')
    if parser.get('pad') is not None:
        kwargs['pads'] = parser.get('pad') * 2
    else:
        kwargs['pads'] = _pair(0)

    kwargs['count_include_pad'] = 1

    onnx_graph.add_node(
        "AveragePool",
        [node.inputs[0]],
        [node.outputs[0]],
        name=str(node.lineprop),
        **kwargs,
    )
Пример #2
0
 def parse_args(self, onnx_graph, node):
     assert hasattr(self, 'expected_args'), 'BaseConverter subclass must have `expected_args`'
     parser =  oc.NodeParse()
     for arg_def in self.expected_args:
         parser.add_def(*arg_def)
     parser.parse(onnx_graph, node)
     return parser
Пример #3
0
def convert_hstack(onnx_graph, node):
    parser = oc.NodeParse()
    parser.add_def('xs', oc.ParseType.In)
    parser.parse(onnx_graph, node)

    onnx_graph.add_node("ChainerSequenceConcat",
                        [parser.get('xs').create_sequence()],
                        [node.outputs[0]],
                        name=str(node.lineprop),
                        axis=1)
Пример #4
0
def convert_separate(onnx_graph, node):
    parser = oc.NodeParse()
    parser.add_def('x', oc.ParseType.In)
    parser.add_def('axis', oc.ParseType.Att)
    parser.parse(onnx_graph, node)

    onnx_graph.add_node("ChainerSequenceSeparate",
                        [parser.get('x').create_tensor(node.lineprop)],
                        [node.outputs[0]],
                        name=str(node.lineprop),
                        axis=parser.get('axis'))
Пример #5
0
def convert_squeeze(onnx_graph, node):
    parser = oc.NodeParse()
    parser.add_def('x', oc.ParseType.In)
    parser.add_def('axis', oc.ParseType.Att)
    parser.parse(onnx_graph, node)

    kwargs = {}
    if parser.get('axis') is not None:
        kwargs['axes'] = _list(parser.get('axis'))

    onnx_graph.add_node("Squeeze",
                        [parser.get('x').create_tensor(node.lineprop)],
                        [node.outputs[0]],
                        name=str(node.lineprop),
                        **kwargs)
Пример #6
0
def convert_matmul(onnx_graph, node):
    parser = oc.NodeParse()
    parser.add_def('a', oc.ParseType.In)
    parser.add_def('b', oc.ParseType.In)
    parser.add_def('transa', oc.ParseType.Att, False)
    parser.add_def('transb', oc.ParseType.Att, False)
    parser.parse(onnx_graph, node)

    onnx_graph.add_node(
        "MatMul",
        [
            parser.get('a').create_tensor(node.lineprop),
            parser.get('b').create_tensor(node.lineprop)
        ],
        node.outputs,
        str(node.lineprop),
    )
Пример #7
0
def convert_onnx_chainer_EmbedID(onnx_graph: 'ONNXGraph',
                                 node: 'nodes.NodeCall'):
    chainer_inst = node.func.owner.inst  # type: chainer.links.EmbedID

    n_vocab = chainer_inst.W.shape[0]
    n_out = chainer_inst.W.shape[1]

    w = oc.ONNXValue(onnx_graph, chainer_inst.W)

    parser = oc.NodeParse()
    parser.add_def('x', oc.ParseType.In)
    parser.parse(onnx_graph, node)

    x = parser.get('x').create_tensor(node.lineprop)

    onnx_graph.add_node('Gather', [w, x], [node.outputs[0]],
                        str(node.lineprop))
Пример #8
0
def convert_sum(onnx_graph, node):
    parser = oc.NodeParse()
    parser.add_def('x', oc.ParseType.In)
    parser.add_def('axis', oc.ParseType.Att)
    parser.add_def('keepdims', oc.ParseType.Att)
    parser.parse(onnx_graph, node)

    kwargs = {}

    axis = parser.get('axis')

    if isinstance(axis, int):
        kwargs['axes'] = [axis]
    elif axis is not None:
        kwargs['axes'] = list(axis)

    onnx_graph.add_node("ReduceSum", [node.inputs[0]], [node.outputs[0]],
                        str(node.lineprop),
                        keepdims=parser.get('keepdims'),
                        **kwargs)
Пример #9
0
def convert_onnx_chainer_NStepBiLSTM(onnx_graph: 'ONNXGraph',
                                     node: 'nodes.NodeCall'):
    chainer_inst = node.func.owner.inst  # type: chainer.links.NStepBiLSTM

    hd = chainer_inst.children().__next__()

    if not (hd.w0 is None):
        n_in = hd.w0.shape[1]
    else:
        n_in = None

    out_size = chainer_inst.out_size
    n_layers = chainer_inst.n_layers
    dropout = chainer_inst.dropout

    self_ws = []
    self_bs = []
    for i in range(n_layers * 2):
        ws_ = []
        bs_ = []
        for j in range(8):
            ws_.append(oc.ONNXValue(onnx_graph, chainer_inst.ws[i][j]))
            bs_.append(oc.ONNXValue(onnx_graph, chainer_inst.bs[i][j]))
        self_ws.append(ws_)
        self_bs.append(bs_)

    parser = oc.NodeParse()
    parser.add_def('hx', oc.ParseType.Att, None)
    parser.add_def('cx', oc.ParseType.Att, None)
    parser.add_def('xs', oc.ParseType.In)
    parser.parse(onnx_graph, node)

    xs = parser.get('xs').create_sequence()

    # disolve nstep into 1step

    (ilens, ) = onnx_graph.add_node('ChainerSequenceLengths', [xs], [None],
                                    str(node.lineprop))

    (tilens, ) = onnx_graph.add_node('ChainerSequenceStack', [ilens], [None],
                                     str(node.lineprop))

    v = xs

    def lstm_param(ps):
        (p, ) = onnx_graph.add_node("Concat", [v_ for v_ in ps], [None],
                                    str(node.lineprop),
                                    axis=0)

        return onnx_graph.add_node("Unsqueeze", [p], [None],
                                   str(node.lineprop),
                                   axes=[0])[0]

    wst = []
    rst = []
    bst = []
    for w in self_ws:
        wst.append(lstm_param([w[0], w[3], w[1], w[2]]))
        rst.append(lstm_param([w[4], w[7], w[5], w[6]]))

    for b in self_bs:
        bst.append(lstm_param([b[0], b[3], b[1], b[2], b[4], b[7], b[5],
                               b[6]]))

    ws = []
    rs = []
    bs = []
    for i in range(n_layers):
        for s, t in [(ws, wst), (rs, rst), (bs, bst)]:
            (temp, ) = onnx_graph.add_node("Concat", [t[i * 2], t[i * 2 + 1]],
                                           [None],
                                           str(node.lineprop),
                                           axis=0)

            s.append(temp)

    hs = []
    cs = []

    (v, ) = onnx_graph.add_node("ChainerSequencePad", [v], [None],
                                str(node.lineprop))

    (v, ) = onnx_graph.add_node(
        "Transpose",
        [v],
        [None],
        str(node.lineprop),
        perm=(1, 0, 2),
    )

    (sequence_length, ) = onnx_graph.add_node(
        "ChainerGenericLen",
        [v],
        [None],
        str(node.lineprop),
    )

    minus1 = oc.ONNXValue(onnx_graph, np.array(-1), [node, '/Minus1'])
    out_size2 = oc.ONNXValue(onnx_graph, np.array(out_size * 2),
                             [node, '/Outputs'])

    (sout_shape, ) = onnx_graph.add_node(
        "ChainerSequenceCreate",
        [sequence_length, minus1, out_size2],
        [None],
        str(node.lineprop),
    )
    sout_shape.onnx_type = oc.ONNXValueType.Sequence

    out_shape = sout_shape.create_tensor(node.lineprop)

    for i in range(n_layers):
        h = oc.ONNXValue(onnx_graph, np.float32, [node, '/h'])
        c = oc.ONNXValue(onnx_graph, np.float32, [node, '/c'])
        ys = oc.ONNXValue(onnx_graph, np.float32, [node, '/ys'])

        onnx_graph.add_node(
            "LSTM",
            [v, ws[i], rs[i], bs[i], tilens],
            [ys, h, c],
            str(node.lineprop),
            direction='bidirectional',
            hidden_size=out_size,
            # sequence_lens=[ilens.name]
        )

        hs.append(h)
        cs.append(c)

        # ys :: [seqlen x 2 x batchsize x hiddensize]
        (v, ) = onnx_graph.add_node("Transpose", [ys], [None],
                                    str(node.lineprop),
                                    perm=(0, 2, 1, 3))
        (v, ) = onnx_graph.add_node("Reshape", [v, out_shape], [None],
                                    str(node.lineprop))

    (v, ) = onnx_graph.add_node("Transpose", [v.name], [None],
                                str(node.lineprop),
                                perm=(1, 0, 2))

    (v, ) = onnx_graph.add_node("ChainerSequenceUnpad", [v.name, ilens.name],
                                [None], str(node.lineprop))
    v.onnx_type = oc.ONNXValueType.Sequence

    v = v.create_sequence()

    onnx_graph.add_node(
        "Concat",
        hs,
        [node.outputs[0]],
        str(node.lineprop),
        axis=0,
    )

    onnx_graph.add_node(
        "Concat",
        cs,
        [node.outputs[1]],
        str(node.lineprop),
        axis=0,
    )

    onnx_graph.add_node('Identity', [v], [node.outputs[2]], str(node.lineprop))
Пример #10
0
def convert_onnx_chainer_NStepLSTM(onnx_graph: 'ONNXGraph',
                                   node: 'nodes.NodeCall'):
    chainer_inst = node.func.owner.inst  # type: chainer.links.NStepLSTM

    hd = chainer_inst.children().__next__()

    if not (hd.w0 is None):
        n_in = hd.w0.shape[1]
    else:
        n_in = None

    out_size = chainer_inst.out_size
    n_layers = chainer_inst.n_layers
    dropout = chainer_inst.dropout

    self_ws = []
    self_bs = []
    for i in range(n_layers):
        ws_ = []
        bs_ = []
        for j in range(8):
            ws_.append(oc.ONNXValue(onnx_graph, chainer_inst.ws[i][j]))
            bs_.append(oc.ONNXValue(onnx_graph, chainer_inst.bs[i][j]))
        self_ws.append(ws_)
        self_bs.append(bs_)

    parser = oc.NodeParse()
    parser.add_def('hx', oc.ParseType.Att, None)
    parser.add_def('cx', oc.ParseType.Att, None)
    parser.add_def('xs', oc.ParseType.In)
    parser.parse(onnx_graph, node)

    xs = parser.get('xs').create_sequence()

    # disolve nstep into 1step

    (ilens, ) = onnx_graph.add_node('ChainerSequenceLengths', [xs], [None],
                                    str(node.lineprop))

    (tilens, ) = onnx_graph.add_node('ChainerSequenceStack', [ilens], [None],
                                     str(node.lineprop))

    (v, ) = onnx_graph.add_node("ChainerSequencePad", [xs], [None],
                                str(node.lineprop))

    (v, ) = onnx_graph.add_node(
        "Transpose",
        [v],
        [None],
        str(node.lineprop),
        perm=(1, 0, 2),
    )

    def lstm_param(ps):
        (p, ) = onnx_graph.add_node("Concat", [v_ for v_ in ps], [None],
                                    str(node.lineprop),
                                    axis=0)

        return onnx_graph.add_node("Unsqueeze", [p], [None],
                                   str(node.lineprop),
                                   axes=[0])[0]

    ws = []
    rs = []
    bs = []
    for w in self_ws:
        ws.append(lstm_param([w[0], w[3], w[1], w[2]]))
        rs.append(lstm_param([w[4], w[7], w[5], w[6]]))

    for b in self_bs:
        bs.append(lstm_param([b[0], b[3], b[1], b[2], b[4], b[7], b[5], b[6]]))

    hs = []
    cs = []
    for i in range(n_layers):
        h = oc.ONNXValue(onnx_graph, np.float32, [node, '/h'])
        c = oc.ONNXValue(onnx_graph, np.float32, [node, '/c'])
        ys = oc.ONNXValue(onnx_graph, np.float32, [node, '/ys'])

        onnx_graph.add_node(
            "LSTM",
            [v, ws[i], rs[i], bs[i], tilens],
            [ys, h, c],
            str(node.lineprop),
            direction='forward',
            hidden_size=out_size,
            # sequence_lens=[ilens.name]
        )

        hs.append(h)
        cs.append(c)
        (yys, ) = onnx_graph.add_node("Squeeze", [ys], [None],
                                      str(node.lineprop),
                                      axes=[1])

        v = yys

    onnx_graph.add_node(
        "Concat",
        hs,
        [node.outputs[0]],
        str(node.lineprop),
        axis=0,
    )

    onnx_graph.add_node(
        "Concat",
        cs,
        [node.outputs[1]],
        str(node.lineprop),
        axis=0,
    )

    (tv, ) = onnx_graph.add_node(
        "Transpose",
        [v],
        [None],
        str(node.lineprop),
        perm=(1, 0, 2),
    )
    v = tv

    onnx_graph.add_node(
        "ChainerSequenceUnpad",
        [v, ilens],
        [node.outputs[2]],
        str(node.lineprop),
    )