xref: /aosp_15_r20/external/armnn/src/backends/backendsCommon/test/Convolution3dEndToEndTestImpl.hpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1 //
2 // Copyright © 2021 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 #pragma once
6 
7 #include "EndToEndTestImpl.hpp"
8 #include <armnnUtils/QuantizeHelper.hpp>
9 
10 #include <ResolveType.hpp>
11 
12 #include <CommonTestUtils.hpp>
13 #include <armnnTestUtils/DataLayoutUtils.hpp>
14 
15 #include <map>
16 #include <vector>
17 
18 namespace
19 {
20 
CreateConvolution3dNetwork(const armnn::Convolution3dDescriptor & descriptor,const armnn::TensorInfo & inputInfo,const armnn::TensorInfo & weightsInfo,const armnn::TensorInfo & biasInfo,const armnn::TensorInfo & outputInfo,const armnn::ConstTensor & weights,const armnn::ConstTensor & biases)21 armnn::INetworkPtr CreateConvolution3dNetwork(const armnn::Convolution3dDescriptor& descriptor,
22                                               const armnn::TensorInfo& inputInfo,
23                                               const armnn::TensorInfo& weightsInfo,
24                                               const armnn::TensorInfo& biasInfo,
25                                               const armnn::TensorInfo& outputInfo,
26                                               const armnn::ConstTensor& weights,
27                                               const armnn::ConstTensor& biases)
28 {
29     using namespace armnn;
30 
31     INetworkPtr network(INetwork::Create());
32     IConnectableLayer* input = network->AddInputLayer(0, "input");
33     armnn::IConnectableLayer* weightsLayer = network->AddConstantLayer(weights, "Weights");
34     armnn::IConnectableLayer* biasLayer = network->AddConstantLayer(biases, "Bias");
35     IConnectableLayer* convolution3d = network->AddConvolution3dLayer(descriptor, "convolution3d");
36     IConnectableLayer* output = network->AddOutputLayer(0, "output");
37 
38     Connect(input, convolution3d, inputInfo, 0, 0);
39     Connect(weightsLayer, convolution3d, weightsInfo, 0, 1);
40     Connect(biasLayer, convolution3d, biasInfo, 0, 2);
41     Connect(convolution3d, output, outputInfo, 0, 0);
42 
43     return network;
44 }
45 
46 } // anonymous namespace
47 
48 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType>
Convolution3dEndToEnd(const std::vector<armnn::BackendId> & backends,armnn::DataLayout dataLayout)49 void Convolution3dEndToEnd(const std::vector<armnn::BackendId>& backends,
50                            armnn::DataLayout dataLayout)
51 {
52     using namespace armnn;
53     using T  = ResolveType<ArmnnType>;
54     using BT = ResolveType<ArmnnBType>;
55 
56     const float   qScale  = IsQuantizedType<T>() ? 0.25f : 1.0f;
57     const int32_t qOffset = IsQuantizedType<T>() ? 50    : 0;
58 
59     TensorInfo inputInfo({ 1, 5, 5, 5, 1 }, ArmnnType, qScale, qOffset, true);
60     TensorInfo outputInfo({ 1, 2, 2, 2, 1 }, ArmnnType, qScale, qOffset);
61     TensorInfo weightsInfo({ 3, 3, 3, 1, 1 }, ArmnnType, qScale, qOffset, true);
62     TensorInfo biasesInfo({ 1 }, ArmnnBType, qScale * qScale, 0, true);
63 
64     std::vector<float> inputData =
65     {
66         0.0f,  1.0f,  2.0f,  3.0f,  4.0f,
67         5.0f,  6.0f,  7.0f,  8.0f,  9.0f,
68         10.0f, 11.0f, 12.0f, 13.0f, 14.0f,
69         15.0f, 16.0f, 17.0f, 18.0f, 19.0f,
70 
71         20.0f, 21.0f, 22.0f, 23.0f, 24.0f,
72         25.0f, 26.0f, 27.0f, 28.0f, 29.0f,
73         30.0f, 31.0f, 32.0f, 33.0f, 34.0f,
74         35.0f, 36.0f, 37.0f, 38.0f, 39.0f,
75         40.0f, 41.0f, 42.0f, 43.0f, 44.0f,
76 
77         45.0f, 46.0f, 47.0f, 48.0f, 49.0f,
78         50.0f, 51.0f, 52.0f, 53.0f, 54.0f,
79         55.0f, 56.0f, 57.0f, 58.0f, 59.0f,
80         60.0f, 61.0f, 62.0f, 63.0f, 64.0f,
81         65.0f, 66.0f, 67.0f, 68.0f, 69.0f,
82 
83         70.0f, 71.0f, 72.0f, 73.0f, 74.0f,
84         75.0f, 76.0f, 77.0f, 78.0f, 79.0f,
85         80.0f, 81.0f, 82.0f, 83.0f, 84.0f,
86         85.0f, 86.0f, 87.0f, 88.0f, 89.0f,
87         90.0f, 91.0f, 92.0f, 93.0f, 94.0f,
88         95.0f, 96.0f, 97.0f, 98.0f, 99.0f,
89 
90         100.0f, 101.0f, 102.0f, 103.0f, 104.0f,
91         105.0f, 106.0f, 107.0f, 108.0f, 109.0f,
92         110.0f, 111.0f, 112.0f, 113.0f, 114.0f,
93         115.0f, 116.0f, 117.0f, 118.0f, 119.0f,
94         120.0f, 121.0f, 122.0f, 123.0f, 124.0f
95     };
96 
97     std::vector<float> weightsData =
98     {
99         1.0f, 1.0f, 1.0f,
100         1.0f, 1.0f, 1.0f,
101         1.0f, 1.0f, 1.0f,
102 
103         0.0f, 0.0f, 0.0f,
104         0.0f, 0.0f, 0.0f,
105         0.0f, 0.0f, 0.0f,
106 
107         1.0f, 1.0f, 1.0f,
108         1.0f, 1.0f, 1.0f,
109         1.0f, 1.0f, 1.0f,
110     };
111 
112     std::vector<float> biasesData = { 1.f };
113 
114     std::vector<float> expectedOutputData =
115     {
116         559.0f, 595.0f,
117 
118         739.0f, 775.0f,
119 
120         1459.0f, 1495.0f,
121 
122         1639.0f, 1675.0f,
123     };
124 
125     Convolution3dDescriptor descriptor;
126     descriptor.m_PadLeft     = 0;
127     descriptor.m_PadRight    = 0;
128     descriptor.m_PadTop      = 0;
129     descriptor.m_PadBottom   = 0;
130     descriptor.m_PadFront    = 0;
131     descriptor.m_PadBack     = 0;
132     descriptor.m_StrideX     = 2;
133     descriptor.m_StrideY     = 2;
134     descriptor.m_StrideZ     = 2;
135     descriptor.m_BiasEnabled = true;
136     descriptor.m_DataLayout  = dataLayout;
137 
138     // Permute input and output if NCDHW.
139     if (dataLayout == DataLayout::NCDHW)
140     {
141         PermuteTensorNdhwcToNcdhw(inputInfo, inputData);
142         PermuteTensorNdhwcToNcdhw(outputInfo, expectedOutputData);
143     }
144 
145     // Quantize data
146     std::vector<T> qInputData          = armnnUtils::QuantizedVector<T>(inputData, qScale, qOffset);
147     std::vector<T> qWeightsData        = armnnUtils::QuantizedVector<T>(weightsData, qScale, qOffset);
148     std::vector<T> qExpectedOutputData = armnnUtils::QuantizedVector<T>(expectedOutputData, qScale, qOffset);
149 
150     std::vector<BT> qBiasesData = armnnUtils::QuantizedVector<BT>(biasesData, qScale * qScale, 0);
151 
152     ConstTensor weights(weightsInfo, qWeightsData);
153     ConstTensor biases(biasesInfo, qBiasesData);
154 
155     INetworkPtr network = CreateConvolution3dNetwork(descriptor,
156                                                      inputInfo,
157                                                      weightsInfo,
158                                                      biasesInfo,
159                                                      outputInfo,
160                                                      weights,
161                                                      biases);
162 
163     EndToEndLayerTestImpl<ArmnnType, ArmnnType>(std::move(network),
164                                                 { { 0, qInputData } },
165                                                 { { 0, qExpectedOutputData } },
166                                                 backends);
167 }
168