diff --git a/keras/src/backend/openvino/excluded_concrete_tests.txt b/keras/src/backend/openvino/excluded_concrete_tests.txt index f370625284c..a9629d7384a 100644 --- a/keras/src/backend/openvino/excluded_concrete_tests.txt +++ b/keras/src/backend/openvino/excluded_concrete_tests.txt @@ -44,7 +44,6 @@ NumpyDtypeTest::test_meshgrid NumpyDtypeTest::test_minimum_python_types NumpyDtypeTest::test_multiply NumpyDtypeTest::test_power -NumpyDtypeTest::test_prod NumpyDtypeTest::test_quantile NumpyDtypeTest::test_repeat NumpyDtypeTest::test_roll @@ -106,7 +105,6 @@ NumpyOneInputOpsCorrectnessTest::test_pad_int16_constant_2 NumpyOneInputOpsCorrectnessTest::test_pad_int8_constant_2 NumpyOneInputOpsCorrectnessTest::test_pad_uint8_constant_2 NumpyOneInputOpsCorrectnessTest::test_pad_int32_constant_2 -NumpyOneInputOpsCorrectnessTest::test_prod NumpyOneInputOpsCorrectnessTest::test_real NumpyOneInputOpsCorrectnessTest::test_repeat NumpyOneInputOpsCorrectnessTest::test_reshape diff --git a/keras/src/backend/openvino/numpy.py b/keras/src/backend/openvino/numpy.py index 4f0a3fedd12..416887148e4 100644 --- a/keras/src/backend/openvino/numpy.py +++ b/keras/src/backend/openvino/numpy.py @@ -1268,7 +1268,37 @@ def pad(x, pad_width, mode="constant", constant_values=None): def prod(x, axis=None, keepdims=False, dtype=None): - raise NotImplementedError("`prod` is not supported with openvino backend") + if axis == () or axis == []: + return x + x = get_ov_output(x) + x_type = x.get_element_type() + if axis is None: + flatten_shape = ov_opset.constant([-1], Type.i32).output(0) + x = ov_opset.reshape(x, flatten_shape, False).output(0) + axis = 0 + elif isinstance(axis, tuple): + axis = list(axis) + axis = ov_opset.constant(axis, Type.i32).output(0) + if x_type == Type.boolean: + result = ov_opset.reduce_logical_and(x, axis, keepdims).output(0) + result = ov_opset.convert(result, Type.i32).output(0) + return OpenVINOKerasTensor(result) + promotion_map = { + Type.i8: Type.i32, + Type.i16: Type.i32, + Type.u8: Type.u32, + Type.u16: Type.u32, + Type.boolean: Type.i32, + } + promoted_type = promotion_map.get(x_type, x_type) + if x_type != promoted_type: + x = ov_opset.convert(x, promoted_type).output(0) + result = ov_opset.reduce_prod(x, axis, keepdims).output(0) + if dtype is not None: + dtype_string = standardize_dtype(dtype) + target_type = OPENVINO_DTYPES[dtype_string] + result = ov_opset.convert(result, target_type).output(0) + return OpenVINOKerasTensor(result) def quantile(x, q, axis=None, method="linear", keepdims=False):