Skip to content

Commit b39da4b

Browse files
Merge pull request #865 from RandySheriffH/rashuai/NegativeAxisReduce
allow negative axis
2 parents 23e8ae4 + f96f726 commit b39da4b

File tree

2 files changed

+34
-1
lines changed

2 files changed

+34
-1
lines changed

tests/test_backend.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2376,6 +2376,38 @@ def func(x):
23762376
return tf.identity(res, name=_TFOUTPUT), tf.identity(res1, name=_TFOUTPUT1)
23772377
self._run_test_case(func, [_OUTPUT, _OUTPUT1], {_INPUT: input_val})
23782378

2379+
@check_opset_min_version(11, "ReduceMin")
2380+
def test_reduce_all_negative_axis(self):
2381+
input_val = np.random.randint(0, 2, (10, 20)).astype(np.bool)
2382+
def func(x):
2383+
res = tf.reduce_all(input_tensor=x, keepdims=False)
2384+
res1 = tf.reduce_all(input_tensor=x, axis=[-1], keepdims=False)
2385+
return tf.identity(res, name=_TFOUTPUT), tf.identity(res1, name=_TFOUTPUT1)
2386+
self._run_test_case(func, [_OUTPUT, _OUTPUT1], {_INPUT: input_val})
2387+
2388+
input_val = np.random.randint(0, 2, (10, 20)).astype(np.bool)
2389+
def func(input_x):
2390+
res = tf.reduce_all(input_tensor=input_x, keepdims=True)
2391+
res1 = tf.reduce_all(input_tensor=input_x, axis=[-1], keepdims=True)
2392+
return tf.identity(res, name=_TFOUTPUT), tf.identity(res1, name=_TFOUTPUT1)
2393+
self._run_test_case(func, [_OUTPUT, _OUTPUT1], {_INPUT: input_val})
2394+
2395+
@check_opset_min_version(11, "ReduceSum")
2396+
def test_reduce_any_negative_axis(self):
2397+
input_val = np.random.randint(0, 2, (10, 20)).astype(np.bool)
2398+
def func(x):
2399+
res = tf.reduce_any(input_tensor=x, keepdims=False)
2400+
res1 = tf.reduce_any(input_tensor=x, axis=[-1], keepdims=False)
2401+
return tf.identity(res, name=_TFOUTPUT), tf.identity(res1, name=_TFOUTPUT1)
2402+
self._run_test_case(func, [_OUTPUT, _OUTPUT1], {_INPUT: input_val})
2403+
2404+
input_val = np.random.randint(0, 2, (10, 20)).astype(np.bool)
2405+
def func(x):
2406+
res = tf.reduce_any(input_tensor=x, keepdims=True)
2407+
res1 = tf.reduce_any(input_tensor=x, axis=[-1], keepdims=True)
2408+
return tf.identity(res, name=_TFOUTPUT), tf.identity(res1, name=_TFOUTPUT1)
2409+
self._run_test_case(func, [_OUTPUT, _OUTPUT1], {_INPUT: input_val})
2410+
23792411
@check_opset_min_version(7, "fill")
23802412
def test_zeros_like(self):
23812413
input_val = np.random.random_sample([10, 20]).astype(np.float32)

tf2onnx/onnx_opset/reduction.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,8 @@ def version_6(cls, ctx, node, **kwargs):
102102
if np.isscalar(reduce_dim):
103103
reduce_dim = [reduce_dim]
104104

105-
utils.make_sure(all(i >= 0 for i in reduce_dim), "negative reduce axis is not supported in onnx for now")
105+
if ctx.opset < 11:
106+
utils.make_sure(all(i >= 0 for i in reduce_dim), "negative reduce axis is not supported in onnx for now")
106107

107108
cast = ctx.make_node(op_type="Cast", inputs=[node.input[0]], attr={"to": onnx_pb.TensorProto.FLOAT})
108109
keepdims = helper.get_attribute_value(node.get_attr("keep_dims"))

0 commit comments

Comments
 (0)