Compute Library
 22.11
DepthwiseConvolutionLayer.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2017-2022 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"
29 #include "tests/NEON/Accessor.h"
31 #include "tests/datasets/DepthwiseConvolutionLayerDataset.h"
32 #include "tests/datasets/DilatedDepthwiseConvolutionLayerDataset.h"
34 #include "tests/framework/Macros.h"
37 #include "tests/validation/fixtures/DepthwiseConvolutionLayerFixture.h"
38 
39 namespace arm_compute
40 {
41 namespace test
42 {
43 namespace validation
44 {
46 
47 namespace
48 {
49 constexpr RelativeTolerance<float> tolerance_f32(0.01f); /**< Tolerance value for comparing reference's output against implementation's output for DataType::F32 */
50 constexpr AbsoluteTolerance<uint8_t> tolerance_qasymm8(1); /**< Tolerance value for comparing reference's output against implementation's output for DataType::QASYMM8 */
51 #ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
52 RelativeTolerance<half_float::half> tolerance_f16(half_float::half(0.02)); /**< Tolerance value for comparing reference's output against implementation's output for DataType::F16 */
53 constexpr float tolerance_num = 0.05f; /**< Tolerance number */
54 #endif // __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
55 
56 const auto depth_multipliers = framework::dataset::make("DepthMultiplier", { 1, 2, 8 });
57 const auto large_depth_multipliers = framework::dataset::make("DepthMultiplier", { 1, 2, 5, 32 });
58 
59 //Activation Functions
60 const auto ActivationFunctionsDataset = framework::dataset::make("ActivationInfo",
61 {
62  ActivationLayerInfo(),
64 });
65 
66 const auto input_qinfo_dataset = framework::dataset::make("InputQInfo",
67 {
68  QuantizationInfo(0.3f, 10),
69  QuantizationInfo(2.2f, 10),
70 });
71 } // namespace
72 
73 TEST_SUITE(NEON)
74 TEST_SUITE(DepthwiseConvolutionLayer)
75 
76 // *INDENT-OFF*
77 // clang-format off
78 DATA_TEST_CASE(Validate3x3, framework::DatasetMode::ALL, zip(zip(zip(zip(zip(zip(zip(
79  framework::dataset::make("InputInfo", { TensorInfo(TensorShape(32U, 18U, 2U), 1, DataType::F32), // Mismatching data type input/weights
80  TensorInfo(TensorShape(32U, 18U, 3U), 1, DataType::F32), // Mismatching input feature maps
81  TensorInfo(TensorShape(32U, 18U, 2U), 1, DataType::F32), // Unsupported weights dimensions
82  TensorInfo(TensorShape(32U, 18U, 2U), 1, DataType::F32), // Mismatching depth multiplier
83  TensorInfo(TensorShape(32U, 18U, 2U), 1, DataType::QASYMM8), // Invalid stride
84  TensorInfo(TensorShape(32U, 18U, 2U), 1, DataType::F32), // Invalid biases size
85  TensorInfo(TensorShape(32U, 18U, 2U), 1, DataType::F32), // Invalid biases dimensions
86  TensorInfo(TensorShape(32U, 18U, 2U), 1, DataType::F32), // Invalid output size
87  TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // patch size bigger than input width
88  TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // dilation < 1
89  TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32),
90  }),
91  framework::dataset::make("WeightsInfo", { TensorInfo(TensorShape(3U, 3U, 2U, 2U), 1, DataType::F16),
92  TensorInfo(TensorShape(3U, 3U, 2U, 2U), 1, DataType::F32),
93  TensorInfo(TensorShape(5U, 5U, 2U, 2U), 1, DataType::F32),
94  TensorInfo(TensorShape(3U, 3U, 2U, 2U), 1, DataType::F32),
96  TensorInfo(TensorShape(3U, 3U, 2U, 2U), 1, DataType::F32),
97  TensorInfo(TensorShape(3U, 3U, 2U, 2U), 1, DataType::F32),
98  TensorInfo(TensorShape(3U, 3U, 2U, 2U), 1, DataType::F32),
99  TensorInfo(TensorShape(3U, 3U, 2U, 2U), 1, DataType::F32),
100  TensorInfo(TensorShape(3U, 3U, 2U, 2U), 1, DataType::F32),
101  TensorInfo(TensorShape(3U, 3U, 2U, 2U), 1, DataType::F32),
102  })),
114  })),
115  framework::dataset::make("OutputInfo", { TensorInfo(TensorShape(30U, 16U, 2U), 1, DataType::F32),
116  TensorInfo(TensorShape(30U, 16U, 2U), 1, DataType::F32),
117  TensorInfo(TensorShape(30U, 16U, 2U), 1, DataType::F32),
118  TensorInfo(TensorShape(30U, 16U, 2U), 1, DataType::F32),
120  TensorInfo(TensorShape(30U, 16U, 2U), 1, DataType::F32),
121  TensorInfo(TensorShape(30U, 16U, 2U), 1, DataType::F32),
122  TensorInfo(TensorShape(32U, 18U, 2U), 1, DataType::F32),
123  TensorInfo(TensorShape(25U, 11U, 2U), 1, DataType::F32),
124  TensorInfo(TensorShape(25U, 11U, 2U), 1, DataType::F32),
125  TensorInfo(TensorShape(25U, 11U, 2U), 1, DataType::F32),
126  })),
127  framework::dataset::make("ConvInfo", { PadStrideInfo(1, 1, 0, 0),
128  PadStrideInfo(1, 1, 0, 0),
129  PadStrideInfo(1, 1, 0, 0),
130  PadStrideInfo(1, 1, 0, 0),
131  PadStrideInfo(4, 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(1, 1, 0, 0),
137  PadStrideInfo(1, 1, 0, 0),
138  })),
139  framework::dataset::make("DepthMultiplier", { 1,
140  1,
141  1,
142  3,
143  1,
144  1,
145  1,
146  1,
147  1,
148  1,
149  1,
150  })),
151  framework::dataset::make("Dilation", { Size2D(1U, 1U),
152  Size2D(1U, 1U),
153  Size2D(1U, 1U),
154  Size2D(1U, 1U),
155  Size2D(1U, 1U),
156  Size2D(1U, 1U),
157  Size2D(1U, 1U),
158  Size2D(1U, 1U),
159  Size2D(25U, 1U),
160  Size2D(0U, 1U),
161  Size2D(1U, 1U),
162  })),
163  framework::dataset::make("Expected", { false, false, false, false, false, false, false, false, false, false, true })),
164  input_info, weights_info, biases_info, output_info, conv_info, depth_multiplier,dilation, expected)
165 {
166  bool is_valid = bool(NEDepthwiseConvolutionLayer::validate(&input_info.clone()->set_is_resizable(false),
167  &weights_info.clone()->set_is_resizable(false), &biases_info.clone()->set_is_resizable(false), &output_info.clone()->set_is_resizable(false), conv_info, depth_multiplier, ActivationLayerInfo(), dilation));
169 }
170 
172  framework::dataset::make("InputInfo", { TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Mismatching data type input/weights
173  TensorInfo(TensorShape(27U, 13U, 3U), 1, DataType::F32), // Mismatching input feature maps
174  TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Mismatching depth multiplier
175  TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Invalid biases size
176  TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Invalid biases dimensions
177  TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Invalid output size
178  TensorInfo(TensorShape(27U, 13U, 8U), 1, DataType::F32), // Patch size bigger than input width
179  TensorInfo(TensorShape(27U, 13U, 8U), 1, DataType::F32), // Dilation < 1
180  }),
181  framework::dataset::make("WeightsInfo", { TensorInfo(TensorShape(3U, 3U, 2U), 1, DataType::F16),
187  TensorInfo(TensorShape(3U, 3U, 16U), 1, DataType::F32),
188  TensorInfo(TensorShape(3U, 3U, 16U), 1, DataType::F32),
189  })),
198  })),
199  framework::dataset::make("OutputInfo", { TensorInfo(TensorShape(25U, 11U, 2U), 1, DataType::F32),
200  TensorInfo(TensorShape(25U, 11U, 2U), 1, DataType::F32),
201  TensorInfo(TensorShape(25U, 11U, 2U), 1, DataType::F32),
202  TensorInfo(TensorShape(25U, 11U, 2U), 1, DataType::F32),
203  TensorInfo(TensorShape(25U, 11U, 2U), 1, DataType::F32),
204  TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32),
205  TensorInfo(TensorShape(25U, 11U, 16U), 1, DataType::F32),
206  TensorInfo(TensorShape(25U, 11U, 16U), 1, DataType::F32),
207  })),
208  framework::dataset::make("ConvInfo", { PadStrideInfo(1, 1, 0, 0),
209  PadStrideInfo(1, 1, 0, 0),
210  PadStrideInfo(1, 1, 0, 0),
211  PadStrideInfo(1, 1, 0, 0),
212  PadStrideInfo(1, 1, 0, 0),
213  PadStrideInfo(1, 1, 0, 0),
214  PadStrideInfo(1, 1, 0, 0),
215  PadStrideInfo(1, 1, 0, 0),
216  })),
217  framework::dataset::make("DepthMultiplier", { 1,
218  1,
219  3,
220  1,
221  1,
222  1,
223  2,
224  2,
225  })),
226  framework::dataset::make("Dilation", { Size2D(1U, 1U),
227  Size2D(1U, 1U),
228  Size2D(1U, 1U),
229  Size2D(1U, 1U),
230  Size2D(1U, 1U),
231  Size2D(1U, 1U),
232  Size2D(25U, 1U),
233  Size2D(0U, 1U),
234  })),
235  framework::dataset::make("Expected", { false, false, false, false, false, false, false, false})),
236  input_info, weights_info, biases_info, output_info, conv_info, depth_multiplier,dilation, expected)
237 {
238  bool is_valid = bool(NEDepthwiseConvolutionLayer::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, depth_multiplier, ActivationLayerInfo(), dilation));
240 }
241 // clang-format on
242 // *INDENT-ON*
243 template <typename T>
244 using NEDepthwiseConvolutionLayerFixture = DepthwiseConvolutionLayerValidationFixture<Tensor, Accessor, NEDepthwiseConvolutionLayer, T>;
245 template <typename T>
246 using NEDepthwiseConvolutionLayerMixedDataLayoutFixture = DepthwiseConvolutionLayerValidationFixture<Tensor, Accessor, NEDepthwiseConvolutionLayer, T, true>;
247 template <typename T>
248 using NEDepthwiseConvolutionLayerVariableWeightsFixture = DepthwiseConvolutionLayerValidationFixture<Tensor, Accessor, NEDepthwiseConvolutionLayer, T, false, false, true>;
249 
250 TEST_SUITE(Float)
251 TEST_SUITE(F32)
252 TEST_SUITE(Generic)
253 FIXTURE_DATA_TEST_CASE_NEW(RunSmall, NEDepthwiseConvolutionLayerFixture<float>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(combine(datasets::SmallDepthwiseConvolutionLayerDataset(),
254  depth_multipliers),
255  framework::dataset::make("DataType", DataType::F32)),
256  framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })),
257  ActivationFunctionsDataset))
258 {
259  validate(Accessor(_target), _reference, tolerance_f32);
260 }
262  framework::dataset::make("DepthMultiplier", { 2 })),
265  framework::dataset::make("ActivationInfo", ActivationLayerInfo())))
266 {
267  validate(Accessor(_target), _reference, tolerance_f32);
268 }
270  large_depth_multipliers),
271  framework::dataset::make("DataType",
272  DataType::F32)),
274  ActivationFunctionsDataset))
275 {
276  validate(Accessor(_target), _reference, tolerance_f32);
277 }
278 
279 TEST_SUITE(Dilation)
281  combine(combine(combine(combine(datasets::SmallDepthwiseDilatedConvolutionLayerDataset(),
282  depth_multipliers),
283  framework::dataset::make("DataType",
284  DataType::F32)),
285  framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })),
286  ActivationFunctionsDataset))
287 {
288  validate(Accessor(_target), _reference, tolerance_f32);
289 }
291  combine(combine(combine(combine(datasets::LargeDepthwiseDilatedConvolutionLayerDataset(),
292  large_depth_multipliers),
293  framework::dataset::make("DataType",
294  DataType::F32)),
296  ActivationFunctionsDataset))
297 {
298  validate(Accessor(_target), _reference, tolerance_f32);
299 }
300 TEST_SUITE_END() // Dilation
301 TEST_SUITE_END() // Generic
302 
303 TEST_SUITE(W3x3)
304 FIXTURE_DATA_TEST_CASE_NEW(RunSmall, NEDepthwiseConvolutionLayerFixture<float>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(combine(datasets::SmallDepthwiseConvolutionLayerDataset3x3(),
305  depth_multipliers),
306  framework::dataset::make("DataType",
307  DataType::F32)),
308  framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })),
309  ActivationFunctionsDataset))
310 {
311  validate(Accessor(_target), _reference, tolerance_f32);
312 }
314  combine(combine(combine(combine(datasets::LargeDepthwiseConvolutionLayerDataset3x3(),
315  large_depth_multipliers),
316  framework::dataset::make("DataType",
317  DataType::F32)),
319  ActivationFunctionsDataset))
320 {
321  validate(Accessor(_target), _reference, tolerance_f32);
322 }
323 TEST_SUITE(Dilation)
325  combine(combine(combine(combine(datasets::SmallDepthwiseDilatedConvolutionLayerDataset3x3(),
326  depth_multipliers),
327  framework::dataset::make("DataType",
328  DataType::F32)),
329  framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })),
330  ActivationFunctionsDataset))
331 {
332  validate(Accessor(_target), _reference, tolerance_f32);
333 }
335  combine(combine(combine(combine(datasets::LargeDepthwiseDilatedConvolutionLayerDataset3x3(),
336  large_depth_multipliers),
337  framework::dataset::make("DataType",
338  DataType::F32)),
340  ActivationFunctionsDataset))
341 {
342  validate(Accessor(_target), _reference, tolerance_f32);
343 }
344 
345 TEST_SUITE_END() // Dilation
346 TEST_SUITE_END() // W3x3
347 
348 TEST_SUITE(Optimized)
350  combine(combine(combine(combine(datasets::SmallOptimizedDepthwiseConvolutionLayerDataset3x3(),
351  framework::dataset::make("DepthMultiplier", 1)),
352  framework::dataset::make("DataType",
353  DataType::F32)),
355  ActivationFunctionsDataset))
356 {
357  validate(Accessor(_target), _reference, tolerance_f32);
358 }
360  combine(combine(combine(combine(datasets::SmallOptimizedDepthwiseConvolutionLayerDataset3x3(),
361  framework::dataset::make("DepthMultiplier", 1)),
362  framework::dataset::make("DataType",
363  DataType::F32)),
364  framework::dataset::make("DataLayout", { DataLayout::NHWC })),
365  ActivationFunctionsDataset))
366 {
367  validate(Accessor(_target), _reference, tolerance_f32);
368 }
370  combine(combine(combine(combine(datasets::SmallOptimizedDepthwiseConvolutionLayerDataset3x3(),
371  framework::dataset::make("DepthMultiplier", 1)),
374  framework::dataset::make("ActivationInfo", ActivationLayerInfo())))
375 {
376  validate(Accessor(_target), _reference, tolerance_f32);
377 }
379  combine(combine(combine(combine(datasets::SmallOptimizedDepthwiseConvolutionLayerDataset5x5(),
380  framework::dataset::make("DepthMultiplier", 1)),
381  framework::dataset::make("DataType",
382  DataType::F32)),
384  ActivationFunctionsDataset))
385 {
386  validate(Accessor(_target), _reference, tolerance_f32);
387 }
389  combine(combine(combine(combine(datasets::SmallOptimizedDepthwiseConvolutionLayerDataset5x5(),
390  framework::dataset::make("DepthMultiplier", 1)),
391  framework::dataset::make("DataType",
392  DataType::F32)),
393  framework::dataset::make("DataLayout", { DataLayout::NHWC })),
394  ActivationFunctionsDataset))
395 {
396  validate(Accessor(_target), _reference, tolerance_f32);
397 }
399  combine(combine(combine(combine(datasets::LargeOptimizedDepthwiseConvolutionLayerDataset3x3(),
400  framework::dataset::make("DepthMultiplier", 1)),
401  framework::dataset::make("DataType",
402  DataType::F32)),
404  ActivationFunctionsDataset))
405 {
406  validate(Accessor(_target), _reference, tolerance_f32);
407 }
409  combine(combine(combine(combine(datasets::LargeOptimizedDepthwiseConvolutionLayerDataset3x3(),
410  framework::dataset::make("DepthMultiplier", 1)),
411  framework::dataset::make("DataType",
412  DataType::F32)),
413  framework::dataset::make("DataLayout", { DataLayout::NHWC })),
414  ActivationFunctionsDataset))
415 {
416  validate(Accessor(_target), _reference, tolerance_f32);
417 }
418 TEST_SUITE_END() // Optimized
419 TEST_SUITE_END() // F32
420 
421 #ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
423 TEST_SUITE(Generic)
425  depth_multipliers),
426  framework::dataset::make("DataType",
427  DataType::F16)),
429  ActivationFunctionsDataset))
430 {
431  validate(Accessor(_target), _reference, tolerance_f16, tolerance_num);
432 }
434  large_depth_multipliers),
435  framework::dataset::make("DataType",
436  DataType::F16)),
438  ActivationFunctionsDataset))
439 {
440  validate(Accessor(_target), _reference, tolerance_f16, tolerance_num);
441 }
442 
443 TEST_SUITE(Dilation)
445  combine(combine(combine(combine(datasets::SmallDepthwiseDilatedConvolutionLayerDataset(),
446  depth_multipliers),
447  framework::dataset::make("DataType",
448  DataType::F16)),
450  ActivationFunctionsDataset))
451 {
452  validate(Accessor(_target), _reference, tolerance_f16, tolerance_num);
453 }
455  combine(combine(combine(combine(datasets::LargeDepthwiseDilatedConvolutionLayerDataset(),
456  large_depth_multipliers),
457  framework::dataset::make("DataType",
458  DataType::F16)),
460  ActivationFunctionsDataset))
461 {
462  validate(Accessor(_target), _reference, tolerance_f16, tolerance_num);
463 }
464 TEST_SUITE_END() // Dilation
465 
466 TEST_SUITE_END() // Generic
467 template <typename T>
468 using NEDepthwiseConvolutionLayerFixture = DepthwiseConvolutionLayerValidationFixture<Tensor, Accessor, NEDepthwiseConvolutionLayer, T>;
469 TEST_SUITE(W3x3)
471  depth_multipliers),
472  framework::dataset::make("DataType",
473  DataType::F16)),
475  ActivationFunctionsDataset))
476 {
477  validate(Accessor(_target), _reference, tolerance_f16);
478 }
480  combine(combine(combine(combine(datasets::LargeDepthwiseConvolutionLayerDataset3x3(),
481  large_depth_multipliers),
482  framework::dataset::make("DataType",
483  DataType::F16)),
485  ActivationFunctionsDataset))
486 {
487  validate(Accessor(_target), _reference, tolerance_f16);
488 }
489 
490 TEST_SUITE(Dilation)
491 
493  combine(combine(combine(combine(datasets::SmallDepthwiseDilatedConvolutionLayerDataset3x3(),
494  depth_multipliers),
495  framework::dataset::make("DataType",
496  DataType::F16)),
498  ActivationFunctionsDataset))
499 {
500  validate(Accessor(_target), _reference, tolerance_f16);
501 }
503  combine(combine(combine(combine(datasets::LargeDepthwiseDilatedConvolutionLayerDataset3x3(),
504  large_depth_multipliers),
505  framework::dataset::make("DataType",
506  DataType::F16)),
508  ActivationFunctionsDataset))
509 {
510  validate(Accessor(_target), _reference, tolerance_f16);
511 }
512 
513 TEST_SUITE_END() // Dilation
514 TEST_SUITE_END() // W3x3
515 
516 TEST_SUITE(Optimized)
518  combine(combine(combine(combine(datasets::SmallOptimizedDepthwiseConvolutionLayerDataset3x3(),
519  framework::dataset::make("DepthMultiplier", 1)),
520  framework::dataset::make("DataType",
521  DataType::F16)),
523  ActivationFunctionsDataset))
524 {
525  validate(Accessor(_target), _reference, tolerance_f16);
526 }
528  combine(combine(combine(combine(datasets::SmallOptimizedDepthwiseConvolutionLayerDataset5x5(),
529  framework::dataset::make("DepthMultiplier", 1)),
530  framework::dataset::make("DataType",
531  DataType::F16)),
533  ActivationFunctionsDataset))
534 {
535  validate(Accessor(_target), _reference, tolerance_f16);
536 }
538  combine(combine(combine(combine(datasets::LargeOptimizedDepthwiseConvolutionLayerDataset3x3(),
539  framework::dataset::make("DepthMultiplier", 1)),
540  framework::dataset::make("DataType",
541  DataType::F16)),
543  ActivationFunctionsDataset))
544 {
545  validate(Accessor(_target), _reference, tolerance_f16);
546 }
547 TEST_SUITE_END() // Optimized
548 TEST_SUITE_END() // FP16
549 #endif // __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
550 
551 TEST_SUITE_END() // Float
552 
553 template <typename T>
554 using NEDepthwiseConvolutionLayerQuantizedFixture = DepthwiseConvolutionLayerValidationQuantizedFixture<Tensor, Accessor, NEDepthwiseConvolutionLayer, T>;
555 template <typename T>
556 using NEDepthwiseConvolutionLayerQuantizedMixedDataLayoutFixture = DepthwiseConvolutionLayerValidationQuantizedFixture<Tensor, Accessor, NEDepthwiseConvolutionLayer, T, true>;
557 using NEDepthwiseConvolutionLayerQuantizedSymmetricPerChannelFixture = DepthwiseConvolutionLayerValidationQuantizedPerChannelFixture<Tensor, Accessor, NEDepthwiseConvolutionLayer, uint8_t, int8_t>;
558 
559 TEST_SUITE(Quantized)
560 TEST_SUITE(QASYMM8)
561 TEST_SUITE(Generic)
562 FIXTURE_DATA_TEST_CASE_NEW(RunSmall, NEDepthwiseConvolutionLayerQuantizedFixture<uint8_t>, framework::DatasetMode::PRECOMMIT,
563  combine(combine(combine(combine(combine(combine(datasets::SmallDepthwiseConvolutionLayerDataset(),
564  depth_multipliers),
565  framework::dataset::make("DataType", DataType::QASYMM8)),
566  input_qinfo_dataset),
567  framework::dataset::make("DstQuantizationInfo", { QuantizationInfo(0.5f, 4) })),
568  framework::dataset::make("DataLayout", { DataLayout::NHWC })),
569  ActivationFunctionsDataset))
570 {
571  validate(Accessor(_target), _reference, tolerance_qasymm8);
572 }
574  combine(combine(combine(combine(combine(combine(datasets::SmallDepthwiseConvolutionLayerDataset(),
575  framework::dataset::make("DepthMultiplier", { 2 })),
577  input_qinfo_dataset),
578  framework::dataset::make("DstQuantizationInfo", { QuantizationInfo(0.5f, 4) })),
579  framework::dataset::make("DataLayout", { DataLayout::NHWC })),
580  framework::dataset::make("ActivationInfo", ActivationLayerInfo())))
581 {
582  validate(Accessor(_target), _reference, tolerance_qasymm8);
583 }
584 TEST_SUITE(Dilation)
585 FIXTURE_DATA_TEST_CASE_NEW(RunSmall, NEDepthwiseConvolutionLayerQuantizedFixture<uint8_t>, framework::DatasetMode::PRECOMMIT,
586  combine(combine(combine(combine(combine(combine(datasets::SmallDepthwiseDilatedConvolutionLayerDataset(),
587  depth_multipliers),
588  framework::dataset::make("DataType", DataType::QASYMM8)),
589  input_qinfo_dataset),
590  framework::dataset::make("DstQuantizationInfo", { QuantizationInfo(0.8f, 1) })),
591  framework::dataset::make("DataLayout", { DataLayout::NHWC })),
592  ActivationFunctionsDataset))
593 {
594  validate(Accessor(_target), _reference, tolerance_qasymm8);
595 }
597  combine(combine(combine(combine(combine(combine(datasets::LargeDepthwiseDilatedConvolutionLayerDataset(),
598  large_depth_multipliers),
600  input_qinfo_dataset),
601  framework::dataset::make("DstQuantizationInfo", { QuantizationInfo(0.9f, 11) })),
602  framework::dataset::make("DataLayout", { DataLayout::NHWC })),
603  ActivationFunctionsDataset))
604 {
605  validate(Accessor(_target), _reference, tolerance_qasymm8);
606 }
607 TEST_SUITE_END() // Dilation
608 TEST_SUITE_END() // Generic
609 TEST_SUITE(W3x3)
610 FIXTURE_DATA_TEST_CASE_NEW(RunSmall, NEDepthwiseConvolutionLayerQuantizedFixture<uint8_t>, framework::DatasetMode::PRECOMMIT,
611  combine(combine(combine(combine(combine(combine(datasets::SmallDepthwiseConvolutionLayerDataset3x3(), depth_multipliers),
612  framework::dataset::make("DataType", DataType::QASYMM8)),
613  input_qinfo_dataset),
614  framework::dataset::make("DstQuantizationInfo", { QuantizationInfo(0.5f, 10) })),
615  framework::dataset::make("DataLayout", { DataLayout::NHWC })),
616  ActivationFunctionsDataset))
617 {
618  validate(Accessor(_target), _reference, tolerance_qasymm8);
619 }
621  combine(combine(combine(combine(combine(combine(datasets::LargeDepthwiseConvolutionLayerDataset3x3(),
622  large_depth_multipliers),
624  input_qinfo_dataset),
625  framework::dataset::make("DstQuantizationInfo", { QuantizationInfo(0.5f, 10) })),
626  framework::dataset::make("DataLayout", { DataLayout::NHWC })),
627  ActivationFunctionsDataset))
628 {
629  validate(Accessor(_target), _reference, tolerance_qasymm8);
630 }
631 
632 TEST_SUITE(Dilation)
633 
634 FIXTURE_DATA_TEST_CASE_NEW(RunSmall, NEDepthwiseConvolutionLayerQuantizedFixture<uint8_t>, framework::DatasetMode::PRECOMMIT,
635  combine(combine(combine(combine(combine(combine(datasets::SmallDepthwiseDilatedConvolutionLayerDataset3x3(), depth_multipliers),
636  framework::dataset::make("DataType", DataType::QASYMM8)),
637  input_qinfo_dataset),
638  framework::dataset::make("DstQuantizationInfo", { QuantizationInfo(0.7f, 10) })),
639  framework::dataset::make("DataLayout", { DataLayout::NHWC })),
640  ActivationFunctionsDataset))
641 {
642  validate(Accessor(_target), _reference, tolerance_qasymm8);
643 }
645  combine(combine(combine(combine(combine(combine(datasets::LargeDepthwiseDilatedConvolutionLayerDataset3x3(),
646  large_depth_multipliers),
648  input_qinfo_dataset),
649  framework::dataset::make("DstQuantizationInfo", { QuantizationInfo(0.5f, 10) })),
650  framework::dataset::make("DataLayout", { DataLayout::NHWC })),
651  ActivationFunctionsDataset))
652 {
653  validate(Accessor(_target), _reference, tolerance_qasymm8);
654 }
655 TEST_SUITE_END() // Dilation
656 TEST_SUITE_END() // W3x3
657 
658 TEST_SUITE(Optimized)
660  combine(combine(combine(combine(combine(combine(datasets::SmallOptimizedDepthwiseConvolutionLayerDataset3x3(),
661  framework::dataset::make("DepthMultiplier", 1)),
663  input_qinfo_dataset),
664  framework::dataset::make("DstQuantizationInfo", { QuantizationInfo(0.5f, 10) })),
665  framework::dataset::make("DataLayout", { DataLayout::NHWC })),
666  ActivationFunctionsDataset))
667 {
668  validate(Accessor(_target), _reference, tolerance_qasymm8);
669 }
671  combine(combine(combine(combine(combine(combine(datasets::SmallOptimizedDepthwiseConvolutionLayerDataset3x3(),
672  framework::dataset::make("DepthMultiplier", 1)),
674  input_qinfo_dataset),
675  framework::dataset::make("DstQuantizationInfo", { QuantizationInfo(0.5f, 10) })),
676  framework::dataset::make("DataLayout", { DataLayout::NHWC })),
677  framework::dataset::make("ActivationInfo", ActivationLayerInfo())))
678 {
679  validate(Accessor(_target), _reference, tolerance_qasymm8);
680 }
682  combine(combine(combine(combine(combine(combine(datasets::SmallOptimizedDepthwiseConvolutionLayerDataset5x5(),
683  framework::dataset::make("DepthMultiplier", 1)),
684  framework::dataset::make("DataType",
686  input_qinfo_dataset),
687  framework::dataset::make("DstQuantizationInfo", { QuantizationInfo(0.5f, 10) })),
688  framework::dataset::make("DataLayout", { DataLayout::NHWC })),
689  ActivationFunctionsDataset))
690 {
691  validate(Accessor(_target), _reference, tolerance_qasymm8);
692 }
694  combine(combine(combine(combine(combine(combine(datasets::LargeOptimizedDepthwiseConvolutionLayerDataset3x3(),
695  framework::dataset::make("DepthMultiplier", 1)),
696  framework::dataset::make("DataType",
698  input_qinfo_dataset),
699  framework::dataset::make("DstQuantizationInfo", { QuantizationInfo(0.5f, 10) })),
700  framework::dataset::make("DataLayout", { DataLayout::NHWC })),
701  ActivationFunctionsDataset))
702 {
703  validate(Accessor(_target), _reference, tolerance_qasymm8);
704 }
705 TEST_SUITE_END() // Optimized
706 TEST_SUITE_END() // QASYMM8
707 
709 TEST_SUITE(Generic)
710 FIXTURE_DATA_TEST_CASE_NEW(RunSmall, NEDepthwiseConvolutionLayerQuantizedFixture<int8_t>, framework::DatasetMode::PRECOMMIT,
711  combine(combine(combine(combine(combine(combine(datasets::SmallDepthwiseConvolutionLayerDataset(),
712  depth_multipliers),
713  framework::dataset::make("DataType", DataType::QASYMM8_SIGNED)),
714  input_qinfo_dataset),
715  framework::dataset::make("DstQuantizationInfo", { QuantizationInfo(0.5f, 4) })),
716  framework::dataset::make("DataLayout", { DataLayout::NCHW })),
717  ActivationFunctionsDataset))
718 {
719  validate(Accessor(_target), _reference, tolerance_qasymm8);
720 }
721 
722 TEST_SUITE(Dilation)
723 FIXTURE_DATA_TEST_CASE_NEW(RunSmall, NEDepthwiseConvolutionLayerQuantizedFixture<int8_t>, framework::DatasetMode::PRECOMMIT,
724  combine(combine(combine(combine(combine(combine(datasets::SmallDepthwiseDilatedConvolutionLayerDataset(),
725  depth_multipliers),
726  framework::dataset::make("DataType", DataType::QASYMM8_SIGNED)),
727  input_qinfo_dataset),
728  framework::dataset::make("DstQuantizationInfo", { QuantizationInfo(0.8f, 1) })),
729  framework::dataset::make("DataLayout", { DataLayout::NCHW })),
730  ActivationFunctionsDataset))
731 {
732  validate(Accessor(_target), _reference, tolerance_qasymm8);
733 }
735  combine(combine(combine(combine(combine(combine(datasets::LargeDepthwiseDilatedConvolutionLayerDataset(),
736  large_depth_multipliers),
738  input_qinfo_dataset),
739  framework::dataset::make("DstQuantizationInfo", { QuantizationInfo(0.9f, 11) })),
740  framework::dataset::make("DataLayout", { DataLayout::NCHW })),
741  ActivationFunctionsDataset))
742 {
743  validate(Accessor(_target), _reference, tolerance_qasymm8);
744 }
745 TEST_SUITE_END() // Dilation
746 TEST_SUITE_END() // Generic
747 
748 TEST_SUITE(W3x3)
750  combine(combine(combine(combine(combine(combine(datasets::SmallDepthwiseConvolutionLayerDataset3x3(), depth_multipliers),
752  input_qinfo_dataset),
753  framework::dataset::make("DstQuantizationInfo", { QuantizationInfo(0.5f, 10) })),
754  framework::dataset::make("DataLayout", { DataLayout::NCHW })),
755  ActivationFunctionsDataset))
756 {
757  validate(Accessor(_target), _reference, tolerance_qasymm8);
758 }
760  combine(combine(combine(combine(combine(combine(datasets::LargeDepthwiseConvolutionLayerDataset3x3(),
761  large_depth_multipliers),
763  input_qinfo_dataset),
764  framework::dataset::make("DstQuantizationInfo", { QuantizationInfo(0.5f, 10) })),
765  framework::dataset::make("DataLayout", { DataLayout::NCHW })),
766  ActivationFunctionsDataset))
767 {
768  validate(Accessor(_target), _reference, tolerance_qasymm8);
769 }
770 
771 TEST_SUITE(Dilation)
772 FIXTURE_DATA_TEST_CASE_NEW(RunSmall, NEDepthwiseConvolutionLayerQuantizedFixture<int8_t>, framework::DatasetMode::PRECOMMIT,
773  combine(combine(combine(combine(combine(combine(datasets::SmallDepthwiseDilatedConvolutionLayerDataset3x3(), depth_multipliers),
774  framework::dataset::make("DataType", DataType::QASYMM8_SIGNED)),
775  input_qinfo_dataset),
776  framework::dataset::make("DstQuantizationInfo", { QuantizationInfo(0.7f, 10) })),
777  framework::dataset::make("DataLayout", { DataLayout::NCHW })),
778  ActivationFunctionsDataset))
779 {
780  validate(Accessor(_target), _reference, tolerance_qasymm8);
781 }
783  combine(combine(combine(combine(combine(combine(datasets::LargeDepthwiseDilatedConvolutionLayerDataset3x3(),
784  large_depth_multipliers),
786  input_qinfo_dataset),
787  framework::dataset::make("DstQuantizationInfo", { QuantizationInfo(0.5f, 10) })),
788  framework::dataset::make("DataLayout", { DataLayout::NCHW })),
789  ActivationFunctionsDataset))
790 {
791  validate(Accessor(_target), _reference, tolerance_qasymm8);
792 }
793 TEST_SUITE_END() // Dilation
794 TEST_SUITE_END() // W3x3
795 
796 TEST_SUITE(Optimized)
798  combine(combine(combine(combine(combine(combine(datasets::SmallOptimizedDepthwiseConvolutionLayerDataset3x3(),
799  framework::dataset::make("DepthMultiplier", 1)),
800  framework::dataset::make("DataType",
802  input_qinfo_dataset),
803  framework::dataset::make("DstQuantizationInfo", { QuantizationInfo(0.5f, 10) })),
804  framework::dataset::make("DataLayout", { DataLayout::NCHW })),
805  ActivationFunctionsDataset))
806 {
807  validate(Accessor(_target), _reference, tolerance_qasymm8);
808 }
810  combine(combine(combine(combine(combine(combine(datasets::SmallOptimizedDepthwiseConvolutionLayerDataset5x5(),
811  framework::dataset::make("DepthMultiplier", 1)),
812  framework::dataset::make("DataType",
814  input_qinfo_dataset),
815  framework::dataset::make("DstQuantizationInfo", { QuantizationInfo(0.5f, 10) })),
816  framework::dataset::make("DataLayout", { DataLayout::NCHW })),
817  ActivationFunctionsDataset))
818 {
819  validate(Accessor(_target), _reference, tolerance_qasymm8);
820 }
822  combine(combine(combine(combine(combine(combine(datasets::LargeOptimizedDepthwiseConvolutionLayerDataset3x3(),
823  framework::dataset::make("DepthMultiplier", 1)),
824  framework::dataset::make("DataType",
826  input_qinfo_dataset),
827  framework::dataset::make("DstQuantizationInfo", { QuantizationInfo(0.5f, 10) })),
828  framework::dataset::make("DataLayout", { DataLayout::NCHW })),
829  ActivationFunctionsDataset))
830 {
831  validate(Accessor(_target), _reference, tolerance_qasymm8);
832 }
833 TEST_SUITE_END() // Optimized
834 TEST_SUITE_END() // QASYMM8_SIGNED
835 
837 TEST_SUITE(Generic)
839  combine(combine(combine(combine(combine(combine(combine(datasets::SmallDepthwiseConvolutionLayerDataset(),
840  depth_multipliers),
841  framework::dataset::make("InputDataType", DataType::QASYMM8)),
843  input_qinfo_dataset),
844  framework::dataset::make("DstQuantizationInfo", { QuantizationInfo(0.5f, 4) })),
846  ActivationFunctionsDataset))
847 {
848  validate(Accessor(_target), _reference, tolerance_qasymm8);
849 }
850 
851 TEST_SUITE(Dilation)
853  combine(combine(combine(combine(combine(combine(combine(datasets::SmallDepthwiseDilatedConvolutionLayerDataset(),
854  depth_multipliers),
855  framework::dataset::make("InputDataType", DataType::QASYMM8)),
856  framework::dataset::make("WeightsDataType", DataType::QSYMM8_PER_CHANNEL)),
857  input_qinfo_dataset),
858  framework::dataset::make("DstQuantizationInfo", { QuantizationInfo(0.5f, 4) })),
860  ActivationFunctionsDataset))
861 {
862  validate(Accessor(_target), _reference, tolerance_qasymm8);
863 }
865  combine(combine(combine(combine(combine(combine(combine(datasets::LargeDepthwiseDilatedConvolutionLayerDataset(),
866  depth_multipliers),
867  framework::dataset::make("InputDataType", DataType::QASYMM8)),
869  input_qinfo_dataset),
870  framework::dataset::make("DstQuantizationInfo", { QuantizationInfo(0.5f, 4) })),
872  ActivationFunctionsDataset))
873 {
874  validate(Accessor(_target), _reference, tolerance_qasymm8);
875 }
876 TEST_SUITE_END() // Dilation
877 TEST_SUITE_END() // Generic
878 
879 TEST_SUITE(Optimized)
881  combine(combine(combine(combine(combine(combine(combine(datasets::SmallOptimizedDepthwiseConvolutionLayerDataset3x3(),
882  framework::dataset::make("DepthMultiplier", 1)),
883  framework::dataset::make("InputDataType", DataType::QASYMM8)),
885  input_qinfo_dataset),
886  framework::dataset::make("DstQuantizationInfo", { QuantizationInfo(0.5f, 4) })),
887  framework::dataset::make("DataLayout", { DataLayout::NHWC })),
888  ActivationFunctionsDataset))
889 {
890  validate(Accessor(_target), _reference, tolerance_qasymm8);
891 }
893  combine(combine(combine(combine(combine(combine(combine(datasets::LargeOptimizedDepthwiseConvolutionLayerDataset3x3(),
894  framework::dataset::make("DepthMultiplier", 1)),
895  framework::dataset::make("InputDataType", DataType::QASYMM8)),
897  input_qinfo_dataset),
898  framework::dataset::make("DstQuantizationInfo", { QuantizationInfo(0.5f, 4) })),
899  framework::dataset::make("DataLayout", { DataLayout::NHWC })),
900  ActivationFunctionsDataset))
901 {
902  validate(Accessor(_target), _reference, tolerance_qasymm8);
903 }
904 TEST_SUITE_END() // Optimized
905 TEST_SUITE_END() // QSYMM8_PER_CHANNEL
906 TEST_SUITE_END() // Quantized
907 
908 TEST_SUITE_END() // DepthwiseConvLayer
909 TEST_SUITE_END() // Neon
910 } // namespace validation
911 } // namespace test
912 } // namespace arm_compute
Shape of a tensor.
Definition: TensorShape.h:39
DepthwiseConvolutionLayerValidationFixture< Tensor, Accessor, NEDepthwiseConvolutionLayer, T, false, false, true > NEDepthwiseConvolutionLayerVariableWeightsFixture
half_float::half half
16-bit floating point type
Definition: Types.h:48
1 channel, 1 F32 per channel
ARM_COMPUTE_EXPECT(has_error==expected, framework::LogLevel::ERRORS)
DepthwiseConvolutionLayerValidationQuantizedPerChannelFixture< Tensor, Accessor, NEDepthwiseConvolutionLayer, uint8_t, int8_t > NEDepthwiseConvolutionLayerQuantizedSymmetricPerChannelFixture
std::enable_if< is_container< T >::value, ContainerDataset< T > >::type make(std::string name, T &&values)
Helper function to create a ContainerDataset.
Activation Layer Information class.
Definition: Types.h:1639
Copyright (c) 2017-2022 Arm Limited.
1 channel, 1 F16 per channel
1 channel, 1 S32 per channel
RelativeTolerance< half_float::half > tolerance_f16(half_float::half(0.1))
Tolerance value for comparing reference&#39;s output against implementation&#39;s output for DataType::F16...
Quantization information.
DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(framework::dataset::make("InputInfo", { TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::F32), TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8), TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::QASYMM8), TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QSYMM16), TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QSYMM16), TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QSYMM16), }), framework::dataset::make("OutputInfo",{ TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F16), TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::F32), TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8), TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::QASYMM8), TensorInfo(TensorShape(30U, 11U, 2U), 1, DataType::F32), TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QSYMM16, QuantizationInfo(1.f/32768.f, 0)), TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QSYMM16, QuantizationInfo(1.f/32768.f, 0)), TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QSYMM16, QuantizationInfo(1.f/32768.f, 0)), })), framework::dataset::make("ActivationInfo", { ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU), ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU), ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU), ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LU_BOUNDED_RELU), ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::TANH), ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU), ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::TANH), ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LOGISTIC), ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::SQRT), })), framework::dataset::make("Expected", { false, true, true, true, false, false, true, true, false })), input_info, output_info, act_info, expected)
DepthwiseConvolutionLayerValidationQuantizedFixture< Tensor, Accessor, NEDepthwiseConvolutionLayer, T, true > NEDepthwiseConvolutionLayerQuantizedMixedDataLayoutFixture
Accessor implementation for Tensor objects.
Definition: Accessor.h:35
DatasetMode
Possible dataset modes.
Definition: DatasetModes.h:40
DepthwiseConvolutionLayerValidationFixture< Tensor, Accessor, NEDepthwiseConvolutionLayer, T > NEDepthwiseConvolutionLayerFixture
TEST_SUITE_END() FIXTURE_DATA_TEST_CASE(RunSmall
[CLActivationLayer Test snippet]
static Status validate(const ITensorInfo *input, const ITensorInfo *weights, const ITensorInfo *biases, const ITensorInfo *output, const PadStrideInfo &conv_info, unsigned int depth_multiplier=1, const ActivationLayerInfo &act_info=ActivationLayerInfo(), const Size2D &dilation=Size2D(1U, 1U))
Static function to check if given info will lead to a valid configuration of NEDepthwiseConvolutionLa...
quantized, asymmetric fixed-point 8-bit number unsigned
RelativeTolerance< float > tolerance_f32(0.01f)
Tolerance value for comparing reference&#39;s output against implementation&#39;s output for DataType::F32...
Padding and stride information class.
Definition: Types.h:669
validate(CLAccessor(output_state), expected_output)
Num samples, channels, height, width.
constexpr float tolerance_num
Tolerance number.
quantized, symmetric per channel fixed-point 8-bit number
Class for specifying the size of an image or rectangle.
Definition: Size2D.h:34
Num samples, height, width, channels.
Store the tensor&#39;s metadata.
Definition: TensorInfo.h:43
quantized, asymmetric fixed-point 8-bit number signed
zip(zip(framework::dataset::make("Weights", { TensorInfo(TensorShape(32U, 13U, 2U, 2U), 1, DataType::F32), TensorInfo(TensorShape(32U, 13U, 2U, 2U), 1, DataType::F32), TensorInfo(TensorShape(32U, 13U, 2U, 1U), 1, DataType::F32), }), framework::dataset::make("MVBGInfo",{ TensorInfo(TensorShape(2U), 1, DataType::F32), TensorInfo(TensorShape(2U), 1, DataType::F16), TensorInfo(TensorShape(5U), 1, DataType::F32), })), framework::dataset::make("Expected", { true, false, false}))
TEST_SUITE(QASYMM8_to_F32) FIXTURE_DATA_TEST_CASE(RunSmall
DataType
Available data types.
Definition: Types.h:79
DepthwiseConvolutionLayerValidationFixture< Tensor, Accessor, NEDepthwiseConvolutionLayer, T, true > NEDepthwiseConvolutionLayerMixedDataLayoutFixture
DataLayout
[DataLayout enum definition]
Definition: Types.h:113
combine(datasets::SmallShapes(), framework::dataset::make("DataType", DataType::F32)))
Definition: AbsLayer.cpp:65
FIXTURE_DATA_TEST_CASE_NEW(RunSmall, CLDepthwiseConvolutionLayerFixture< half >, framework::DatasetMode::ALL, combine(combine(combine(combine(framework::dataset::concat(datasets::SmallDepthwiseConvolutionLayerDataset3x3(), datasets::SmallDepthwiseConvolutionLayerDataset3x3NCHW()), depth_multipliers), framework::dataset::make("DataType", DataType::F16)), framework::dataset::make("DataLayout", DataLayout::NCHW)), ActivationFunctionsDataset))