diff --git a/python/tvm/relay/frontend/onnx.py b/python/tvm/relay/frontend/onnx.py index 5471f67ea106..170784bfb007 100644 --- a/python/tvm/relay/frontend/onnx.py +++ b/python/tvm/relay/frontend/onnx.py @@ -945,8 +945,9 @@ def _impl_v1(cls, inputs, attr, params): else: attr["layout"] = onnx_default_layout(dims=(len(input_shape) - 2), op_name="LpPool") - p = _expr.const(attr["p"], dtype) - reci_p = _expr.const(1.0 / attr["p"], dtype) + p_value = attr.get("p", 2) + p = _expr.const(p_value, dtype) + reci_p = _expr.const(1.0 / p_value, dtype) data = _op.power(data, p) out = AttrCvt( diff --git a/tests/python/frontend/onnx/test_forward.py b/tests/python/frontend/onnx/test_forward.py index 9e0eb1f75217..33c20d7c10e3 100644 --- a/tests/python/frontend/onnx/test_forward.py +++ b/tests/python/frontend/onnx/test_forward.py @@ -3185,15 +3185,18 @@ def verify_max_roi_pool(x_shape, rois_shape, pooled_shape, spatial_scale, out_sh @tvm.testing.parametrize_targets def test_lppool(target, dev): def verify_lppool(x_shape, kernel_shape, p, strides, pads, out_shape, auto_pad="NOTSET"): + kwargs = {} + if p is not None: + kwargs["p"] = p if pads is None: pool_node = helper.make_node( "LpPool", inputs=["x"], outputs=["y"], kernel_shape=kernel_shape, - p=p, auto_pad=auto_pad, strides=strides, + **kwargs, ) else: pool_node = helper.make_node( @@ -3201,9 +3204,9 @@ def verify_lppool(x_shape, kernel_shape, p, strides, pads, out_shape, auto_pad=" inputs=["x"], outputs=["y"], kernel_shape=kernel_shape, - p=p, pads=pads, strides=strides, + **kwargs, ) graph = helper.make_graph( @@ -3296,6 +3299,15 @@ def verify_lppool(x_shape, kernel_shape, p, strides, pads, out_shape, auto_pad=" out_shape=[1, 1, 16, 16, 16], auto_pad="SAME_UPPER", ) + # Pool2D with empty p + verify_lppool( + x_shape=[1, 1, 32, 32], + kernel_shape=[3, 3], + p=None, + strides=[1, 1], + pads=[1, 1, 1, 1], + out_shape=[1, 1, 32, 32], + ) def verify_rnn(