def test_default(self):
        pad = OnnxPad(mode='constant',
                      value=1.5,
                      pads=[0, 1, 0, 1],
                      op_version=10)

        X = helper.make_tensor_value_info('X', onnx.TensorProto.FLOAT,
                                          [None, 2])
        model_def = pad.to_onnx({pad.inputs[0].name: X}, target_opset=10)
        onnx.checker.check_model(model_def)
Ejemplo n.º 2
0
    def test_pad(self):
        from skl2onnx.algebra.onnx_ops import OnnxPad

        X = helper.make_tensor_value_info('X', TensorProto.FLOAT, [1, 2])

        pad = OnnxPad('X', output_names=['Y'],
                      mode='constant', value=1.5,
                      pads=[0, 1, 0, 1])

        model_def = pad.to_onnx({'X': X})
        onnx.checker.check_model(model_def)
    def test_pad_opset(self):

        pad = OnnxPad('X',
                      output_names=['Y'],
                      mode='constant',
                      value=1.5,
                      pads=[0, 1, 0, 1],
                      op_version=2)

        X = np.array([[0, 1]], dtype=np.float32)
        model_def = pad.to_onnx({'X': X}, target_opset=10)
        onnx.checker.check_model(model_def)

        def predict_with_onnxruntime(model_def, *inputs):
            sess = ort.InferenceSession(model_def.SerializeToString())
            names = [i.name for i in sess.get_inputs()]
            dinputs = {name: input for name, input in zip(names, inputs)}
            res = sess.run(None, dinputs)
            names = [o.name for o in sess.get_outputs()]
            return {name: output for name, output in zip(names, res)}

        Y = predict_with_onnxruntime(model_def, X)
        assert_almost_equal(np.array([[1.5, 0., 1., 1.5]], dtype=np.float32),
                            Y['Y'])
onnx.checker.check_model(model_def)
print('The model is checked!')

#####################################
# Same example with sklearn-onnx
# ++++++++++++++++++++++++++++++
#
# Every operator has its own class in *sklearn-onnx*.
# The list is dynamically created based on the installed
# onnx package.

from skl2onnx.algebra.onnx_ops import OnnxPad  # noqa

pad = OnnxPad('X',
              output_names=['Y'],
              mode='constant',
              value=1.5,
              pads=[0, 1, 0, 1],
              op_version=10)

model_def = pad.to_onnx({'X': X}, target_opset=10)

print('The model is:\n{}'.format(model_def))
onnx.checker.check_model(model_def)
print('The model is checked!')

####################################
# Inputs and outputs can also be skipped.

pad = OnnxPad(mode='constant', value=1.5, pads=[0, 1, 0, 1], op_version=10)

model_def = pad.to_onnx({pad.inputs[0]: X}, target_opset=10)
    def test_onnxt_runtime_pad(self):
        data = np.array([[1.0, 1.2], [2.3, 3.4], [4.5, 5.7]], dtype=np.float32)
        pads = np.array([0, 2, 0, 0], dtype=np.int64)
        constant_value = np.array([0.0], dtype=np.float32)
        exp = np.array(
            [[0.0, 0.0, 1.0, 1.2], [0.0, 0.0, 2.3, 3.4], [0.0, 0.0, 4.5, 5.7]],
            dtype=np.float32)
        onx = OnnxPad('data',
                      'pads',
                      constant_value,
                      output_names=['Y'],
                      op_version=TARGET_OPSET)
        model_def = onx.to_onnx({
            'data': data,
            'pads': pads
        },
                                target_opset=TARGET_OPSET)
        oinf = InferenceSession(model_def.SerializeToString())
        got = oinf.run(None, {'data': data, 'pads': pads})
        assert_almost_equal(exp, got[0])

        data = np.array([[1.0, 1.2], [2.3, 3.4], [4.5, 5.7]], dtype=np.float32)
        pads = np.array([0, 2, 0, 0], dtype=np.int64)
        constant_value = np.array([0.0], dtype=np.float32)
        exp = np.array(
            [[0, 1.2, 1.0, 1.2], [0, 3.4, 2.3, 3.4], [0, 5.7, 4.5, 5.7]],
            dtype=np.float32)
        onx = OnnxPad('data',
                      'pads',
                      output_names=['Y'],
                      mode='reflect',
                      op_version=TARGET_OPSET)
        model_def = onx.to_onnx({
            'data': data,
            'pads': pads
        },
                                target_opset=TARGET_OPSET)
        oinf = InferenceSession(model_def.SerializeToString())
        got = oinf.run(None, {'data': data, 'pads': pads})
        try:
            assert_almost_equal(exp, got[0])
        except AssertionError as e:
            warnings.warn(e)

        data = np.array([[1.0, 1.2], [2.3, 3.4], [4.5, 5.7]], dtype=np.float32)
        pads = np.array([0, 2, 0, 0], dtype=np.int64)
        constant_value = np.array([0.0], dtype=np.float32)
        exp = np.array(
            [[1.0, 1.0, 1.0, 1.2], [2.3, 2.3, 2.3, 3.4], [4.5, 4.5, 4.5, 5.7]],
            dtype=np.float32)
        onx = OnnxPad('data',
                      'pads',
                      output_names=['Y'],
                      mode='edge',
                      op_version=TARGET_OPSET)
        model_def = onx.to_onnx({
            'data': data,
            'pads': pads
        },
                                target_opset=TARGET_OPSET)
        oinf = InferenceSession(model_def.SerializeToString())
        got = oinf.run(None, {'data': data, 'pads': pads})
        assert_almost_equal(exp, got[0])
onnx.checker.check_model(model_def)
print('The model is checked!')

#####################################
# Same example with sklearn-onnx
# ++++++++++++++++++++++++++++++
#
# Every operator has its own class in *sklearn-onnx*.
# The list is dynamically created based on the installed
# onnx package.

from skl2onnx.algebra.onnx_ops import OnnxPad  # noqa

pad = OnnxPad('X',
              output_names=['Y'],
              mode='constant',
              value=1.5,
              pads=[0, 1, 0, 1])

model_def = pad.to_onnx({'X': X})

print('The model is:\n{}'.format(model_def))
onnx.checker.check_model(model_def)
print('The model is checked!')

####################################
# Inputs and outputs can also be skipped.

pad = OnnxPad(mode='constant', value=1.5, pads=[0, 1, 0, 1])

model_def = pad.to_onnx({pad.inputs[0].name: X})