This is an automated email from the ASF dual-hosted git repository.
masahi pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tvm.git
The following commit(s) were added to refs/heads/main by this push:
new 4974b51 Onnx squeeze enabled with auto axis handling. (#10742)
4974b51 is described below
commit 4974b51b0b8281d9c16c98495de806c0eb3d18d8
Author: Jiawei Liu <[email protected]>
AuthorDate: Thu Mar 24 16:02:09 2022 -0500
Onnx squeeze enabled with auto axis handling. (#10742)
* fix squeeze when axis is absent
* lint
* tidy code
* fix argument
---
python/tvm/relay/frontend/onnx.py | 12 +++++++++++-
tests/python/frontend/onnx/test_forward.py | 27 +++++++++++++++------------
2 files changed, 26 insertions(+), 13 deletions(-)
diff --git a/python/tvm/relay/frontend/onnx.py
b/python/tvm/relay/frontend/onnx.py
index 8b1b152..eea5008 100644
--- a/python/tvm/relay/frontend/onnx.py
+++ b/python/tvm/relay/frontend/onnx.py
@@ -1484,11 +1484,21 @@ class Squeeze(OnnxOpConverter):
@classmethod
def _impl_v13(cls, inputs, attr, params):
+ ishape = infer_shape(inputs[0])
axis = inputs[1]
+
+ if axis is None:
+ # If axes is not provided, all the single dimensions will be
removed from the shape.
+ if not ishape: # scalar
+ return inputs[0]
+
+ axis = [i for i in range(len(ishape)) if ishape[i] == 1]
+ axis = _op.const(axis)
+
dtype = infer_type(axis).checked_type.dtype
if isinstance(axis, _expr.Constant):
- constant_axes = list(inputs[1].data.numpy())
+ constant_axes = list(axis.data.numpy())
constant_axes = list(map(int, constant_axes))
return _op.squeeze(inputs[0], constant_axes)
diff --git a/tests/python/frontend/onnx/test_forward.py
b/tests/python/frontend/onnx/test_forward.py
index 4ab3e81..a526da5 100644
--- a/tests/python/frontend/onnx/test_forward.py
+++ b/tests/python/frontend/onnx/test_forward.py
@@ -550,20 +550,23 @@ def test_range(target, dev):
@tvm.testing.parametrize_targets
def test_squeeze(target, dev):
- in_shape = (1, 3, 1, 3, 1, 1)
- out_shape = (3, 3)
- y = helper.make_node("Squeeze", ["in"], ["out"], axes=[0, 2, 4, 5])
+ def test_squeeze_once(in_shape, out_shape, axes=None):
+ y = helper.make_node("Squeeze", ["in"], ["out"], axes=axes)
- graph = helper.make_graph(
- [y],
- "squeeze_test",
- inputs=[helper.make_tensor_value_info("in", TensorProto.FLOAT,
list(in_shape))],
- outputs=[helper.make_tensor_value_info("out", TensorProto.FLOAT,
list(out_shape))],
- )
+ graph = helper.make_graph(
+ [y],
+ "squeeze_test",
+ inputs=[helper.make_tensor_value_info("in", TensorProto.FLOAT,
list(in_shape))],
+ outputs=[helper.make_tensor_value_info("out", TensorProto.FLOAT,
list(out_shape))],
+ )
- model = helper.make_model(graph, producer_name="squeeze_test")
- x = np.random.uniform(size=in_shape).astype("float32")
- verify_with_ort_with_inputs(model, [x], [out_shape], target=target,
dev=dev, opset=11)
+ model = helper.make_model(graph, producer_name="squeeze_test")
+ x = np.random.uniform(size=in_shape).astype("float32")
+ verify_with_ort_with_inputs(model, [x], [out_shape], target=target,
dev=dev, opset=11)
+
+ test_squeeze_once((1, 3, 1, 3, 1, 1), (3, 3), [0, 2, 4, 5])
+ test_squeeze_once((1, 3, 1, 3, 1, 1), (3, 3)) # empty axis.
+ test_squeeze_once((), ()) # scalar testing.
@tvm.testing.parametrize_targets