From 731e9c28a11199423b53be01a9bef84f51dc62b1 Mon Sep 17 00:00:00 2001 From: chuinzer Date: Wed, 30 Apr 2025 21:03:57 +0800 Subject: [PATCH 1/3] flip numpy --- .../openvino/excluded_concrete_tests.txt | 1 - keras/src/backend/openvino/numpy.py | 45 ++++++++++++++++++- 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/keras/src/backend/openvino/excluded_concrete_tests.txt b/keras/src/backend/openvino/excluded_concrete_tests.txt index dd08a17ecd5..e0d25e1452c 100644 --- a/keras/src/backend/openvino/excluded_concrete_tests.txt +++ b/keras/src/backend/openvino/excluded_concrete_tests.txt @@ -82,7 +82,6 @@ NumpyOneInputOpsCorrectnessTest::test_cumprod NumpyOneInputOpsCorrectnessTest::test_diag NumpyOneInputOpsCorrectnessTest::test_diagonal NumpyOneInputOpsCorrectnessTest::test_exp2 -NumpyOneInputOpsCorrectnessTest::test_flip NumpyOneInputOpsCorrectnessTest::test_floor_divide NumpyOneInputOpsCorrectnessTest::test_hstack NumpyOneInputOpsCorrectnessTest::test_imag diff --git a/keras/src/backend/openvino/numpy.py b/keras/src/backend/openvino/numpy.py index 412270ef224..8df423b2ec9 100644 --- a/keras/src/backend/openvino/numpy.py +++ b/keras/src/backend/openvino/numpy.py @@ -1,4 +1,5 @@ import numpy as np +import openvino.runtime.opset1 as ov1 import openvino.runtime.opset14 as ov_opset from openvino import Type @@ -773,7 +774,49 @@ def expm1(x): def flip(x, axis=None): - raise NotImplementedError("`flip` is not supported with openvino backend") + if axis in ((), []): + return x + x = get_ov_output(x) + rank = x.get_partial_shape().rank.get_length() + + if axis is None: + axes = list(range(rank)) + else: + if np.isscalar(axis): + axes = [int(axis)] + else: + axes = [int(a) for a in axis] + axes = [(a + rank) if a < 0 else a for a in axes] + for ax in sorted(axes): + shape = ov_opset.shape_of(x) + + seq_dim = ov_opset.gather( + shape, + ov_opset.constant(ax, Type.i64), + ov_opset.constant(0, Type.i64), + ).output(0) + + batch_axis = 0 if ax != 0 else 1 + batch_dim = ov_opset.gather( + shape, + ov_opset.constant(batch_axis, Type.i64), + ov_opset.constant(0, Type.i64), + ).output(0) + + dims_vec = ov_opset.unsqueeze( + batch_dim, + ov_opset.constant([0], Type.i64), + ).output(0) + + seq_lengths = ov_opset.broadcast(seq_dim, dims_vec).output(0) + + x = ov1.reverse_sequence( + x, + seq_lengths, + batch_axis, + ax, + ).output(0) + return OpenVINOKerasTensor(x) def floor(x): From 533bebec4497d2922a14ae91c38ad336419cb83f Mon Sep 17 00:00:00 2001 From: chuinzer Date: Fri, 2 May 2025 15:49:23 +0800 Subject: [PATCH 2/3] Update excluded_concrete_tests.txt Removed NumpyDtypeTest::test_flip . --- keras/src/backend/openvino/excluded_concrete_tests.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/keras/src/backend/openvino/excluded_concrete_tests.txt b/keras/src/backend/openvino/excluded_concrete_tests.txt index e0d25e1452c..0ff044608f8 100644 --- a/keras/src/backend/openvino/excluded_concrete_tests.txt +++ b/keras/src/backend/openvino/excluded_concrete_tests.txt @@ -20,7 +20,6 @@ NumpyDtypeTest::test_digitize NumpyDtypeTest::test_einsum NumpyDtypeTest::test_exp2 NumpyDtypeTest::test_eye -NumpyDtypeTest::test_flip NumpyDtypeTest::test_floor NumpyDtypeTest::test_hstack NumpyDtypeTest::test_inner From f8ab0e00556cb970fbbab2e0a632dc2cd34f5588 Mon Sep 17 00:00:00 2001 From: chuinzer Date: Fri, 2 May 2025 15:52:06 +0800 Subject: [PATCH 3/3] Removed opset1 Replaced with ov_opset --- keras/src/backend/openvino/numpy.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/keras/src/backend/openvino/numpy.py b/keras/src/backend/openvino/numpy.py index 8df423b2ec9..8b6bea1b45f 100644 --- a/keras/src/backend/openvino/numpy.py +++ b/keras/src/backend/openvino/numpy.py @@ -1,5 +1,4 @@ import numpy as np -import openvino.runtime.opset1 as ov1 import openvino.runtime.opset14 as ov_opset from openvino import Type @@ -810,7 +809,7 @@ def flip(x, axis=None): seq_lengths = ov_opset.broadcast(seq_dim, dims_vec).output(0) - x = ov1.reverse_sequence( + x = ov_opset.reverse_sequence( x, seq_lengths, batch_axis,