blob: d3529a3517ed3a70f713b483523b036756fed9f3 [file] [log] [blame]
Moritz Pflanzerb3d25792017-07-26 11:49:37 +01001/*
Anthony Barbier1c0d0ff2018-01-31 13:05:09 +00002 * Copyright (c) 2017-2018 ARM Limited.
Moritz Pflanzerb3d25792017-07-26 11:49:37 +01003 *
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"
Moritz Pflanzerb3d25792017-07-26 11:49:37 +010028#include "tests/CL/CLAccessor.h"
29#include "tests/PaddingCalculator.h"
Jaroslaw Rzepecki2ecbada2017-11-29 13:51:34 +000030#include "tests/datasets/DirectConvolutionLayerDataset.h"
Moritz Pflanzera09de0c2017-09-01 20:41:12 +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"
Moritz Pflanzerb3d25792017-07-26 11:49:37 +010037
38namespace arm_compute
39{
40namespace test
41{
42namespace validation
43{
44namespace
45{
Michalis Spyrou064add62018-11-01 18:14:27 +000046// COMPMID-517 Investigate the mismatch to see whether it is a real bug
Pablo Tellod041a832018-10-03 17:11:09 +010047RelativeTolerance<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 */
50constexpr AbsoluteTolerance<uint8_t> tolerance_qasymm8(1); /**< Tolerance for quantized tests */
Moritz Pflanzerb3d25792017-07-26 11:49:37 +010051
Pablo Tellod041a832018-10-03 17:11:09 +010052const auto data_strides = combine(framework::dataset::make("StrideX", 1, 3), framework::dataset::make("StrideY", 1, 3));
53const auto data_ksize_one = combine(framework::dataset::make("PadX", 0, 1), combine(framework::dataset::make("PadY", 0, 1), framework::dataset::make("KernelSize", 1)));
54const auto data_ksize_three = combine(framework::dataset::make("PadX", 0, 2), combine(framework::dataset::make("PadY", 0, 2), framework::dataset::make("KernelSize", 3)));
55const auto data_ksize_five = combine(framework::dataset::make("PadX", 0, 3), combine(framework::dataset::make("PadY", 0, 3), framework::dataset::make("KernelSize", 5)));
56const auto data_all_kernels = concat(concat(data_ksize_one, data_ksize_three), data_ksize_five);
Michalis Spyroudef665a2017-08-14 11:26:37 +010057
Michalis Spyrou064add62018-11-01 18:14:27 +000058const auto data = combine(datasets::SmallDirectConvolutionShapes(), combine(data_strides, data_all_kernels));
59
60/** Direct convolution nightly data set. */
61const auto data_nightly = combine(data, framework::dataset::make("NumKernels", { 1, 4, 8, 16 }));
62/** Direct convolution precommit data set. */
63const auto data_precommit = combine(data, framework::dataset::make("NumKernels", { 4 }));
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +010064
Isabella Gottardi3f217ec2018-02-12 14:59:19 +000065/** Activation function Dataset*/
66const auto ActivationFunctionsDataset = framework::dataset::make("ActivationInfo",
67{
68 ActivationLayerInfo(),
69 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU),
70 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::BOUNDED_RELU, 0.5f),
71 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LU_BOUNDED_RELU, 0.5f)
72});
Moritz Pflanzerb3d25792017-07-26 11:49:37 +010073} // namespace
74
75TEST_SUITE(CL)
76TEST_SUITE(DirectConvolutionLayer)
77
78//TODO(COMPMID-415): Configuration tests?
79
Georgios Pinitas30902ed2017-11-14 15:32:57 +000080// *INDENT-OFF*
81// clang-format off
Isabella Gottardi3f217ec2018-02-12 14:59:19 +000082DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(zip(zip(zip(
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +010083 framework::dataset::make("InputInfo", { TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Mismatching data type input/weights
84 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Mismatching input feature maps
85 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Unsupported kernel width
86 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Non-rectangular weights dimensions
87 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Invalid weights dimensions
88 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Invalid stride
89 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Invalid biases size
90 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Invalid biases dimensions
91 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Invalid output size
92 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Window shrink
93 TensorInfo(TensorShape(32U, 16U, 2U), 1, DataType::F32),
Georgios Pinitas30902ed2017-11-14 15:32:57 +000094 }),
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +010095 framework::dataset::make("WeightsInfo",{ TensorInfo(TensorShape(3U, 3U, 2U, 4U), 1, DataType::F16),
96 TensorInfo(TensorShape(3U, 3U, 3U, 4U), 1, DataType::F32),
97 TensorInfo(TensorShape(9U, 9U, 2U, 4U), 1, DataType::F32),
98 TensorInfo(TensorShape(5U, 3U, 2U, 4U), 1, DataType::F32),
99 TensorInfo(TensorShape(3U, 3U, 2U, 4U, 3U), 1, DataType::F32),
100 TensorInfo(TensorShape(3U, 3U, 2U, 4U), 1, DataType::F32),
101 TensorInfo(TensorShape(3U, 3U, 2U, 4U), 1, DataType::F32),
102 TensorInfo(TensorShape(3U, 3U, 2U, 4U), 1, DataType::F32),
103 TensorInfo(TensorShape(3U, 3U, 2U, 4U), 1, DataType::F32),
104 TensorInfo(TensorShape(3U, 3U, 2U, 4U), 1, DataType::F32),
105 TensorInfo(TensorShape(1U, 1U, 2U, 4U), 1, DataType::F32),
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000106 })),
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +0100107 framework::dataset::make("BiasesInfo",{ TensorInfo(TensorShape(4U), 1, DataType::F32),
108 TensorInfo(TensorShape(4U), 1, DataType::F32),
109 TensorInfo(TensorShape(4U), 1, DataType::F32),
110 TensorInfo(TensorShape(4U), 1, DataType::F32),
111 TensorInfo(TensorShape(4U), 1, DataType::F32),
112 TensorInfo(TensorShape(4U), 1, DataType::F32),
113 TensorInfo(TensorShape(3U), 1, DataType::F32),
114 TensorInfo(TensorShape(4U, 2U), 1, DataType::F32),
115 TensorInfo(TensorShape(4U), 1, DataType::F32),
116 TensorInfo(TensorShape(4U), 1, DataType::F32),
117 TensorInfo(TensorShape(4U), 1, DataType::F32),
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000118 })),
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +0100119 framework::dataset::make("OutputInfo",{ TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32),
120 TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32),
121 TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32),
122 TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32),
123 TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32),
124 TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32),
125 TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32),
126 TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32),
127 TensorInfo(TensorShape(26U, 11U, 4U), 1, DataType::F32),
128 TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32),
129 TensorInfo(TensorShape(32U, 16U, 4U), 1, DataType::F32),
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000130 })),
131 framework::dataset::make("ConvInfo", { PadStrideInfo(1, 1, 0, 0),
132 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(3, 3, 0, 0),
137 PadStrideInfo(1, 1, 0, 0),
138 PadStrideInfo(1, 1, 0, 0),
139 PadStrideInfo(1, 1, 0, 0),
140 PadStrideInfo(1, 1, 0, 0),
Giorgio Arena59486342017-12-01 10:42:47 +0000141 PadStrideInfo(1, 1, 0, 0),
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000142 })),
Isabella Gottardi3f217ec2018-02-12 14:59:19 +0000143 framework::dataset::make("ActivationInfo",
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000144{
Isabella Gottardi3f217ec2018-02-12 14:59:19 +0000145 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU)
146})),
147 framework::dataset::make("Expected", { false, false, false, false, false, false, false, false, false, false, true })),
148 input_info, weights_info, biases_info, output_info, conv_info, act_info, expected)
149{
150 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, act_info));
Georgios Pinitas631c41a2017-12-06 11:53:03 +0000151 ARM_COMPUTE_EXPECT(is_valid == expected, framework::LogLevel::ERRORS);
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000152}
153// clang-format on
154// *INDENT-ON*
155
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100156template <typename T>
157using CLDirectConvolutionLayerFixture = DirectConvolutionValidationFixture<CLTensor, CLAccessor, CLDirectConvolutionLayer, T>;
Jaroslaw Rzepecki2ecbada2017-11-29 13:51:34 +0000158template <typename T>
159using CLDirectConvolutionValidationWithTensorShapesFixture = DirectConvolutionValidationWithTensorShapesFixture<CLTensor, CLAccessor, CLDirectConvolutionLayer, T>;
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100160
161TEST_SUITE(Float)
162TEST_SUITE(FP16)
Michalis Spyrou064add62018-11-01 18:14:27 +0000163FIXTURE_DATA_TEST_CASE(RunSmall, CLDirectConvolutionLayerFixture<half>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(data_precommit, framework::dataset::make("DataType", DataType::F16)),
164 ActivationFunctionsDataset),
165 framework::dataset::make("DataLayout", DataLayout::NCHW)))
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100166{
167 // Validate output
steniu013e05e4e2017-08-25 17:18:01 +0100168 validate(CLAccessor(_target), _reference, tolerance_fp16, tolerance_num);
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100169}
Michalis Spyrou064add62018-11-01 18:14:27 +0000170FIXTURE_DATA_TEST_CASE(RunLarge, CLDirectConvolutionLayerFixture<half>, framework::DatasetMode::NIGHTLY, combine(combine(combine(data_nightly, framework::dataset::make("DataType", DataType::F16)),
171 ActivationFunctionsDataset),
172 framework::dataset::make("DataLayout", DataLayout::NCHW)))
173{
174 // Validate output
175 validate(CLAccessor(_target), _reference, tolerance_fp16, tolerance_num);
176}
177TEST_SUITE_END() // FP16
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100178
179TEST_SUITE(FP32)
Michalis Spyrou064add62018-11-01 18:14:27 +0000180FIXTURE_DATA_TEST_CASE(RunSmall, CLDirectConvolutionLayerFixture<float>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(data_precommit, framework::dataset::make("DataType",
181 DataType::F32)),
182 ActivationFunctionsDataset),
183 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100184{
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100185 validate(CLAccessor(_target), _reference, tolerance_fp32);
186}
Michalis Spyrou064add62018-11-01 18:14:27 +0000187FIXTURE_DATA_TEST_CASE(RunLarge, CLDirectConvolutionLayerFixture<float>, framework::DatasetMode::NIGHTLY, combine(combine(combine(data_nightly, framework::dataset::make("DataType", DataType::F32)),
188 ActivationFunctionsDataset),
189 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
190{
191 validate(CLAccessor(_target), _reference, tolerance_fp32);
192}
193TEST_SUITE_END() // FP32
Jaroslaw Rzepecki2ecbada2017-11-29 13:51:34 +0000194
195TEST_SUITE(FP32_CustomDataset)
Isabella Gottardi3f217ec2018-02-12 14:59:19 +0000196FIXTURE_DATA_TEST_CASE(Run, CLDirectConvolutionValidationWithTensorShapesFixture<float>, framework::DatasetMode::ALL, combine(combine(datasets::DirectConvolutionLayerDataset(),
197 framework::dataset::make("DataType", DataType::F32)),
198 ActivationFunctionsDataset))
Jaroslaw Rzepecki2ecbada2017-11-29 13:51:34 +0000199{
200 // Validate output
201 validate(CLAccessor(_target), _reference, tolerance_fp32);
202}
Michalis Spyrou064add62018-11-01 18:14:27 +0000203TEST_SUITE_END() // FP32_CustomDataset
204TEST_SUITE_END() // Float
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100205
Michalis Spyroudef665a2017-08-14 11:26:37 +0100206template <typename T>
Chunosovd621bca2017-11-03 17:33:15 +0700207using CLDirectConvolutionLayerQuantizedFixture = DirectConvolutionValidationQuantizedFixture<CLTensor, CLAccessor, CLDirectConvolutionLayer, T>;
Jaroslaw Rzepecki2ecbada2017-11-29 13:51:34 +0000208template <typename T>
209using CLDirectConvolutionValidationWithTensorShapesQuantizedFixture = DirectConvolutionValidationWithTensorShapesQuantizedFixture<CLTensor, CLAccessor, CLDirectConvolutionLayer, T>;
Chunosovd621bca2017-11-03 17:33:15 +0700210
Isabella Gottardi3f217ec2018-02-12 14:59:19 +0000211const auto QuantizedActivationFunctionsDataset = framework::dataset::make("ActivationInfo",
212{
213 ActivationLayerInfo(),
214 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU),
215 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LU_BOUNDED_RELU, 6.f)
216});
Chunosovd621bca2017-11-03 17:33:15 +0700217TEST_SUITE(Quantized)
218TEST_SUITE(QASYMM8)
Michalis Spyrou064add62018-11-01 18:14:27 +0000219FIXTURE_DATA_TEST_CASE(RunSmall, CLDirectConvolutionLayerQuantizedFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(data_precommit, framework::dataset::make("DataType",
220 DataType::QASYMM8)),
221 framework::dataset::make("QuantizationInfo", { QuantizationInfo(2.f / 255, 10) })),
222 QuantizedActivationFunctionsDataset))
Chunosovd621bca2017-11-03 17:33:15 +0700223{
224 // Validate output
225 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
226}
Michalis Spyrou064add62018-11-01 18:14:27 +0000227FIXTURE_DATA_TEST_CASE(RunLarge, CLDirectConvolutionLayerQuantizedFixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(combine(combine(data_nightly, framework::dataset::make("DataType",
228 DataType::QASYMM8)),
229 framework::dataset::make("QuantizationInfo", { QuantizationInfo(2.f / 255, 10) })),
230 QuantizedActivationFunctionsDataset))
231{
232 // Validate output
233 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
234}
235TEST_SUITE_END() // QASYMM8
Jaroslaw Rzepecki2ecbada2017-11-29 13:51:34 +0000236
237TEST_SUITE(QASYMM8_CustomDataset)
Isabella Gottardi3f217ec2018-02-12 14:59:19 +0000238FIXTURE_DATA_TEST_CASE(Run, CLDirectConvolutionValidationWithTensorShapesQuantizedFixture<uint8_t>, framework::DatasetMode::ALL, combine(combine(combine(datasets::DirectConvolutionLayerDataset(),
Jaroslaw Rzepecki2ecbada2017-11-29 13:51:34 +0000239 framework::dataset::make("DataType", DataType::QASYMM8)),
Isabella Gottardi3f217ec2018-02-12 14:59:19 +0000240 framework::dataset::make("QuantizationInfo", { QuantizationInfo(2.f / 255, 127) })),
241 QuantizedActivationFunctionsDataset))
Jaroslaw Rzepecki2ecbada2017-11-29 13:51:34 +0000242{
243 // Validate output
244 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
245}
Michalis Spyrou064add62018-11-01 18:14:27 +0000246TEST_SUITE_END() // QASYMM8_CustomDataset
247TEST_SUITE_END() // Quantized
Chunosovd621bca2017-11-03 17:33:15 +0700248
Michalis Spyrou064add62018-11-01 18:14:27 +0000249TEST_SUITE_END() // DirectConvolutionLayer
250TEST_SUITE_END() // Float
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100251} // namespace validation
252} // namespace test
Anthony Barbier1c0d0ff2018-01-31 13:05:09 +0000253} // namespace arm_compute