blob: 9db73820c2629e473f5d91a277bef7e40f348d79 [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{
steniu013e05e4e2017-08-25 17:18:01 +010046// COMPMID-517 Invesitgate 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
Moritz Pflanzerb3d25792017-07-26 11:49:37 +010058/** Direct convolution data set. */
59const auto data = combine(datasets::SmallDirectConvolutionShapes(),
Pablo Tellod041a832018-10-03 17:11:09 +010060 combine(data_strides, combine(data_all_kernels, framework::dataset::make("NumKernels", { 1, 4, 8, 16 }))));
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +010061
Isabella Gottardi3f217ec2018-02-12 14:59:19 +000062/** Activation function Dataset*/
63const auto ActivationFunctionsDataset = framework::dataset::make("ActivationInfo",
64{
65 ActivationLayerInfo(),
66 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU),
67 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::BOUNDED_RELU, 0.5f),
68 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LU_BOUNDED_RELU, 0.5f)
69});
Moritz Pflanzerb3d25792017-07-26 11:49:37 +010070} // namespace
71
72TEST_SUITE(CL)
73TEST_SUITE(DirectConvolutionLayer)
74
75//TODO(COMPMID-415): Configuration tests?
76
Georgios Pinitas30902ed2017-11-14 15:32:57 +000077// *INDENT-OFF*
78// clang-format off
Isabella Gottardi3f217ec2018-02-12 14:59:19 +000079DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(zip(zip(zip(
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +010080 framework::dataset::make("InputInfo", { TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Mismatching data type input/weights
81 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Mismatching input feature maps
82 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Unsupported kernel width
83 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Non-rectangular weights dimensions
84 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Invalid weights dimensions
85 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Invalid stride
86 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Invalid biases size
87 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Invalid biases dimensions
88 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Invalid output size
89 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Window shrink
90 TensorInfo(TensorShape(32U, 16U, 2U), 1, DataType::F32),
Georgios Pinitas30902ed2017-11-14 15:32:57 +000091 }),
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +010092 framework::dataset::make("WeightsInfo",{ TensorInfo(TensorShape(3U, 3U, 2U, 4U), 1, DataType::F16),
93 TensorInfo(TensorShape(3U, 3U, 3U, 4U), 1, DataType::F32),
94 TensorInfo(TensorShape(9U, 9U, 2U, 4U), 1, DataType::F32),
95 TensorInfo(TensorShape(5U, 3U, 2U, 4U), 1, DataType::F32),
96 TensorInfo(TensorShape(3U, 3U, 2U, 4U, 3U), 1, DataType::F32),
97 TensorInfo(TensorShape(3U, 3U, 2U, 4U), 1, DataType::F32),
98 TensorInfo(TensorShape(3U, 3U, 2U, 4U), 1, DataType::F32),
99 TensorInfo(TensorShape(3U, 3U, 2U, 4U), 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(1U, 1U, 2U, 4U), 1, DataType::F32),
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000103 })),
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +0100104 framework::dataset::make("BiasesInfo",{ TensorInfo(TensorShape(4U), 1, DataType::F32),
105 TensorInfo(TensorShape(4U), 1, DataType::F32),
106 TensorInfo(TensorShape(4U), 1, DataType::F32),
107 TensorInfo(TensorShape(4U), 1, DataType::F32),
108 TensorInfo(TensorShape(4U), 1, DataType::F32),
109 TensorInfo(TensorShape(4U), 1, DataType::F32),
110 TensorInfo(TensorShape(3U), 1, DataType::F32),
111 TensorInfo(TensorShape(4U, 2U), 1, DataType::F32),
112 TensorInfo(TensorShape(4U), 1, DataType::F32),
113 TensorInfo(TensorShape(4U), 1, DataType::F32),
114 TensorInfo(TensorShape(4U), 1, DataType::F32),
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000115 })),
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +0100116 framework::dataset::make("OutputInfo",{ TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32),
117 TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32),
118 TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32),
119 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(26U, 11U, 4U), 1, DataType::F32),
125 TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32),
126 TensorInfo(TensorShape(32U, 16U, 4U), 1, DataType::F32),
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000127 })),
128 framework::dataset::make("ConvInfo", { PadStrideInfo(1, 1, 0, 0),
129 PadStrideInfo(1, 1, 0, 0),
130 PadStrideInfo(1, 1, 0, 0),
131 PadStrideInfo(1, 1, 0, 0),
132 PadStrideInfo(1, 1, 0, 0),
133 PadStrideInfo(3, 3, 0, 0),
134 PadStrideInfo(1, 1, 0, 0),
135 PadStrideInfo(1, 1, 0, 0),
136 PadStrideInfo(1, 1, 0, 0),
137 PadStrideInfo(1, 1, 0, 0),
Giorgio Arena59486342017-12-01 10:42:47 +0000138 PadStrideInfo(1, 1, 0, 0),
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000139 })),
Isabella Gottardi3f217ec2018-02-12 14:59:19 +0000140 framework::dataset::make("ActivationInfo",
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000141{
Isabella Gottardi3f217ec2018-02-12 14:59:19 +0000142 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU)
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, act_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, act_info));
Georgios Pinitas631c41a2017-12-06 11:53:03 +0000148 ARM_COMPUTE_EXPECT(is_valid == expected, framework::LogLevel::ERRORS);
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000149}
150// clang-format on
151// *INDENT-ON*
152
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100153template <typename T>
154using CLDirectConvolutionLayerFixture = DirectConvolutionValidationFixture<CLTensor, CLAccessor, CLDirectConvolutionLayer, T>;
Jaroslaw Rzepecki2ecbada2017-11-29 13:51:34 +0000155template <typename T>
156using CLDirectConvolutionValidationWithTensorShapesFixture = DirectConvolutionValidationWithTensorShapesFixture<CLTensor, CLAccessor, CLDirectConvolutionLayer, T>;
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100157
158TEST_SUITE(Float)
159TEST_SUITE(FP16)
Giorgio Arenac0f54432018-03-16 14:02:34 +0000160FIXTURE_DATA_TEST_CASE(Run, CLDirectConvolutionLayerFixture<half>, framework::DatasetMode::ALL, combine(combine(combine(data, framework::dataset::make("DataType", DataType::F16)),
161 ActivationFunctionsDataset),
162 framework::dataset::make("DataLayout", DataLayout::NCHW)))
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100163{
164 // Validate output
steniu013e05e4e2017-08-25 17:18:01 +0100165 validate(CLAccessor(_target), _reference, tolerance_fp16, tolerance_num);
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100166}
167TEST_SUITE_END()
168
169TEST_SUITE(FP32)
Giorgio Arenac0f54432018-03-16 14:02:34 +0000170FIXTURE_DATA_TEST_CASE(Run, CLDirectConvolutionLayerFixture<float>, framework::DatasetMode::ALL, combine(combine(combine(data, framework::dataset::make("DataType", DataType::F32)),
171 ActivationFunctionsDataset),
Pablo Tello3d319462018-06-21 15:13:17 +0100172 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100173{
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100174 validate(CLAccessor(_target), _reference, tolerance_fp32);
175}
176TEST_SUITE_END()
Jaroslaw Rzepecki2ecbada2017-11-29 13:51:34 +0000177
178TEST_SUITE(FP32_CustomDataset)
Isabella Gottardi3f217ec2018-02-12 14:59:19 +0000179FIXTURE_DATA_TEST_CASE(Run, CLDirectConvolutionValidationWithTensorShapesFixture<float>, framework::DatasetMode::ALL, combine(combine(datasets::DirectConvolutionLayerDataset(),
180 framework::dataset::make("DataType", DataType::F32)),
181 ActivationFunctionsDataset))
Jaroslaw Rzepecki2ecbada2017-11-29 13:51:34 +0000182{
183 // Validate output
184 validate(CLAccessor(_target), _reference, tolerance_fp32);
185}
186TEST_SUITE_END()
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100187TEST_SUITE_END()
188
Michalis Spyroudef665a2017-08-14 11:26:37 +0100189template <typename T>
Chunosovd621bca2017-11-03 17:33:15 +0700190using CLDirectConvolutionLayerQuantizedFixture = DirectConvolutionValidationQuantizedFixture<CLTensor, CLAccessor, CLDirectConvolutionLayer, T>;
Jaroslaw Rzepecki2ecbada2017-11-29 13:51:34 +0000191template <typename T>
192using CLDirectConvolutionValidationWithTensorShapesQuantizedFixture = DirectConvolutionValidationWithTensorShapesQuantizedFixture<CLTensor, CLAccessor, CLDirectConvolutionLayer, T>;
Chunosovd621bca2017-11-03 17:33:15 +0700193
Isabella Gottardi3f217ec2018-02-12 14:59:19 +0000194const auto QuantizedActivationFunctionsDataset = framework::dataset::make("ActivationInfo",
195{
196 ActivationLayerInfo(),
197 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU),
198 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LU_BOUNDED_RELU, 6.f)
199});
Chunosovd621bca2017-11-03 17:33:15 +0700200TEST_SUITE(Quantized)
201TEST_SUITE(QASYMM8)
Isabella Gottardi3f217ec2018-02-12 14:59:19 +0000202FIXTURE_DATA_TEST_CASE(Run, CLDirectConvolutionLayerQuantizedFixture<uint8_t>, framework::DatasetMode::ALL, combine(combine(combine(data, framework::dataset::make("DataType", DataType::QASYMM8)),
203 framework::dataset::make("QuantizationInfo", { QuantizationInfo(2.f / 255, 10) })),
204 QuantizedActivationFunctionsDataset))
Chunosovd621bca2017-11-03 17:33:15 +0700205{
206 // Validate output
207 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
208}
209TEST_SUITE_END()
Jaroslaw Rzepecki2ecbada2017-11-29 13:51:34 +0000210
211TEST_SUITE(QASYMM8_CustomDataset)
Isabella Gottardi3f217ec2018-02-12 14:59:19 +0000212FIXTURE_DATA_TEST_CASE(Run, CLDirectConvolutionValidationWithTensorShapesQuantizedFixture<uint8_t>, framework::DatasetMode::ALL, combine(combine(combine(datasets::DirectConvolutionLayerDataset(),
Jaroslaw Rzepecki2ecbada2017-11-29 13:51:34 +0000213 framework::dataset::make("DataType", DataType::QASYMM8)),
Isabella Gottardi3f217ec2018-02-12 14:59:19 +0000214 framework::dataset::make("QuantizationInfo", { QuantizationInfo(2.f / 255, 127) })),
215 QuantizedActivationFunctionsDataset))
Jaroslaw Rzepecki2ecbada2017-11-29 13:51:34 +0000216{
217 // Validate output
218 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
219}
220TEST_SUITE_END()
Chunosovd621bca2017-11-03 17:33:15 +0700221TEST_SUITE_END()
222
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100223TEST_SUITE_END()
224TEST_SUITE_END()
225} // namespace validation
226} // namespace test
Anthony Barbier1c0d0ff2018-01-31 13:05:09 +0000227} // namespace arm_compute