Skip to content
This repository has been archived by the owner on Jan 13, 2024. It is now read-only.

Commit

Permalink
fix a couple of issue in runtime
Browse files Browse the repository at this point in the history
  • Loading branch information
sdpython committed Oct 18, 2019
1 parent 00ec478 commit ea30e4e
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 6 deletions.
33 changes: 32 additions & 1 deletion _unittests/ut_onnx_conv/test_onnx_conv_knn.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
from pandas import DataFrame
from scipy.spatial.distance import cdist as scipy_cdist
from pyquickhelper.pycode import ExtTestCase, unittest_require_at_least
from sklearn.calibration import CalibratedClassifierCV
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import (
Expand All @@ -23,7 +24,9 @@
from onnxruntime.capi.onnxruntime_pybind11_state import InvalidArgument as OrtInvalidArgument
except ImportError:
OrtInvalidArgument = RuntimeError
from mlprodict.onnx_conv import register_converters, to_onnx, get_onnx_opset
from mlprodict.onnx_conv import (
register_converters, to_onnx, get_onnx_opset
)
from mlprodict.onnx_conv.sklconv.knn import onnx_cdist
from mlprodict.onnxrt import OnnxInference
from mlprodict.onnxrt.ops_cpu.op_topk import topk_sorted_implementation
Expand Down Expand Up @@ -279,6 +282,10 @@ def test_onnx_test_knn_single_reg64(self):
def test_onnx_test_knn_single_reg32_target2(self):
self.onnx_test_knn_single_classreg(numpy.float32, n_targets=2)

def test_onnx_test_knn_single_reg32_target2_onnxruntime(self):
self.onnx_test_knn_single_classreg(
numpy.float32, n_targets=2, runtime="onnxruntime1")

def test_onnx_test_knn_single_reg32_k1(self):
self.onnx_test_knn_single_classreg(numpy.float32, n_neighbors=1)

Expand Down Expand Up @@ -327,6 +334,10 @@ def test_onnx_test_knn_single_reg_equal(self):
def test_onnx_test_knn_single_bin32(self):
self.onnx_test_knn_single_classreg(numpy.float32, kind='bin')

def test_onnx_test_knn_single_bin32_onnxruntime(self):
self.onnx_test_knn_single_classreg(
numpy.float32, kind='bin', runtime="onnxruntime1")

def test_onnx_test_knn_single_bin32_cdist(self):
self.onnx_test_knn_single_classreg(
numpy.float32, kind='bin', optim='cdist')
Expand Down Expand Up @@ -384,6 +395,26 @@ def test_onnx_test_knn_transform(self):
decimal=5)
self.assertEqualArray(ind, y['index'])

# calibrated

def test_model_calibrated_classifier_cv_isotonic_binary_knn(self):
data = load_iris()
X, y = data.data, data.target
y[y > 1] = 1
clf = KNeighborsClassifier().fit(X, y)
model = CalibratedClassifierCV(clf, cv=2, method="isotonic").fit(X, y)
model_onnx = skl2onnx.convert_sklearn(
model,
"scikit-learn CalibratedClassifierCV",
[("input", FloatTensorType([None, X.shape[1]]))],
)
oinf = OnnxInference(model_onnx, runtime='python')
y = oinf.run({'input': X.astype(numpy.float32)})
pred = clf.predict(X)
probs = clf.predict_proba(X)
self.assertEqual(pred, y['output_label'])
self.assertEqual(probs, DataFrame(y['output_probability']).values)


if __name__ == "__main__":
unittest.main()
2 changes: 1 addition & 1 deletion mlprodict/onnx_conv/sklconv/knn.py
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,7 @@ def _convert_nearest_neighbors(scope, operator, container):
# shape = (ntargets, ) + shape
training_labels = training_labels.T
shape = OnnxConcat(numpy.array([ndim], dtype=numpy.int64),
shape, op_version=opv)
shape, op_version=opv, axis=0)
axis = 2
else:
training_labels = training_labels.ravel()
Expand Down
14 changes: 10 additions & 4 deletions mlprodict/onnxrt/ops_cpu/_op.py
Original file line number Diff line number Diff line change
Expand Up @@ -454,11 +454,17 @@ def _run(self, a, b): # pylint: disable=W0221
if self.inplaces.get(0, False) and a.size >= b.size:
if len(a.shape) == 1 and b.shape == (1, 1):
a = a.reshape(1, a.shape[0])
self.numpy_fct(a, b, out=a)
return (a, )
try:
self.numpy_fct(a, b, out=a)
return (a, )
except ValueError:
return (self.numpy_fct(a, b), )
if self.inplaces.get(1, False) and a.size <= b.size:
if len(b.shape) == 1 and a.shape == (1, 1):
b = b.reshape(b.shape[0], 1)
self.numpy_fct(a, b, out=b)
return (b, )
try:
self.numpy_fct(a, b, out=b)
return (b, )
except ValueError:
return (self.numpy_fct(a, b), )
return (self.numpy_fct(a, b), )

0 comments on commit ea30e4e

Please sign in to comment.