Skip to content

Commit cffc3f3

Browse files
authored
[Backend Tester] Add maxpool tests (#13240)
Add tests for maxpooling operators. This is done in the context of #12898.
1 parent 4e8c0d1 commit cffc3f3

File tree

3 files changed

+565
-0
lines changed

3 files changed

+565
-0
lines changed
Lines changed: 185 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,185 @@
1+
# Copyright (c) Meta Platforms, Inc. and affiliates.
2+
# All rights reserved.
3+
#
4+
# This source code is licensed under the BSD-style license found in the
5+
# LICENSE file in the root directory of this source tree.
6+
7+
# pyre-unsafe
8+
9+
10+
import torch
11+
from executorch.backends.test.suite.flow import TestFlow
12+
13+
from executorch.backends.test.suite.operators import (
14+
dtype_test,
15+
operator_test,
16+
OperatorTest,
17+
)
18+
19+
20+
class Model(torch.nn.Module):
21+
def __init__(
22+
self,
23+
kernel_size=3,
24+
stride=None,
25+
padding=0,
26+
dilation=1,
27+
return_indices=False,
28+
ceil_mode=False,
29+
):
30+
super().__init__()
31+
self.maxpool = torch.nn.MaxPool1d(
32+
kernel_size=kernel_size,
33+
stride=stride,
34+
padding=padding,
35+
dilation=dilation,
36+
return_indices=return_indices,
37+
ceil_mode=ceil_mode,
38+
)
39+
40+
def forward(self, x):
41+
return self.maxpool(x)
42+
43+
44+
@operator_test
45+
class MaxPool1d(OperatorTest):
46+
@dtype_test
47+
def test_maxpool1d_dtype(self, flow: TestFlow, dtype) -> None:
48+
# Input shape: (batch_size, channels, length)
49+
self._test_op(
50+
Model().to(dtype),
51+
((torch.rand(1, 8, 100) * 10).to(dtype),),
52+
flow,
53+
)
54+
55+
def test_maxpool1d_kernel_size(self, flow: TestFlow) -> None:
56+
# Test with different kernel sizes
57+
self._test_op(
58+
Model(kernel_size=1),
59+
(torch.randn(1, 8, 100),),
60+
flow,
61+
)
62+
self._test_op(
63+
Model(kernel_size=5),
64+
(torch.randn(1, 8, 100),),
65+
flow,
66+
)
67+
68+
def test_maxpool1d_stride(self, flow: TestFlow) -> None:
69+
# Test with different stride values
70+
self._test_op(
71+
Model(stride=2),
72+
(torch.randn(1, 8, 100),),
73+
flow,
74+
)
75+
self._test_op(
76+
Model(stride=3),
77+
(torch.randn(1, 8, 100),),
78+
flow,
79+
)
80+
81+
def test_maxpool1d_padding(self, flow: TestFlow) -> None:
82+
# Test with different padding values
83+
self._test_op(
84+
Model(padding=1),
85+
(torch.randn(1, 8, 100),),
86+
flow,
87+
)
88+
self._test_op(
89+
Model(padding=2),
90+
(torch.randn(1, 8, 100),),
91+
flow,
92+
)
93+
94+
def test_maxpool1d_dilation(self, flow: TestFlow) -> None:
95+
# Test with different dilation values
96+
self._test_op(
97+
Model(dilation=2),
98+
(torch.randn(1, 8, 100),),
99+
flow,
100+
)
101+
self._test_op(
102+
Model(dilation=3),
103+
(torch.randn(1, 8, 100),),
104+
flow,
105+
)
106+
107+
def test_maxpool1d_ceil_mode(self, flow: TestFlow) -> None:
108+
# Test with ceil_mode=True
109+
self._test_op(
110+
Model(ceil_mode=True),
111+
(torch.randn(1, 8, 100),),
112+
flow,
113+
)
114+
115+
def test_maxpool1d_return_indices(self, flow: TestFlow) -> None:
116+
# Test with return_indices=True
117+
class ModelWithIndices(torch.nn.Module):
118+
def __init__(self):
119+
super().__init__()
120+
self.maxpool = torch.nn.MaxPool1d(
121+
kernel_size=3,
122+
stride=2,
123+
padding=1,
124+
return_indices=True,
125+
)
126+
127+
def forward(self, x):
128+
return self.maxpool(x)
129+
130+
input_tensor = torch.randn(1, 8, 100)
131+
132+
self._test_op(
133+
Model(kernel_size=3, stride=2, padding=1),
134+
(input_tensor,),
135+
flow,
136+
)
137+
138+
def test_maxpool1d_batch_sizes(self, flow: TestFlow) -> None:
139+
# Test with batch inputs
140+
self._test_op(
141+
Model(),
142+
(torch.randn(2, 8, 100),),
143+
flow,
144+
)
145+
self._test_op(
146+
Model(),
147+
(torch.randn(8, 8, 100),),
148+
flow,
149+
)
150+
self._test_op(
151+
Model(),
152+
(torch.randn(16, 8, 100),),
153+
flow,
154+
)
155+
156+
def test_maxpool1d_input_sizes(self, flow: TestFlow) -> None:
157+
# Test with different input sizes
158+
self._test_op(
159+
Model(),
160+
(torch.randn(1, 4, 100),),
161+
flow,
162+
)
163+
self._test_op(
164+
Model(),
165+
(torch.randn(1, 16, 100),),
166+
flow,
167+
)
168+
169+
def test_maxpool1d_combinations(self, flow: TestFlow) -> None:
170+
# Test with combinations of parameters
171+
self._test_op(
172+
Model(kernel_size=2, stride=2, padding=1),
173+
(torch.randn(1, 8, 100),),
174+
flow,
175+
)
176+
self._test_op(
177+
Model(kernel_size=3, stride=2, padding=1, ceil_mode=True),
178+
(torch.randn(1, 8, 100),),
179+
flow,
180+
)
181+
self._test_op(
182+
Model(kernel_size=2, stride=2, padding=1, dilation=2),
183+
(torch.randn(1, 8, 100),),
184+
flow,
185+
)
Lines changed: 191 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,191 @@
1+
# Copyright (c) Meta Platforms, Inc. and affiliates.
2+
# All rights reserved.
3+
#
4+
# This source code is licensed under the BSD-style license found in the
5+
# LICENSE file in the root directory of this source tree.
6+
7+
# pyre-unsafe
8+
9+
10+
import torch
11+
from executorch.backends.test.suite.flow import TestFlow
12+
13+
from executorch.backends.test.suite.operators import (
14+
dtype_test,
15+
operator_test,
16+
OperatorTest,
17+
)
18+
19+
20+
class Model(torch.nn.Module):
21+
def __init__(
22+
self,
23+
kernel_size=3,
24+
stride=None,
25+
padding=0,
26+
dilation=1,
27+
return_indices=False,
28+
ceil_mode=False,
29+
):
30+
super().__init__()
31+
self.maxpool = torch.nn.MaxPool2d(
32+
kernel_size=kernel_size,
33+
stride=stride,
34+
padding=padding,
35+
dilation=dilation,
36+
return_indices=return_indices,
37+
ceil_mode=ceil_mode,
38+
)
39+
40+
def forward(self, x):
41+
return self.maxpool(x)
42+
43+
44+
@operator_test
45+
class MaxPool2d(OperatorTest):
46+
@dtype_test
47+
def test_maxpool2d_dtype(self, flow: TestFlow, dtype) -> None:
48+
# Input shape: (batch_size, channels, height, width)
49+
self._test_op(
50+
Model().to(dtype),
51+
((torch.rand(1, 8, 20, 20) * 10).to(dtype),),
52+
flow,
53+
)
54+
55+
def test_maxpool2d_kernel_size(self, flow: TestFlow) -> None:
56+
# Test with different kernel sizes
57+
self._test_op(
58+
Model(kernel_size=1),
59+
(torch.randn(1, 8, 20, 20),),
60+
flow,
61+
)
62+
self._test_op(
63+
Model(kernel_size=5),
64+
(torch.randn(1, 8, 20, 20),),
65+
flow,
66+
)
67+
self._test_op(
68+
Model(kernel_size=(3, 2)),
69+
(torch.randn(1, 8, 20, 20),),
70+
flow,
71+
)
72+
73+
def test_maxpool2d_stride(self, flow: TestFlow) -> None:
74+
# Test with different stride values
75+
self._test_op(
76+
Model(stride=2),
77+
(torch.randn(1, 8, 20, 20),),
78+
flow,
79+
)
80+
self._test_op(
81+
Model(stride=(2, 1)),
82+
(torch.randn(1, 8, 20, 20),),
83+
flow,
84+
)
85+
86+
def test_maxpool2d_padding(self, flow: TestFlow) -> None:
87+
# Test with different padding values
88+
self._test_op(
89+
Model(padding=1),
90+
(torch.randn(1, 8, 20, 20),),
91+
flow,
92+
)
93+
self._test_op(
94+
Model(padding=(1, 2)),
95+
(torch.randn(1, 8, 20, 20),),
96+
flow,
97+
)
98+
99+
def test_maxpool2d_dilation(self, flow: TestFlow) -> None:
100+
# Test with different dilation values
101+
self._test_op(
102+
Model(dilation=2),
103+
(torch.randn(1, 8, 20, 20),),
104+
flow,
105+
)
106+
self._test_op(
107+
Model(dilation=(2, 1)),
108+
(torch.randn(1, 8, 20, 20),),
109+
flow,
110+
)
111+
112+
def test_maxpool2d_ceil_mode(self, flow: TestFlow) -> None:
113+
# Test with ceil_mode=True
114+
self._test_op(
115+
Model(ceil_mode=True),
116+
(torch.randn(1, 8, 20, 20),),
117+
flow,
118+
)
119+
120+
def test_maxpool2d_return_indices(self, flow: TestFlow) -> None:
121+
# Test with return_indices=True
122+
class ModelWithIndices(torch.nn.Module):
123+
def __init__(self):
124+
super().__init__()
125+
self.maxpool = torch.nn.MaxPool2d(
126+
kernel_size=3,
127+
stride=2,
128+
padding=1,
129+
return_indices=True,
130+
)
131+
132+
def forward(self, x):
133+
return self.maxpool(x)
134+
135+
# Create a test input tensor
136+
input_tensor = torch.randn(1, 8, 20, 20)
137+
138+
self._test_op(
139+
Model(kernel_size=3, stride=2, padding=1),
140+
(input_tensor,),
141+
flow,
142+
)
143+
144+
def test_maxpool2d_batch_sizes(self, flow: TestFlow) -> None:
145+
# Test with batch inputs
146+
self._test_op(
147+
Model(),
148+
(torch.randn(2, 8, 20, 20),),
149+
flow,
150+
)
151+
self._test_op(
152+
Model(),
153+
(torch.randn(8, 8, 20, 20),),
154+
flow,
155+
)
156+
self._test_op(
157+
Model(),
158+
(torch.randn(16, 8, 20, 20),),
159+
flow,
160+
)
161+
162+
def test_maxpool2d_input_sizes(self, flow: TestFlow) -> None:
163+
# Test with different input sizes
164+
self._test_op(
165+
Model(),
166+
(torch.randn(1, 4, 20, 20),),
167+
flow,
168+
)
169+
self._test_op(
170+
Model(),
171+
(torch.randn(1, 16, 20, 20),),
172+
flow,
173+
)
174+
175+
def test_maxpool2d_combinations(self, flow: TestFlow) -> None:
176+
# Test with combinations of parameters
177+
self._test_op(
178+
Model(kernel_size=2, stride=2, padding=1),
179+
(torch.randn(1, 8, 20, 20),),
180+
flow,
181+
)
182+
self._test_op(
183+
Model(kernel_size=3, stride=2, padding=1, ceil_mode=True),
184+
(torch.randn(1, 8, 21, 21),),
185+
flow,
186+
)
187+
self._test_op(
188+
Model(kernel_size=(2, 3), stride=(2, 1), padding=(1, 0), dilation=2),
189+
(torch.randn(1, 8, 20, 20),),
190+
flow,
191+
)

0 commit comments

Comments
 (0)