diff --git a/keras/src/backend/openvino/excluded_concrete_tests.txt b/keras/src/backend/openvino/excluded_concrete_tests.txt index f1ae053e623..25f7b7162ff 100644 --- a/keras/src/backend/openvino/excluded_concrete_tests.txt +++ b/keras/src/backend/openvino/excluded_concrete_tests.txt @@ -36,7 +36,6 @@ NumpyDtypeTest::test_mean NumpyDtypeTest::test_median NumpyDtypeTest::test_meshgrid NumpyDtypeTest::test_min -NumpyDtypeTest::test_moveaxis NumpyDtypeTest::test_multiply NumpyDtypeTest::test_nan NumpyDtypeTest::test_outer_ @@ -95,7 +94,6 @@ NumpyOneInputOpsCorrectnessTest::test_mean NumpyOneInputOpsCorrectnessTest::test_median NumpyOneInputOpsCorrectnessTest::test_meshgrid NumpyOneInputOpsCorrectnessTest::test_min -NumpyOneInputOpsCorrectnessTest::test_moveaxis NumpyOneInputOpsCorrectnessTest::test_nan_to_num NumpyOneInputOpsCorrectnessTest::test_pad_float16_constant_2 NumpyOneInputOpsCorrectnessTest::test_pad_float32_constant_2 diff --git a/keras/src/backend/openvino/numpy.py b/keras/src/backend/openvino/numpy.py index a242a3c8d56..bb1719016d0 100644 --- a/keras/src/backend/openvino/numpy.py +++ b/keras/src/backend/openvino/numpy.py @@ -1024,9 +1024,37 @@ def mod(x1, x2): def moveaxis(x, source, destination): - raise NotImplementedError( - "`moveaxis` is not supported with openvino backend" - ) + if isinstance(source, int): + source = [source] + if isinstance(destination, int): + destination = [destination] + + x = get_ov_output(x) + x_shape = x.get_partial_shape() + rank = x_shape.rank.get_length() + + source = [s + rank if s < 0 else s for s in source] + destination = [d + rank if d < 0 else d for d in destination] + + axes = list(range(rank)) + + for axis in sorted(source, reverse=True): + axes.pop(axis) + + for dest, src in sorted(zip(destination, source)): + axes.insert(dest, src) + + perm = ov_opset.constant(axes, dtype=Type.i32).output(0) + + x_type = x.get_element_type() + if x_type == Type.bf16: + x = ov_opset.convert(x, Type.f32).output(0) + result = ov_opset.transpose(x, perm).output(0) + return OpenVINOKerasTensor( + ov_opset.convert(result, Type.bf16).output(0) + ) + + return OpenVINOKerasTensor(ov_opset.transpose(x, perm).output(0)) def nan_to_num(x, nan=0.0, posinf=None, neginf=None):