blob: 94e9b95202f378b003f977662180b4ca963d083d [file] [log] [blame]
Kaizen8938bd32017-09-28 14:38:23 +01001/*
2 * Copyright (c) 2017 ARM Limited.
3 *
4 * SPDX-License-Identifier: MIT
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to
8 * deal in the Software without restriction, including without limitation the
9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10 * sell copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in all
14 * copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 * SOFTWARE.
23 */
24#include "arm_compute/core/Types.h"
25#include "arm_compute/runtime/CL/CLTensor.h"
26#include "arm_compute/runtime/CL/CLTensorAllocator.h"
27#include "arm_compute/runtime/CL/functions/CLDirectConvolutionLayer.h"
28#include "tests/CL/CLAccessor.h"
29#include "tests/PaddingCalculator.h"
Anthony Barbier8140e1e2017-12-14 23:48:46 +000030#include "tests/datasets/DirectConvolutionLayerDataset.h"
Kaizen8938bd32017-09-28 14:38:23 +010031#include "tests/datasets/ShapeDatasets.h"
32#include "tests/framework/Asserts.h"
33#include "tests/framework/Macros.h"
34#include "tests/framework/datasets/Datasets.h"
35#include "tests/validation/Validation.h"
36#include "tests/validation/fixtures/DirectConvolutionLayerFixture.h"
37
38namespace arm_compute
39{
40namespace test
41{
42namespace validation
43{
44namespace
45{
46// COMPMID-517 Invesitgate the mismatch to see whether it is a real bug
47RelativeTolerance<half> tolerance_fp16(half(0.2)); /**< Tolerance for floating point tests */
48RelativeTolerance<float> tolerance_fp32(0.02f); /**< Tolerance for floating point tests */
49constexpr float tolerance_num = 0.07f; /**< Tolerance number */
50
Anthony Barbier8140e1e2017-12-14 23:48:46 +000051constexpr AbsoluteTolerance<int8_t> tolerance_qs8(0); /**< Tolerance for fixed point tests */
52constexpr AbsoluteTolerance<int16_t> tolerance_qs16(0); /**< Tolerance for fixed point tests */
53constexpr AbsoluteTolerance<uint8_t> tolerance_qasymm8(1); /**< Tolerance for quantized tests */
Kaizen8938bd32017-09-28 14:38:23 +010054
55/** Direct convolution data set. */
Kaizen8938bd32017-09-28 14:38:23 +010056const auto data = combine(datasets::SmallDirectConvolutionShapes(),
57 combine(framework::dataset::make("StrideX", 1, 3),
58 combine(framework::dataset::make("StrideY", 1, 3),
59 combine(concat(combine(framework::dataset::make("PadX", 0),
60 combine(framework::dataset::make("PadY", 0),
61 framework::dataset::make("KernelSize", 1))),
62 combine(framework::dataset::make("PadX", 0, 2),
63 combine(framework::dataset::make("PadY", 0, 2),
64 framework::dataset::make("KernelSize", { 3, 5 })))),
65 framework::dataset::make("NumKernels", { 1, 4, 8, 16 })))));
Anthony Barbier8140e1e2017-12-14 23:48:46 +000066const auto data_fixed_point = combine(datasets::SmallDirectConvolutionShapes(),
67 combine(framework::dataset::make("StrideX", 1, 3),
68 combine(framework::dataset::make("StrideY", 1, 3),
69 combine(concat(combine(framework::dataset::make("PadX", 0),
70 combine(framework::dataset::make("PadY", 0),
71 framework::dataset::make("KernelSize", 1))),
72 combine(framework::dataset::make("PadX", 0, 2),
73 combine(framework::dataset::make("PadY", 0, 2),
74 framework::dataset::make("KernelSize", { 3 })))),
75 framework::dataset::make("NumKernels", { 1, 4, 8, 16 })))));
Kaizen8938bd32017-09-28 14:38:23 +010076} // namespace
77
78TEST_SUITE(CL)
79TEST_SUITE(DirectConvolutionLayer)
80
Anthony Barbier8140e1e2017-12-14 23:48:46 +000081// *INDENT-OFF*
82// clang-format off
83DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(zip(zip(
84 framework::dataset::make("InputInfo", { TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32, 0), // Mismatching data type input/weights
85 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32, 0), // Mismatching input feature maps
86 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32, 0), // Unsupported kernel width
87 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32, 0), // Non-rectangular weights dimensions
88 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32, 0), // Invalid weights dimensions
89 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32, 0), // Invalid stride
90 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32, 0), // Invalid biases size
91 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32, 0), // Invalid biases dimensions
92 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32, 0), // Invalid output size
93 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32, 0), // Window shrink
94 TensorInfo(TensorShape(32U, 16U, 2U), 1, DataType::F32, 0),
95 }),
96 framework::dataset::make("WeightsInfo",{ TensorInfo(TensorShape(3U, 3U, 2U, 4U), 1, DataType::F16, 0),
97 TensorInfo(TensorShape(3U, 3U, 3U, 4U), 1, DataType::F32, 0),
98 TensorInfo(TensorShape(9U, 9U, 2U, 4U), 1, DataType::F32, 0),
99 TensorInfo(TensorShape(5U, 3U, 2U, 4U), 1, DataType::F32, 0),
100 TensorInfo(TensorShape(3U, 3U, 2U, 4U, 3U), 1, DataType::F32, 0),
101 TensorInfo(TensorShape(3U, 3U, 2U, 4U), 1, DataType::F32, 0),
102 TensorInfo(TensorShape(3U, 3U, 2U, 4U), 1, DataType::F32, 0),
103 TensorInfo(TensorShape(3U, 3U, 2U, 4U), 1, DataType::F32, 0),
104 TensorInfo(TensorShape(3U, 3U, 2U, 4U), 1, DataType::F32, 0),
105 TensorInfo(TensorShape(3U, 3U, 2U, 4U), 1, DataType::F32, 0),
106 TensorInfo(TensorShape(1U, 1U, 2U, 4U), 1, DataType::F32, 0),
107 })),
108 framework::dataset::make("BiasesInfo",{ TensorInfo(TensorShape(4U), 1, DataType::F32, 0),
109 TensorInfo(TensorShape(4U), 1, DataType::F32, 0),
110 TensorInfo(TensorShape(4U), 1, DataType::F32, 0),
111 TensorInfo(TensorShape(4U), 1, DataType::F32, 0),
112 TensorInfo(TensorShape(4U), 1, DataType::F32, 0),
113 TensorInfo(TensorShape(4U), 1, DataType::F32, 0),
114 TensorInfo(TensorShape(3U), 1, DataType::F32, 0),
115 TensorInfo(TensorShape(4U, 2U), 1, DataType::F32, 0),
116 TensorInfo(TensorShape(4U), 1, DataType::F32, 0),
117 TensorInfo(TensorShape(4U), 1, DataType::F32, 0),
118 TensorInfo(TensorShape(4U), 1, DataType::F32, 0),
119 })),
120 framework::dataset::make("OutputInfo",{ TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32, 0),
121 TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32, 0),
122 TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32, 0),
123 TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32, 0),
124 TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32, 0),
125 TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32, 0),
126 TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32, 0),
127 TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32, 0),
128 TensorInfo(TensorShape(26U, 11U, 4U), 1, DataType::F32, 0),
129 TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32, 0),
130 TensorInfo(TensorShape(32U, 16U, 4U), 1, DataType::F32, 0),
131 })),
132 framework::dataset::make("ConvInfo", { PadStrideInfo(1, 1, 0, 0),
133 PadStrideInfo(1, 1, 0, 0),
134 PadStrideInfo(1, 1, 0, 0),
135 PadStrideInfo(1, 1, 0, 0),
136 PadStrideInfo(1, 1, 0, 0),
137 PadStrideInfo(3, 3, 0, 0),
138 PadStrideInfo(1, 1, 0, 0),
139 PadStrideInfo(1, 1, 0, 0),
140 PadStrideInfo(1, 1, 0, 0),
141 PadStrideInfo(1, 1, 0, 0),
142 PadStrideInfo(1, 1, 0, 0),
143 })),
144 framework::dataset::make("Expected", { false, false, false, false, false, false, false, false, false, false, true })),
145 input_info, weights_info, biases_info, output_info, conv_info, expected)
146{
147 bool is_valid = bool(CLDirectConvolutionLayer::validate(&input_info.clone()->set_is_resizable(false), &weights_info.clone()->set_is_resizable(false), &biases_info.clone()->set_is_resizable(false), &output_info.clone()->set_is_resizable(false), conv_info));
148 ARM_COMPUTE_EXPECT(is_valid == expected, framework::LogLevel::ERRORS);
149}
150// clang-format on
151// *INDENT-ON*
152
Kaizen8938bd32017-09-28 14:38:23 +0100153template <typename T>
154using CLDirectConvolutionLayerFixture = DirectConvolutionValidationFixture<CLTensor, CLAccessor, CLDirectConvolutionLayer, T>;
Anthony Barbier8140e1e2017-12-14 23:48:46 +0000155template <typename T>
156using CLDirectConvolutionValidationWithTensorShapesFixture = DirectConvolutionValidationWithTensorShapesFixture<CLTensor, CLAccessor, CLDirectConvolutionLayer, T>;
Kaizen8938bd32017-09-28 14:38:23 +0100157
158TEST_SUITE(Float)
159TEST_SUITE(FP16)
160FIXTURE_DATA_TEST_CASE(Run, CLDirectConvolutionLayerFixture<half>, framework::DatasetMode::ALL, combine(data, framework::dataset::make("DataType", DataType::F16)))
161{
162 // Validate output
163 validate(CLAccessor(_target), _reference, tolerance_fp16, tolerance_num);
164}
165TEST_SUITE_END()
166
167TEST_SUITE(FP32)
168FIXTURE_DATA_TEST_CASE(Run, CLDirectConvolutionLayerFixture<float>, framework::DatasetMode::ALL, combine(data, framework::dataset::make("DataType", DataType::F32)))
169{
170 // Validate output
171 validate(CLAccessor(_target), _reference, tolerance_fp32);
172}
173TEST_SUITE_END()
Anthony Barbier8140e1e2017-12-14 23:48:46 +0000174
175TEST_SUITE(FP32_CustomDataset)
176FIXTURE_DATA_TEST_CASE(Run, CLDirectConvolutionValidationWithTensorShapesFixture<float>, framework::DatasetMode::ALL, combine(datasets::DirectConvolutionLayerDataset(),
177 framework::dataset::make("DataType", DataType::F32)))
178{
179 // Validate output
180 validate(CLAccessor(_target), _reference, tolerance_fp32);
181}
182TEST_SUITE_END()
Kaizen8938bd32017-09-28 14:38:23 +0100183TEST_SUITE_END()
184
185template <typename T>
186using CLDirectConvolutionLayerFixedPointFixture = DirectConvolutionValidationFixedPointFixture<CLTensor, CLAccessor, CLDirectConvolutionLayer, T>;
187
Anthony Barbier8140e1e2017-12-14 23:48:46 +0000188TEST_SUITE(FixedPoint)
Kaizen8938bd32017-09-28 14:38:23 +0100189TEST_SUITE(QS8)
Anthony Barbier8140e1e2017-12-14 23:48:46 +0000190FIXTURE_DATA_TEST_CASE(Run, CLDirectConvolutionLayerFixedPointFixture<int8_t>, framework::DatasetMode::ALL, combine(combine(data_fixed_point, framework::dataset::make("DataType", DataType::QS8)),
Kaizen8938bd32017-09-28 14:38:23 +0100191 framework::dataset::make("FractionalBits", 2, 7)))
192{
193 // Validate output
194 validate(CLAccessor(_target), _reference, tolerance_qs8);
195}
196TEST_SUITE_END()
197
198TEST_SUITE(QS16)
Anthony Barbier8140e1e2017-12-14 23:48:46 +0000199FIXTURE_DATA_TEST_CASE(Run, CLDirectConvolutionLayerFixedPointFixture<int16_t>, framework::DatasetMode::ALL, combine(combine(data_fixed_point, framework::dataset::make("DataType", DataType::QS16)),
Kaizen8938bd32017-09-28 14:38:23 +0100200 framework::dataset::make("FractionalBits", 2, 15)))
201{
202 // Validate output
203 validate(CLAccessor(_target), _reference, tolerance_qs16);
204}
205TEST_SUITE_END()
206TEST_SUITE_END()
207
Anthony Barbier8140e1e2017-12-14 23:48:46 +0000208template <typename T>
209using CLDirectConvolutionLayerQuantizedFixture = DirectConvolutionValidationQuantizedFixture<CLTensor, CLAccessor, CLDirectConvolutionLayer, T>;
210template <typename T>
211using CLDirectConvolutionValidationWithTensorShapesQuantizedFixture = DirectConvolutionValidationWithTensorShapesQuantizedFixture<CLTensor, CLAccessor, CLDirectConvolutionLayer, T>;
212
213TEST_SUITE(Quantized)
214TEST_SUITE(QASYMM8)
215FIXTURE_DATA_TEST_CASE(Run, CLDirectConvolutionLayerQuantizedFixture<uint8_t>, framework::DatasetMode::ALL, combine(combine(data, framework::dataset::make("DataType", DataType::QASYMM8)),
216 framework::dataset::make("QuantizationInfo", { QuantizationInfo(2.f / 255, 10) })))
217{
218 // Validate output
219 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
220}
221TEST_SUITE_END()
222
223TEST_SUITE(QASYMM8_CustomDataset)
224FIXTURE_DATA_TEST_CASE(Run, CLDirectConvolutionValidationWithTensorShapesQuantizedFixture<uint8_t>, framework::DatasetMode::ALL, combine(combine(datasets::DirectConvolutionLayerDataset(),
225 framework::dataset::make("DataType", DataType::QASYMM8)),
226 framework::dataset::make("QuantizationInfo", { QuantizationInfo(2.f / 255, 127) })))
227{
228 // Validate output
229 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
230}
231TEST_SUITE_END()
232TEST_SUITE_END()
233
Kaizen8938bd32017-09-28 14:38:23 +0100234TEST_SUITE_END()
235TEST_SUITE_END()
236} // namespace validation
237} // namespace test
238} // namespace arm_compute