pytorch
175 строк · 4.6 Кб
1
2
3
4
5
6from caffe2.python import core, workspace
7from hypothesis import assume, given, settings
8import caffe2.python.hypothesis_test_util as hu
9import caffe2.python.serialized_test.serialized_test_util as serial
10import hypothesis.strategies as st
11import numpy as np
12
13
14class TestReductionOps(serial.SerializedTestCase):
15
16@serial.given(n=st.integers(5, 8), **hu.gcs)
17def test_elementwise_sum(self, n, gc, dc):
18X = np.random.rand(n).astype(np.float32)
19
20def sum_op(X):
21return [np.sum(X)]
22
23op = core.CreateOperator(
24"SumElements",
25["X"],
26["y"]
27)
28
29self.assertReferenceChecks(
30device_option=gc,
31op=op,
32inputs=[X],
33reference=sum_op,
34)
35
36self.assertGradientChecks(
37device_option=gc,
38op=op,
39inputs=[X],
40outputs_to_check=0,
41outputs_with_grads=[0],
42)
43
44@given(n=st.integers(5, 8), **hu.gcs)
45@settings(deadline=10000)
46def test_elementwise_int_sum(self, n, gc, dc):
47X = np.random.rand(n).astype(np.int32)
48
49def sum_op(X):
50return [np.sum(X)]
51
52op = core.CreateOperator(
53"SumElementsInt",
54["X"],
55["y"]
56)
57
58self.assertReferenceChecks(
59device_option=gc,
60op=op,
61inputs=[X],
62reference=sum_op,
63)
64
65@given(n=st.integers(1, 65536),
66dtype=st.sampled_from([np.float32, np.float16]),
67**hu.gcs)
68@settings(deadline=10000)
69def test_elementwise_sqrsum(self, n, dtype, gc, dc):
70if dtype == np.float16:
71# fp16 is only supported with CUDA/HIP
72assume(gc.device_type == workspace.GpuDeviceType)
73dc = [d for d in dc if d.device_type == workspace.GpuDeviceType]
74
75X = np.random.rand(n).astype(dtype)
76
77def sumsqr_op(X):
78return [np.sum(X * X)]
79
80op = core.CreateOperator(
81"SumSqrElements",
82["X"],
83["y"]
84)
85
86threshold = 0.01 if dtype == np.float16 else 0.005
87
88self.assertReferenceChecks(
89device_option=gc,
90op=op,
91inputs=[X],
92reference=sumsqr_op,
93threshold=threshold,
94)
95
96@given(n=st.integers(5, 8), **hu.gcs)
97def test_elementwise_avg(self, n, gc, dc):
98X = np.random.rand(n).astype(np.float32)
99
100def avg_op(X):
101return [np.mean(X)]
102
103op = core.CreateOperator(
104"SumElements",
105["X"],
106["y"],
107average=1
108)
109
110self.assertReferenceChecks(
111device_option=gc,
112op=op,
113inputs=[X],
114reference=avg_op,
115)
116
117self.assertGradientChecks(
118device_option=gc,
119op=op,
120inputs=[X],
121outputs_to_check=0,
122outputs_with_grads=[0],
123)
124
125@serial.given(batch_size=st.integers(1, 3),
126m=st.integers(1, 3),
127n=st.integers(1, 4),
128**hu.gcs)
129def test_rowwise_max(self, batch_size, m, n, gc, dc):
130X = np.random.rand(batch_size, m, n).astype(np.float32)
131
132def rowwise_max(X):
133return [np.max(X, axis=2)]
134
135op = core.CreateOperator(
136"RowwiseMax",
137["x"],
138["y"]
139)
140
141self.assertReferenceChecks(
142device_option=gc,
143op=op,
144inputs=[X],
145reference=rowwise_max,
146)
147
148@serial.given(batch_size=st.integers(1, 3),
149m=st.integers(1, 3),
150n=st.integers(1, 4),
151**hu.gcs)
152def test_columnwise_max(self, batch_size, m, n, gc, dc):
153X = np.random.rand(batch_size, m, n).astype(np.float32)
154
155def columnwise_max(X):
156return [np.max(X, axis=1)]
157
158op = core.CreateOperator(
159"ColwiseMax",
160["x"],
161["y"]
162)
163
164self.assertReferenceChecks(
165device_option=gc,
166op=op,
167inputs=[X],
168reference=columnwise_max,
169)
170
171# Test shape inference logic
172net = core.Net("test_shape_inference")
173workspace.FeedBlob("x", X)
174output = net.ColwiseMax(["x"], ["y"])
175(shapes, types) = workspace.InferShapesAndTypes([net])
176workspace.RunNetOnce(net)
177
178self.assertEqual(shapes[output], list(workspace.blobs[output].shape))
179self.assertEqual(shapes[output], [X.shape[0]] + [X.shape[2]])
180self.assertEqual(types[output], core.DataType.FLOAT)
181