blob: 3451ced8b8db1797867cb191f04b4b1ccba732b9 [file] [log] [blame]
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +01001//
2// Copyright © 2021 Arm Ltd and Contributors. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5#pragma once
6
7#include "EndToEndTestImpl.hpp"
Colm Donelanc42a9872022-02-02 16:35:09 +00008#include <armnnUtils/QuantizeHelper.hpp>
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +01009
10#include <ResolveType.hpp>
11
Sadik Armagana097d2a2021-11-24 15:47:28 +000012#include <CommonTestUtils.hpp>
13#include <armnnTestUtils/DataLayoutUtils.hpp>
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +010014
15#include <map>
16#include <vector>
17
18namespace
19{
20
21armnn::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
48template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType>
49void 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
Cathal Corbett5b8093c2021-10-22 11:12:07 +010059 TensorInfo inputInfo({ 1, 5, 5, 5, 1 }, ArmnnType, qScale, qOffset, true);
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +010060 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}