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
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
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)
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)