コード例 #1
0
def dummy_converter(scope, operator, container):
    X = operator.inputs[0]
    out = operator.outputs

    id1 = OnnxIdentity(X)
    id2 = OnnxIdentity(id1, output_names=out[1:])
    id2.add_to(scope, container)
コード例 #2
0
def dummy_converter(scope, operator, container):
    X = operator.inputs[0]
    out = operator.outputs

    id1 = OnnxIdentity(X, op_version=TARGET_OPSET)
    id2 = OnnxIdentity(id1, output_names=out[1:], op_version=TARGET_OPSET)
    id2.add_to(scope, container)
コード例 #3
0
def decorrelate_transformer_convertor(scope, operator, container):
    op = operator.raw_operator
    opv = container.target_opset
    out = operator.outputs
    X = operator.inputs[0]
    subop = OnnxSubEstimator(op.pca_, X, op_version=opv)
    Y = OnnxIdentity(subop, op_version=opv, output_names=out[:1])
    Y.add_to(scope, container)
コード例 #4
0
def custom_transformer_converter4(scope, operator, container):
    i0 = operator.inputs[0]
    outputs = operator.outputs
    op = operator.raw_operator
    opv = container.target_opset
    out = OnnxSubEstimator(op.norm_, i0, op_version=opv)
    final = OnnxIdentity(
        out[1], output_names=outputs, op_version=opv)
    final.add_to(scope, container)
コード例 #5
0
def custom_linear_regressor_converter(scope, operator, container):
    op = operator.raw_operator
    opv = container.target_opset
    out = operator.outputs
    X = operator.inputs[0]
    dtype = guess_numpy_type(X.type)
    m = OnnxAdd(OnnxMatMul(X, op.coef_.astype(dtype), op_version=opv),
                numpy.array([op.intercept_]),
                op_version=opv)
    Y = OnnxIdentity(m, op_version=opv, output_names=out[:1])
    Y.add_to(scope, container)
コード例 #6
0
def decorrelate_transformer_converter2(scope, operator, container):
    op = operator.raw_operator
    opv = container.target_opset
    out = operator.outputs
    X = operator.inputs[0]
    dtype = guess_numpy_type(X.type)
    m = OnnxMatMul(OnnxSub(X, op.pca_.mean_.astype(dtype), op_version=opv),
                   op.pca_.components_.T.astype(dtype),
                   op_version=opv)
    Y = OnnxIdentity(m, op_version=opv, output_names=out[:1])
    Y.add_to(scope, container)
コード例 #7
0
def custom_cluster_converter(scope, operator, container):
    op = operator.raw_operator
    opv = container.target_opset
    out = operator.outputs
    X = operator.inputs[0]
    dtype = guess_numpy_type(X.type)
    dist = OnnxMatMul(X, op.clusters_.astype(dtype), op_version=opv)
    label = OnnxArgMax(dist, axis=1, op_version=opv)
    Yl = OnnxIdentity(label, op_version=opv, output_names=out[:1])
    Yp = OnnxIdentity(dist, op_version=opv, output_names=out[1:])
    Yl.add_to(scope, container)
    Yp.add_to(scope, container)
def subsub_mmtwo_converter(scope, operator, container):
    op = operator.raw_operator
    opv = container.target_opset
    out = operator.outputs
    X = operator.inputs[0]
    x2 = OnnxSubEstimator(op.est1_, X, op_version=opv)
    x2.set_onnx_name_prefix('AAA')
    x2_exp = OnnxExp(x2, op_version=opv)
    x3 = OnnxSubEstimator(op.est2_, x2_exp, op_version=opv)
    x3.set_onnx_name_prefix('BBB')
    final = OnnxIdentity(x3, op_version=opv, output_names=out[:1])
    final.add_to(scope, container)
コード例 #9
0
def decorrelate_transformer_converter(scope, operator, container):
    op = operator.raw_operator
    opv = container.target_opset
    out = operator.outputs

    # We retrieve the unique input.
    X = operator.inputs[0]

    # We tell in ONNX language how to compute the unique output.
    # op_version=opv tells which opset is requested
    subop = OnnxSubEstimator(op.pca_, X, op_version=opv)
    Y = OnnxIdentity(subop, op_version=opv, output_names=out[:1])
    Y.add_to(scope, container)
コード例 #10
0
def custom_linear_classifier_converter(scope, operator, container):
    op = operator.raw_operator
    opv = container.target_opset
    out = operator.outputs
    X = operator.inputs[0]
    dtype = guess_numpy_type(X.type)
    raw = OnnxAdd(OnnxMatMul(X, op.coef_.astype(dtype), op_version=opv),
                  op.intercept_.astype(dtype),
                  op_version=opv)
    prob = OnnxSigmoid(raw, op_version=opv)
    label = OnnxArgMax(prob, axis=1, op_version=opv)
    Yl = OnnxIdentity(label, op_version=opv, output_names=out[:1])
    Yp = OnnxIdentity(prob, op_version=opv, output_names=out[1:])
    Yl.add_to(scope, container)
    Yp.add_to(scope, container)
コード例 #11
0
def ordwoe_encoder_converter(scope, operator, container):
    op = operator.raw_operator
    opv = container.target_opset
    X = operator.inputs[0]

    sub = OnnxSubEstimator(op.encoder_, X, op_version=opv)
    cast = OnnxCast(sub, op_version=opv, to=np.float32)
    cat = OnnxSubEstimator(op.woe_,
                           cast,
                           op_version=opv,
                           input_types=[Int64TensorType()])
    idcat = OnnxIdentity(cat,
                         output_names=operator.outputs[:1],
                         op_version=opv)
    idcat.add_to(scope, container)
