def test_algebra_to_onnx(self):
     X = numpy.random.randn(5, 4)
     beta = numpy.array([1, 2, 3, 4]) / 10
     beta32 = beta.astype(numpy.float32)
     onnxExpM = OnnxExp(OnnxMatMul('X', beta32))
     cst = numpy.ones((1, 3), dtype=numpy.float32)
     onnxExpM1 = OnnxAdd(onnxExpM, cst)
     onnxPred = OnnxDiv(onnxExpM, onnxExpM1)
     inputs = {'X': X[:1].astype(numpy.float32)}
     model_onnx = onnxPred.to_onnx(inputs)
     s1 = str(model_onnx)
     model_onnx = onnxPred.to_onnx(inputs)
     s2 = str(model_onnx)
     assert s1 == s2
Exemplo n.º 2
0
def _rewrite_op_no_grad(onx):
    """
    Rewrites operators with no gradient.
    """
    set_types = set(n.op_type for n in onx.graph.node)
    if "Reciprocal" in set_types:
        from skl2onnx.algebra.onnx_ops import OnnxDiv  # pylint: disable=E0611
        from skl2onnx.common.data_types import FloatTensorType
        from .onnx_rewriter import onnx_rewrite_operator

        opset = None
        for op in onx.opset_import:
            if op.domain in ('', 'ai.onnx'):
                opset = op.version
        if opset is None:  # pragma: no cover
            from .. import get_max_opset
            opset = get_max_opset()

        node = OnnxDiv(numpy.array([1], dtype=numpy.float32),
                       'X',
                       output_names=['Y'],
                       op_version=opset)
        rewrite_onx = node.to_onnx(inputs={'X': FloatTensorType()},
                                   outputs={'Y': FloatTensorType()},
                                   target_opset=opset)
        onx = onnx_rewrite_operator(onx, 'Reciprocal', rewrite_onx)

    return onx
Exemplo n.º 3
0
    def test_onnx_rewrite_operator(self):
        opset = get_max_opset()
        node1 = OnnxReciprocal('X', output_names=['Y'],
                               op_version=opset)
        onx1 = node1.to_onnx(
            inputs={'X': FloatTensorType()},
            outputs={'Y': FloatTensorType()},
            target_opset=opset)
        onx1.graph.name = "jjj"
        oinf1 = OnnxInference(onx1)

        node2 = OnnxDiv(numpy.array([1], dtype=numpy.float32),
                        'X', output_names=['Y'],
                        op_version=opset)
        onx2 = node2.to_onnx(
            inputs={'X': FloatTensorType()},
            outputs={'Y': FloatTensorType()},
            target_opset=opset)
        oinf2 = OnnxInference(onx2)
        X = numpy.array([[5, 6]], dtype=numpy.float32)
        y1 = oinf1.run({'X': X})['Y']
        y2 = oinf2.run({'X': X})['Y']
        self.assertEqualArray(y1, y2)

        onx3 = onnx_rewrite_operator(onx1, 'Reciprocal', onx2)
        self.assertNotIn('Reciprocal', str(onx3))
        oinf3 = OnnxInference(onx3)
        y3 = oinf3.run({'X': X})['Y']
        self.assertEqualArray(y1, y3)
Exemplo n.º 4
0
 def test_algebra_to_onnx(self):
     X = numpy.random.randn(5, 4)
     beta = numpy.array([1, 2, 3, 4]) / 10
     beta32 = beta.astype(numpy.float32)
     onnxExpM = OnnxExp(OnnxMatMul('X', beta32))
     cst = numpy.ones((1, 3), dtype=numpy.float32)
     onnxExpM1 = OnnxAdd(onnxExpM, cst)
     onnxPred = OnnxDiv(onnxExpM, onnxExpM1)
     inputs = {'X': X[:1].astype(numpy.float32)}
     model_onnx = onnxPred.to_onnx(inputs)
     s1 = str(model_onnx)
     model_onnx = onnxPred.to_onnx(inputs)
     s2 = str(model_onnx)
     assert s1 == s2
     nin = list(onnxExpM1.enumerate_initial_types())
     nno = list(onnxExpM1.enumerate_nodes())
     nva = list(onnxExpM1.enumerate_variables())
     self.assertEqual(len(nin), 0)
     self.assertEqual(len(nno), 3)
     self.assertEqual(len(nva), 0)