def validator_classifier_converter(scope, operator, container):
    input = operator.inputs[0]  # input in ONNX graph
    outputs = operator.outputs  # outputs in ONNX graph
    op = operator.raw_operator  # scikit-learn model (mmust be fitted)
    opv = container.target_opset

    # We reuse existing converter and declare it as local
    # operator.
    model = op.estimator_
    onnx_op = OnnxSubEstimator(model, input, op_version=opv)

    rmax = OnnxReduceMax(onnx_op[1], axes=[1], keepdims=0, op_version=opv)
    great = OnnxGreater(rmax,
                        np.array([op.threshold], dtype=np.float32),
                        op_version=opv)
    valid = OnnxCast(great, to=onnx_proto.TensorProto.INT64, op_version=opv)

    r1 = OnnxIdentity(onnx_op[0],
                      output_names=[outputs[0].full_name],
                      op_version=opv)
    r2 = OnnxIdentity(onnx_op[1],
                      output_names=[outputs[1].full_name],
                      op_version=opv)
    r3 = OnnxIdentity(valid,
                      output_names=[outputs[2].full_name],
                      op_version=opv)

    r1.add_to(scope, container)
    r2.add_to(scope, container)
    r3.add_to(scope, container)
コード例 #13
0
def validator_classifier_converter(scope, operator, container):
    input0 = operator.inputs[0]  # first input in ONNX graph
    outputs = operator.outputs  # outputs in ONNX graph
    op = operator.raw_operator  # scikit-learn model (mmust be fitted)
    opv = container.target_opset

    # The model calls another one. The class `OnnxSubEstimator`
    # calls the converter for this operator.
    model = op.estimator_
    onnx_op = OnnxSubEstimator(model,
                               input0,
                               op_version=opv,
                               options={'zipmap': False})

    rmax = OnnxReduceMax(onnx_op[1], axes=[1], keepdims=0, op_version=opv)
    great = OnnxGreater(rmax,
                        np.array([op.threshold], dtype=np.float32),
                        op_version=opv)
    valid = OnnxCast(great, to=onnx_proto.TensorProto.INT64, op_version=opv)

    r1 = OnnxIdentity(onnx_op[0],
                      output_names=[outputs[0].full_name],
                      op_version=opv)
    r2 = OnnxIdentity(onnx_op[1],
                      output_names=[outputs[1].full_name],
                      op_version=opv)
    r3 = OnnxIdentity(valid,
                      output_names=[outputs[2].full_name],
                      op_version=opv)

    r1.add_to(scope, container)
    r2.add_to(scope, container)
    r3.add_to(scope, container)
コード例 #14
0
def _common_converter_int_t(scope, operator, container):
    if not hasattr(operator, 'onnx_numpy_fct_'):
        raise AttributeError("operator must have attribute 'onnx_numpy_fct_'.")
    X = operator.inputs
    if len(X) != 1:
        raise RuntimeError("This function only supports one input not %r." %
                           len(X))
    if len(operator.outputs) != 2:
        raise RuntimeError("This function only supports two outputs not %r." %
                           len(operator.outputs))

    from skl2onnx.algebra.onnx_ops import OnnxIdentity  # pylint: disable=E0611
    from .onnx_variable import OnnxVar, TupleOnnxAny
    xvar = OnnxVar(X[0])
    fct_cl = operator.onnx_numpy_fct_

    opv = container.target_opset
    inst = fct_cl.fct(xvar, op_=operator.raw_operator)
    onx = inst.to_algebra(op_version=opv)
    if isinstance(onx, TupleOnnxAny):
        if len(operator.outputs) != len(onx):
            raise RuntimeError(  # pragma: no cover
                "Mismatched number of outputs expected %d, got %d." %
                (len(operator.outputs), len(onx)))
        for out, ox in zip(operator.outputs, onx):
            if not hasattr(ox, 'add_to'):
                raise TypeError(  # pragma: no cover
                    "Unexpected type for onnx graph %r, inst=%r." %
                    (type(ox), type(inst)))
            final = OnnxIdentity(ox,
                                 op_version=opv,
                                 output_names=[out.full_name])
            final.add_to(scope, container)
    else:
        final = OnnxIdentity(onx,
                             op_version=opv,
                             output_names=[operator.outputs[0].full_name])
        final.add_to(scope, container)
コード例 #15
0
def _common_converter_t(scope, operator, container):
    if not hasattr(operator, 'onnx_numpy_fct_'):
        raise AttributeError("operator must have attribute 'onnx_numpy_fct_'.")
    X = operator.inputs
    if len(X) != 1:
        raise RuntimeError("This function only supports one input not %r." %
                           len(X))
    if len(operator.outputs) != 1:
        raise RuntimeError("This function only supports one output not %r." %
                           len(operator.outputs))

    from skl2onnx.algebra.onnx_ops import OnnxIdentity  # pylint: disable=E0611
    from .onnx_variable import OnnxVar
    xvar = OnnxVar(X[0])
    fct_cl = operator.onnx_numpy_fct_

    opv = container.target_opset
    inst = fct_cl.fct(xvar, op_=operator.raw_operator)
    onx = inst.to_algebra(op_version=opv)
    final = OnnxIdentity(onx,
                         op_version=opv,
                         output_names=[operator.outputs[0].full_name])
    final.add_to(scope, container)