blob: 98532d0cec593db7bc0f59d98ff18b515f5ff18e [file] [log] [blame]
Mike Kelly8c1701a2019-02-11 17:01:27 +00001//
Teresa Charlin52664732020-06-29 16:27:03 +01002// Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
Mike Kelly8c1701a2019-02-11 17:01:27 +00003// SPDX-License-Identifier: MIT
4//
5
Mike Kelly8c1701a2019-02-11 17:01:27 +00006#include "../Serializer.hpp"
Finn Williamsb454c5c2021-02-09 15:56:23 +00007#include "SerializerTestUtils.hpp"
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00008
Matthew Benthamff130e22020-01-17 11:47:42 +00009#include <armnn/Descriptors.hpp>
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +000010#include <armnn/INetwork.hpp>
Matthew Benthamff130e22020-01-17 11:47:42 +000011#include <armnn/TypesUtils.hpp>
12#include <armnn/LstmParams.hpp>
13#include <armnn/QuantizedLstmParams.hpp>
Derek Lamberti0028d1b2019-02-20 13:57:42 +000014#include <armnnDeserializer/IDeserializer.hpp>
Finn Williamsb454c5c2021-02-09 15:56:23 +000015#include <armnn/utility/IgnoreUnused.hpp>
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +000016
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +000017#include <random>
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +000018#include <vector>
19
Sadik Armagan1625efc2021-06-10 18:24:34 +010020#include <doctest/doctest.h>
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +000021
Derek Lamberti0028d1b2019-02-20 13:57:42 +000022using armnnDeserializer::IDeserializer;
Mike Kelly8c1701a2019-02-11 17:01:27 +000023
Sadik Armagan1625efc2021-06-10 18:24:34 +010024TEST_SUITE("SerializerTests")
25{
Finn Williamsb454c5c2021-02-09 15:56:23 +000026
Sadik Armagan1625efc2021-06-10 18:24:34 +010027TEST_CASE("SerializeAddition")
Mike Kelly8c1701a2019-02-11 17:01:27 +000028{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +000029 const std::string layerName("addition");
30 const armnn::TensorInfo tensorInfo({1, 2, 3}, armnn::DataType::Float32);
31
Mike Kelly8c1701a2019-02-11 17:01:27 +000032 armnn::INetworkPtr network = armnn::INetwork::Create();
33 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
34 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +000035 armnn::IConnectableLayer* const additionLayer = network->AddAdditionLayer(layerName.c_str());
36 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
Mike Kelly8c1701a2019-02-11 17:01:27 +000037
Éanna Ó Catháin633f8592019-02-25 16:26:29 +000038 inputLayer0->GetOutputSlot(0).Connect(additionLayer->GetInputSlot(0));
39 inputLayer1->GetOutputSlot(0).Connect(additionLayer->GetInputSlot(1));
Éanna Ó Catháin633f8592019-02-25 16:26:29 +000040 additionLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
Mike Kelly8c1701a2019-02-11 17:01:27 +000041
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +000042 inputLayer0->GetOutputSlot(0).SetTensorInfo(tensorInfo);
43 inputLayer1->GetOutputSlot(0).SetTensorInfo(tensorInfo);
44 additionLayer->GetOutputSlot(0).SetTensorInfo(tensorInfo);
Jim Flynn3091b062019-02-15 14:45:04 +000045
Finn Williamsb454c5c2021-02-09 15:56:23 +000046 std::string serializedNetwork = SerializeNetwork(*network);
47 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(serializedNetwork);
Sadik Armagan1625efc2021-06-10 18:24:34 +010048 CHECK(deserializedNetwork);
Éanna Ó Catháin633f8592019-02-25 16:26:29 +000049
Finn Williamsb454c5c2021-02-09 15:56:23 +000050 LayerVerifierBase verifier(layerName, {tensorInfo, tensorInfo}, {tensorInfo});
51 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +000052}
Jim Flynnac25a1b2019-02-28 10:40:49 +000053
Mike Kelly1f140f72021-04-06 12:25:55 +010054void SerializeArgMinMaxTest(armnn::DataType dataType)
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +010055{
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +010056 const std::string layerName("argminmax");
57 const armnn::TensorInfo inputInfo({1, 2, 3}, armnn::DataType::Float32);
Mike Kelly1f140f72021-04-06 12:25:55 +010058 const armnn::TensorInfo outputInfo({1, 3}, dataType);
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +010059
60 armnn::ArgMinMaxDescriptor descriptor;
61 descriptor.m_Function = armnn::ArgMinMaxFunction::Max;
62 descriptor.m_Axis = 1;
63
64 armnn::INetworkPtr network = armnn::INetwork::Create();
65 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
66 armnn::IConnectableLayer* const argMinMaxLayer = network->AddArgMinMaxLayer(descriptor, layerName.c_str());
67 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
68
69 inputLayer->GetOutputSlot(0).Connect(argMinMaxLayer->GetInputSlot(0));
70 argMinMaxLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
71
72 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
73 argMinMaxLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
74
75 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +010076 CHECK(deserializedNetwork);
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +010077
Finn Williamsb454c5c2021-02-09 15:56:23 +000078 LayerVerifierBaseWithDescriptor<armnn::ArgMinMaxDescriptor> verifier(layerName,
79 {inputInfo},
80 {outputInfo},
81 descriptor);
82 deserializedNetwork->ExecuteStrategy(verifier);
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +010083}
84
Sadik Armagan1625efc2021-06-10 18:24:34 +010085TEST_CASE("SerializeArgMinMaxSigned32")
Mike Kelly1f140f72021-04-06 12:25:55 +010086{
87 SerializeArgMinMaxTest(armnn::DataType::Signed32);
88}
89
Sadik Armagan1625efc2021-06-10 18:24:34 +010090TEST_CASE("SerializeArgMinMaxSigned64")
Mike Kelly1f140f72021-04-06 12:25:55 +010091{
92 SerializeArgMinMaxTest(armnn::DataType::Signed64);
93}
94
Sadik Armagan1625efc2021-06-10 18:24:34 +010095TEST_CASE("SerializeBatchNormalization")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +000096{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +000097 const std::string layerName("batchNormalization");
98 const armnn::TensorInfo inputInfo ({ 1, 3, 3, 1 }, armnn::DataType::Float32);
99 const armnn::TensorInfo outputInfo({ 1, 3, 3, 1 }, armnn::DataType::Float32);
100
101 const armnn::TensorInfo meanInfo({1}, armnn::DataType::Float32);
102 const armnn::TensorInfo varianceInfo({1}, armnn::DataType::Float32);
103 const armnn::TensorInfo betaInfo({1}, armnn::DataType::Float32);
104 const armnn::TensorInfo gammaInfo({1}, armnn::DataType::Float32);
105
106 armnn::BatchNormalizationDescriptor descriptor;
107 descriptor.m_Eps = 0.0010000000475f;
108 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
109
110 std::vector<float> meanData({5.0});
111 std::vector<float> varianceData({2.0});
112 std::vector<float> betaData({1.0});
113 std::vector<float> gammaData({0.0});
114
Finn Williamsb454c5c2021-02-09 15:56:23 +0000115 std::vector<armnn::ConstTensor> constants;
116 constants.emplace_back(armnn::ConstTensor(meanInfo, meanData));
117 constants.emplace_back(armnn::ConstTensor(varianceInfo, varianceData));
118 constants.emplace_back(armnn::ConstTensor(betaInfo, betaData));
119 constants.emplace_back(armnn::ConstTensor(gammaInfo, gammaData));
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000120
121 armnn::INetworkPtr network = armnn::INetwork::Create();
122 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
123 armnn::IConnectableLayer* const batchNormalizationLayer =
Finn Williamsb454c5c2021-02-09 15:56:23 +0000124 network->AddBatchNormalizationLayer(descriptor,
125 constants[0],
126 constants[1],
127 constants[2],
128 constants[3],
129 layerName.c_str());
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000130 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
131
132 inputLayer->GetOutputSlot(0).Connect(batchNormalizationLayer->GetInputSlot(0));
133 batchNormalizationLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
134
135 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
136 batchNormalizationLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
137
138 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100139 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000140
Finn Williamsb454c5c2021-02-09 15:56:23 +0000141 LayerVerifierBaseWithDescriptorAndConstants<armnn::BatchNormalizationDescriptor> verifier(
142 layerName, {inputInfo}, {outputInfo}, descriptor, constants);
143 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000144}
145
Sadik Armagan1625efc2021-06-10 18:24:34 +0100146TEST_CASE("SerializeBatchToSpaceNd")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000147{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000148 const std::string layerName("spaceToBatchNd");
149 const armnn::TensorInfo inputInfo({4, 1, 2, 2}, armnn::DataType::Float32);
150 const armnn::TensorInfo outputInfo({1, 1, 4, 4}, armnn::DataType::Float32);
151
152 armnn::BatchToSpaceNdDescriptor desc;
153 desc.m_DataLayout = armnn::DataLayout::NCHW;
154 desc.m_BlockShape = {2, 2};
155 desc.m_Crops = {{0, 0}, {0, 0}};
156
157 armnn::INetworkPtr network = armnn::INetwork::Create();
158 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
159 armnn::IConnectableLayer* const batchToSpaceNdLayer = network->AddBatchToSpaceNdLayer(desc, layerName.c_str());
160 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
161
162 inputLayer->GetOutputSlot(0).Connect(batchToSpaceNdLayer->GetInputSlot(0));
163 batchToSpaceNdLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
164
165 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
166 batchToSpaceNdLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
167
168 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100169 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000170
Finn Williamsb454c5c2021-02-09 15:56:23 +0000171 LayerVerifierBaseWithDescriptor<armnn::BatchToSpaceNdDescriptor> verifier(layerName,
172 {inputInfo},
173 {outputInfo},
174 desc);
175 deserializedNetwork->ExecuteStrategy(verifier);
Mike Kelly8c1701a2019-02-11 17:01:27 +0000176}
177
Sadik Armagan1625efc2021-06-10 18:24:34 +0100178TEST_CASE("SerializeCast")
mathad01b392e982021-04-07 12:07:30 +0100179{
180 const std::string layerName("cast");
181
182 const armnn::TensorShape shape{1, 5, 2, 3};
183
184 const armnn::TensorInfo inputInfo = armnn::TensorInfo(shape, armnn::DataType::Signed32);
185 const armnn::TensorInfo outputInfo = armnn::TensorInfo(shape, armnn::DataType::Float32);
186
187 armnn::INetworkPtr network = armnn::INetwork::Create();
188 armnn::IConnectableLayer* inputLayer = network->AddInputLayer(0);
189 armnn::IConnectableLayer* castLayer = network->AddCastLayer(layerName.c_str());
190 armnn::IConnectableLayer* outputLayer = network->AddOutputLayer(0);
191
192 inputLayer->GetOutputSlot(0).Connect(castLayer->GetInputSlot(0));
193 castLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
194
195 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
196 castLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
197
198 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100199 CHECK(deserializedNetwork);
mathad01b392e982021-04-07 12:07:30 +0100200
201 LayerVerifierBase verifier(layerName, {inputInfo}, {outputInfo});
202 deserializedNetwork->ExecuteStrategy(verifier);
203}
204
Sadik Armagan1625efc2021-06-10 18:24:34 +0100205TEST_CASE("SerializeComparison")
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100206{
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100207 const std::string layerName("comparison");
208
209 const armnn::TensorShape shape{2, 1, 2, 4};
210
211 const armnn::TensorInfo inputInfo = armnn::TensorInfo(shape, armnn::DataType::Float32);
212 const armnn::TensorInfo outputInfo = armnn::TensorInfo(shape, armnn::DataType::Boolean);
213
214 armnn::ComparisonDescriptor descriptor(armnn::ComparisonOperation::NotEqual);
215
216 armnn::INetworkPtr network = armnn::INetwork::Create();
217 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
218 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
219 armnn::IConnectableLayer* const comparisonLayer = network->AddComparisonLayer(descriptor, layerName.c_str());
220 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
221
222 inputLayer0->GetOutputSlot(0).Connect(comparisonLayer->GetInputSlot(0));
223 inputLayer1->GetOutputSlot(0).Connect(comparisonLayer->GetInputSlot(1));
224 comparisonLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
225
226 inputLayer0->GetOutputSlot(0).SetTensorInfo(inputInfo);
227 inputLayer1->GetOutputSlot(0).SetTensorInfo(inputInfo);
228 comparisonLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
229
230 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100231 CHECK(deserializedNetwork);
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100232
Finn Williamsb454c5c2021-02-09 15:56:23 +0000233 LayerVerifierBaseWithDescriptor<armnn::ComparisonDescriptor> verifier(layerName,
234 { inputInfo, inputInfo },
235 { outputInfo },
236 descriptor);
237 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100238}
239
Sadik Armagan1625efc2021-06-10 18:24:34 +0100240TEST_CASE("SerializeConstant")
Conor Kennedy76277882019-02-26 08:29:54 +0000241{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000242 class ConstantLayerVerifier : public LayerVerifierBase
Conor Kennedy76277882019-02-26 08:29:54 +0000243 {
244 public:
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000245 ConstantLayerVerifier(const std::string& layerName,
246 const std::vector<armnn::TensorInfo>& inputInfos,
247 const std::vector<armnn::TensorInfo>& outputInfos,
Finn Williamsb454c5c2021-02-09 15:56:23 +0000248 const std::vector<armnn::ConstTensor>& constants)
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100249 : LayerVerifierBase(layerName, inputInfos, outputInfos)
Finn Williamsb454c5c2021-02-09 15:56:23 +0000250 , m_Constants(constants) {}
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000251
Finn Williamsb454c5c2021-02-09 15:56:23 +0000252 void ExecuteStrategy(const armnn::IConnectableLayer* layer,
253 const armnn::BaseDescriptor& descriptor,
254 const std::vector<armnn::ConstTensor>& constants,
255 const char* name,
256 const armnn::LayerBindingId id = 0) override
Conor Kennedy76277882019-02-26 08:29:54 +0000257 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000258 armnn::IgnoreUnused(descriptor, id);
259
260 switch (layer->GetType())
261 {
262 case armnn::LayerType::Input: break;
263 case armnn::LayerType::Output: break;
264 case armnn::LayerType::Addition: break;
265 default:
266 {
267 this->VerifyNameAndConnections(layer, name);
268
269 for (std::size_t i = 0; i < constants.size(); i++)
270 {
271 CompareConstTensor(constants[i], m_Constants[i]);
272 }
273 }
274 }
Conor Kennedy76277882019-02-26 08:29:54 +0000275 }
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000276
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000277 private:
Finn Williamsb454c5c2021-02-09 15:56:23 +0000278 const std::vector<armnn::ConstTensor> m_Constants;
Conor Kennedy76277882019-02-26 08:29:54 +0000279 };
280
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000281 const std::string layerName("constant");
282 const armnn::TensorInfo info({ 2, 3 }, armnn::DataType::Float32);
Conor Kennedy76277882019-02-26 08:29:54 +0000283
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000284 std::vector<float> constantData = GenerateRandomData<float>(info.GetNumElements());
285 armnn::ConstTensor constTensor(info, constantData);
Conor Kennedy76277882019-02-26 08:29:54 +0000286
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000287 armnn::INetworkPtr network(armnn::INetwork::Create());
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000288 armnn::IConnectableLayer* input = network->AddInputLayer(0);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000289 armnn::IConnectableLayer* constant = network->AddConstantLayer(constTensor, layerName.c_str());
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000290 armnn::IConnectableLayer* add = network->AddAdditionLayer();
291 armnn::IConnectableLayer* output = network->AddOutputLayer(0);
Conor Kennedy76277882019-02-26 08:29:54 +0000292
293 input->GetOutputSlot(0).Connect(add->GetInputSlot(0));
294 constant->GetOutputSlot(0).Connect(add->GetInputSlot(1));
295 add->GetOutputSlot(0).Connect(output->GetInputSlot(0));
296
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000297 input->GetOutputSlot(0).SetTensorInfo(info);
298 constant->GetOutputSlot(0).SetTensorInfo(info);
299 add->GetOutputSlot(0).SetTensorInfo(info);
Conor Kennedy76277882019-02-26 08:29:54 +0000300
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000301 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100302 CHECK(deserializedNetwork);
Conor Kennedy76277882019-02-26 08:29:54 +0000303
Finn Williamsb454c5c2021-02-09 15:56:23 +0000304 ConstantLayerVerifier verifier(layerName, {}, {info}, {constTensor});
305 deserializedNetwork->ExecuteStrategy(verifier);
Conor Kennedy76277882019-02-26 08:29:54 +0000306}
307
Sadik Armagan1625efc2021-06-10 18:24:34 +0100308TEST_CASE("SerializeConvolution2d")
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000309{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000310 const std::string layerName("convolution2d");
311 const armnn::TensorInfo inputInfo ({ 1, 5, 5, 1 }, armnn::DataType::Float32);
312 const armnn::TensorInfo outputInfo({ 1, 3, 3, 1 }, armnn::DataType::Float32);
Saoirse Stewart263829c2019-02-19 15:54:14 +0000313
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000314 const armnn::TensorInfo weightsInfo({ 1, 3, 3, 1 }, armnn::DataType::Float32);
315 const armnn::TensorInfo biasesInfo ({ 1 }, armnn::DataType::Float32);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000316
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000317 std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements());
318 armnn::ConstTensor weights(weightsInfo, weightsData);
319
320 std::vector<float> biasesData = GenerateRandomData<float>(biasesInfo.GetNumElements());
321 armnn::ConstTensor biases(biasesInfo, biasesData);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000322
323 armnn::Convolution2dDescriptor descriptor;
324 descriptor.m_PadLeft = 1;
325 descriptor.m_PadRight = 1;
326 descriptor.m_PadTop = 1;
327 descriptor.m_PadBottom = 1;
328 descriptor.m_StrideX = 2;
329 descriptor.m_StrideY = 2;
Aron Virginas-Tar5e1b0cf2019-06-21 14:20:11 +0100330 descriptor.m_DilationX = 2;
331 descriptor.m_DilationY = 2;
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000332 descriptor.m_BiasEnabled = true;
333 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
334
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000335 armnn::INetworkPtr network = armnn::INetwork::Create();
336 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000337 armnn::IConnectableLayer* const convLayer =
Matteo Martincighfc598e12019-05-14 10:36:13 +0100338 network->AddConvolution2dLayer(descriptor,
339 weights,
340 armnn::Optional<armnn::ConstTensor>(biases),
341 layerName.c_str());
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000342 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000343
344 inputLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(0));
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000345 convLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000346
347 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000348 convLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
349
350 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100351 CHECK(deserializedNetwork);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000352
Finn Williamsb454c5c2021-02-09 15:56:23 +0000353 const std::vector<armnn::ConstTensor>& constants {weights, biases};
354 LayerVerifierBaseWithDescriptorAndConstants<armnn::Convolution2dDescriptor> verifier(
355 layerName, {inputInfo}, {outputInfo}, descriptor, constants);
356 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000357}
358
Sadik Armagan1625efc2021-06-10 18:24:34 +0100359TEST_CASE("SerializeConvolution2dWithPerAxisParams")
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000360{
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000361 using namespace armnn;
362
363 const std::string layerName("convolution2dWithPerAxis");
364 const TensorInfo inputInfo ({ 1, 3, 1, 2 }, DataType::QAsymmU8, 0.55f, 128);
365 const TensorInfo outputInfo({ 1, 3, 1, 3 }, DataType::QAsymmU8, 0.75f, 128);
366
367 const std::vector<float> quantScales{ 0.75f, 0.65f, 0.85f };
368 constexpr unsigned int quantDimension = 0;
369
370 const TensorInfo kernelInfo({ 3, 1, 1, 2 }, DataType::QSymmS8, quantScales, quantDimension);
371
372 const std::vector<float> biasQuantScales{ 0.25f, 0.50f, 0.75f };
373 const TensorInfo biasInfo({ 3 }, DataType::Signed32, biasQuantScales, quantDimension);
374
375 std::vector<int8_t> kernelData = GenerateRandomData<int8_t>(kernelInfo.GetNumElements());
376 armnn::ConstTensor weights(kernelInfo, kernelData);
377 std::vector<int32_t> biasData = GenerateRandomData<int32_t>(biasInfo.GetNumElements());
378 armnn::ConstTensor biases(biasInfo, biasData);
379
380 Convolution2dDescriptor descriptor;
381 descriptor.m_StrideX = 1;
382 descriptor.m_StrideY = 1;
383 descriptor.m_PadLeft = 0;
384 descriptor.m_PadRight = 0;
385 descriptor.m_PadTop = 0;
386 descriptor.m_PadBottom = 0;
387 descriptor.m_BiasEnabled = true;
388 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
389
390 armnn::INetworkPtr network = armnn::INetwork::Create();
391 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
392 armnn::IConnectableLayer* const convLayer =
393 network->AddConvolution2dLayer(descriptor,
394 weights,
395 armnn::Optional<armnn::ConstTensor>(biases),
396 layerName.c_str());
397 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
398
399 inputLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(0));
400 convLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
401
402 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
403 convLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
404
405 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100406 CHECK(deserializedNetwork);
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000407
Finn Williamsb454c5c2021-02-09 15:56:23 +0000408 const std::vector<armnn::ConstTensor>& constants {weights, biases};
409 LayerVerifierBaseWithDescriptorAndConstants<Convolution2dDescriptor> verifier(
410 layerName, {inputInfo}, {outputInfo}, descriptor, constants);
411 deserializedNetwork->ExecuteStrategy(verifier);
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000412}
413
Sadik Armagan1625efc2021-06-10 18:24:34 +0100414TEST_CASE("SerializeDepthToSpace")
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100415{
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100416 const std::string layerName("depthToSpace");
417
418 const armnn::TensorInfo inputInfo ({ 1, 8, 4, 12 }, armnn::DataType::Float32);
419 const armnn::TensorInfo outputInfo({ 1, 16, 8, 3 }, armnn::DataType::Float32);
420
421 armnn::DepthToSpaceDescriptor desc;
422 desc.m_BlockSize = 2;
423 desc.m_DataLayout = armnn::DataLayout::NHWC;
424
425 armnn::INetworkPtr network = armnn::INetwork::Create();
426 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
427 armnn::IConnectableLayer* const depthToSpaceLayer = network->AddDepthToSpaceLayer(desc, layerName.c_str());
428 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
429
430 inputLayer->GetOutputSlot(0).Connect(depthToSpaceLayer->GetInputSlot(0));
431 depthToSpaceLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
432
433 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
434 depthToSpaceLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
435
436 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100437 CHECK(deserializedNetwork);
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100438
Finn Williamsb454c5c2021-02-09 15:56:23 +0000439 LayerVerifierBaseWithDescriptor<armnn::DepthToSpaceDescriptor> verifier(layerName, {inputInfo}, {outputInfo}, desc);
440 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100441}
442
Sadik Armagan1625efc2021-06-10 18:24:34 +0100443TEST_CASE("SerializeDepthwiseConvolution2d")
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000444{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000445 const std::string layerName("depwiseConvolution2d");
446 const armnn::TensorInfo inputInfo ({ 1, 5, 5, 3 }, armnn::DataType::Float32);
447 const armnn::TensorInfo outputInfo({ 1, 3, 3, 3 }, armnn::DataType::Float32);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000448
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000449 const armnn::TensorInfo weightsInfo({ 1, 3, 3, 3 }, armnn::DataType::Float32);
450 const armnn::TensorInfo biasesInfo ({ 3 }, armnn::DataType::Float32);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000451
452 std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements());
453 armnn::ConstTensor weights(weightsInfo, weightsData);
454
455 std::vector<int32_t> biasesData = GenerateRandomData<int32_t>(biasesInfo.GetNumElements());
456 armnn::ConstTensor biases(biasesInfo, biasesData);
457
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000458 armnn::DepthwiseConvolution2dDescriptor descriptor;
Aron Virginas-Tar5e1b0cf2019-06-21 14:20:11 +0100459 descriptor.m_PadLeft = 1;
460 descriptor.m_PadRight = 1;
461 descriptor.m_PadTop = 1;
462 descriptor.m_PadBottom = 1;
463 descriptor.m_StrideX = 2;
464 descriptor.m_StrideY = 2;
465 descriptor.m_DilationX = 2;
466 descriptor.m_DilationY = 2;
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000467 descriptor.m_BiasEnabled = true;
468 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
469
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000470 armnn::INetworkPtr network = armnn::INetwork::Create();
471 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
472 armnn::IConnectableLayer* const depthwiseConvLayer =
Matteo Martincighfc598e12019-05-14 10:36:13 +0100473 network->AddDepthwiseConvolution2dLayer(descriptor,
474 weights,
475 armnn::Optional<armnn::ConstTensor>(biases),
476 layerName.c_str());
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000477 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
478
479 inputLayer->GetOutputSlot(0).Connect(depthwiseConvLayer->GetInputSlot(0));
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000480 depthwiseConvLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000481
482 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000483 depthwiseConvLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
484
485 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100486 CHECK(deserializedNetwork);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000487
Finn Williamsb454c5c2021-02-09 15:56:23 +0000488 const std::vector<armnn::ConstTensor>& constants {weights, biases};
489 LayerVerifierBaseWithDescriptorAndConstants<armnn::DepthwiseConvolution2dDescriptor> verifier(
490 layerName, {inputInfo}, {outputInfo}, descriptor, constants);
491 deserializedNetwork->ExecuteStrategy(verifier);
Jim Flynn18ce3382019-03-08 11:08:30 +0000492}
493
Sadik Armagan1625efc2021-06-10 18:24:34 +0100494TEST_CASE("SerializeDepthwiseConvolution2dWithPerAxisParams")
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000495{
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000496 using namespace armnn;
497
498 const std::string layerName("depwiseConvolution2dWithPerAxis");
499 const TensorInfo inputInfo ({ 1, 3, 3, 2 }, DataType::QAsymmU8, 0.55f, 128);
500 const TensorInfo outputInfo({ 1, 2, 2, 4 }, DataType::QAsymmU8, 0.75f, 128);
501
502 const std::vector<float> quantScales{ 0.75f, 0.80f, 0.90f, 0.95f };
503 const unsigned int quantDimension = 0;
504 TensorInfo kernelInfo({ 2, 2, 2, 2 }, DataType::QSymmS8, quantScales, quantDimension);
505
506 const std::vector<float> biasQuantScales{ 0.25f, 0.35f, 0.45f, 0.55f };
507 constexpr unsigned int biasQuantDimension = 0;
508 TensorInfo biasInfo({ 4 }, DataType::Signed32, biasQuantScales, biasQuantDimension);
509
510 std::vector<int8_t> kernelData = GenerateRandomData<int8_t>(kernelInfo.GetNumElements());
511 armnn::ConstTensor weights(kernelInfo, kernelData);
512 std::vector<int32_t> biasData = GenerateRandomData<int32_t>(biasInfo.GetNumElements());
513 armnn::ConstTensor biases(biasInfo, biasData);
514
515 DepthwiseConvolution2dDescriptor descriptor;
516 descriptor.m_StrideX = 1;
517 descriptor.m_StrideY = 1;
518 descriptor.m_PadLeft = 0;
519 descriptor.m_PadRight = 0;
520 descriptor.m_PadTop = 0;
521 descriptor.m_PadBottom = 0;
522 descriptor.m_DilationX = 1;
523 descriptor.m_DilationY = 1;
524 descriptor.m_BiasEnabled = true;
525 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
526
527 armnn::INetworkPtr network = armnn::INetwork::Create();
528 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
529 armnn::IConnectableLayer* const depthwiseConvLayer =
530 network->AddDepthwiseConvolution2dLayer(descriptor,
531 weights,
532 armnn::Optional<armnn::ConstTensor>(biases),
533 layerName.c_str());
534 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
535
536 inputLayer->GetOutputSlot(0).Connect(depthwiseConvLayer->GetInputSlot(0));
537 depthwiseConvLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
538
539 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
540 depthwiseConvLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
541
542 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100543 CHECK(deserializedNetwork);
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000544
Finn Williamsb454c5c2021-02-09 15:56:23 +0000545 const std::vector<armnn::ConstTensor>& constants {weights, biases};
546 LayerVerifierBaseWithDescriptorAndConstants<armnn::DepthwiseConvolution2dDescriptor> verifier(
547 layerName, {inputInfo}, {outputInfo}, descriptor, constants);
548 deserializedNetwork->ExecuteStrategy(verifier);
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000549}
550
Sadik Armagan1625efc2021-06-10 18:24:34 +0100551TEST_CASE("SerializeDequantize")
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000552{
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000553 const std::string layerName("dequantize");
Derek Lambertif90c56d2020-01-10 17:14:08 +0000554 const armnn::TensorInfo inputInfo({ 1, 5, 2, 3 }, armnn::DataType::QAsymmU8, 0.5f, 1);
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000555 const armnn::TensorInfo outputInfo({ 1, 5, 2, 3 }, armnn::DataType::Float32);
556
557 armnn::INetworkPtr network = armnn::INetwork::Create();
558 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
559 armnn::IConnectableLayer* const dequantizeLayer = network->AddDequantizeLayer(layerName.c_str());
560 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
561
562 inputLayer->GetOutputSlot(0).Connect(dequantizeLayer->GetInputSlot(0));
563 dequantizeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
564
565 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
566 dequantizeLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
567
568 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100569 CHECK(deserializedNetwork);
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000570
Finn Williamsb454c5c2021-02-09 15:56:23 +0000571 LayerVerifierBase verifier(layerName, {inputInfo}, {outputInfo});
572 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000573}
574
Sadik Armagan1625efc2021-06-10 18:24:34 +0100575TEST_CASE("SerializeDeserializeDetectionPostProcess")
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000576{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000577 const std::string layerName("detectionPostProcess");
578
579 const std::vector<armnn::TensorInfo> inputInfos({
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000580 armnn::TensorInfo({ 1, 6, 4 }, armnn::DataType::Float32),
581 armnn::TensorInfo({ 1, 6, 3}, armnn::DataType::Float32)
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000582 });
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000583
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000584 const std::vector<armnn::TensorInfo> outputInfos({
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000585 armnn::TensorInfo({ 1, 3, 4 }, armnn::DataType::Float32),
586 armnn::TensorInfo({ 1, 3 }, armnn::DataType::Float32),
587 armnn::TensorInfo({ 1, 3 }, armnn::DataType::Float32),
588 armnn::TensorInfo({ 1 }, armnn::DataType::Float32)
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000589 });
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000590
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000591 armnn::DetectionPostProcessDescriptor descriptor;
592 descriptor.m_UseRegularNms = true;
593 descriptor.m_MaxDetections = 3;
594 descriptor.m_MaxClassesPerDetection = 1;
595 descriptor.m_DetectionsPerClass =1;
596 descriptor.m_NmsScoreThreshold = 0.0;
597 descriptor.m_NmsIouThreshold = 0.5;
598 descriptor.m_NumClasses = 2;
599 descriptor.m_ScaleY = 10.0;
600 descriptor.m_ScaleX = 10.0;
601 descriptor.m_ScaleH = 5.0;
602 descriptor.m_ScaleW = 5.0;
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000603
604 const armnn::TensorInfo anchorsInfo({ 6, 4 }, armnn::DataType::Float32);
605 const std::vector<float> anchorsData({
606 0.5f, 0.5f, 1.0f, 1.0f,
607 0.5f, 0.5f, 1.0f, 1.0f,
608 0.5f, 0.5f, 1.0f, 1.0f,
609 0.5f, 10.5f, 1.0f, 1.0f,
610 0.5f, 10.5f, 1.0f, 1.0f,
611 0.5f, 100.5f, 1.0f, 1.0f
612 });
613 armnn::ConstTensor anchors(anchorsInfo, anchorsData);
614
615 armnn::INetworkPtr network = armnn::INetwork::Create();
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000616 armnn::IConnectableLayer* const detectionLayer =
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000617 network->AddDetectionPostProcessLayer(descriptor, anchors, layerName.c_str());
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000618
619 for (unsigned int i = 0; i < 2; i++)
620 {
621 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(static_cast<int>(i));
622 inputLayer->GetOutputSlot(0).Connect(detectionLayer->GetInputSlot(i));
623 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfos[i]);
624 }
625
626 for (unsigned int i = 0; i < 4; i++)
627 {
628 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(static_cast<int>(i));
629 detectionLayer->GetOutputSlot(i).Connect(outputLayer->GetInputSlot(0));
630 detectionLayer->GetOutputSlot(i).SetTensorInfo(outputInfos[i]);
631 }
632
633 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100634 CHECK(deserializedNetwork);
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000635
Finn Williamsb454c5c2021-02-09 15:56:23 +0000636 const std::vector<armnn::ConstTensor>& constants {anchors};
637 LayerVerifierBaseWithDescriptorAndConstants<armnn::DetectionPostProcessDescriptor> verifier(
638 layerName, inputInfos, outputInfos, descriptor, constants);
639 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000640}
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000641
Sadik Armagan1625efc2021-06-10 18:24:34 +0100642TEST_CASE("SerializeDivision")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000643{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000644 const std::string layerName("division");
645 const armnn::TensorInfo info({ 1, 5, 2, 3 }, armnn::DataType::Float32);
646
647 armnn::INetworkPtr network = armnn::INetwork::Create();
648 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
649 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
650 armnn::IConnectableLayer* const divisionLayer = network->AddDivisionLayer(layerName.c_str());
651 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
652
653 inputLayer0->GetOutputSlot(0).Connect(divisionLayer->GetInputSlot(0));
654 inputLayer1->GetOutputSlot(0).Connect(divisionLayer->GetInputSlot(1));
655 divisionLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
656
657 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
658 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
659 divisionLayer->GetOutputSlot(0).SetTensorInfo(info);
660
661 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100662 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000663
Finn Williamsb454c5c2021-02-09 15:56:23 +0000664 LayerVerifierBase verifier(layerName, {info, info}, {info});
665 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000666}
667
Sadik Armagan1625efc2021-06-10 18:24:34 +0100668TEST_CASE("SerializeDeserializeEqual")
Aron Virginas-Tar6d2e6592019-10-22 11:44:47 +0100669{
Finn Williamsb454c5c2021-02-09 15:56:23 +0000670 const std::string layerName("EqualLayer");
671 const armnn::TensorInfo inputTensorInfo1 = armnn::TensorInfo({2, 1, 2, 4}, armnn::DataType::Float32);
672 const armnn::TensorInfo inputTensorInfo2 = armnn::TensorInfo({2, 1, 2, 4}, armnn::DataType::Float32);
673 const armnn::TensorInfo outputTensorInfo = armnn::TensorInfo({2, 1, 2, 4}, armnn::DataType::Boolean);
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100674
675 armnn::INetworkPtr network = armnn::INetwork::Create();
Finn Williamsb454c5c2021-02-09 15:56:23 +0000676 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(0);
677 armnn::IConnectableLayer* const inputLayer2 = network->AddInputLayer(1);
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100678 ARMNN_NO_DEPRECATE_WARN_BEGIN
679 armnn::IConnectableLayer* const equalLayer = network->AddEqualLayer(layerName.c_str());
680 ARMNN_NO_DEPRECATE_WARN_END
681 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
682
Finn Williamsb454c5c2021-02-09 15:56:23 +0000683 inputLayer1->GetOutputSlot(0).Connect(equalLayer->GetInputSlot(0));
684 inputLayer1->GetOutputSlot(0).SetTensorInfo(inputTensorInfo1);
685 inputLayer2->GetOutputSlot(0).Connect(equalLayer->GetInputSlot(1));
686 inputLayer2->GetOutputSlot(0).SetTensorInfo(inputTensorInfo2);
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100687 equalLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
Finn Williamsb454c5c2021-02-09 15:56:23 +0000688 equalLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100689
690 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100691 CHECK(deserializedNetwork);
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100692
Finn Williamsb454c5c2021-02-09 15:56:23 +0000693 LayerVerifierBase verifier(layerName, {inputTensorInfo1, inputTensorInfo2}, {outputTensorInfo});
694 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tar6d2e6592019-10-22 11:44:47 +0100695}
696
Teresa Charlin50de4fa2021-05-31 18:47:33 +0100697void SerializeElementwiseUnaryTest(armnn::UnaryOperation unaryOperation)
698{
699 auto layerName = GetUnaryOperationAsCString(unaryOperation);
700
701 const armnn::TensorShape shape{2, 1, 2, 2};
702
703 const armnn::TensorInfo inputInfo = armnn::TensorInfo(shape, armnn::DataType::Float32);
704 const armnn::TensorInfo outputInfo = armnn::TensorInfo(shape, armnn::DataType::Float32);
705
706 armnn::ElementwiseUnaryDescriptor descriptor(unaryOperation);
707
708 armnn::INetworkPtr network = armnn::INetwork::Create();
709 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
710 armnn::IConnectableLayer* const elementwiseUnaryLayer =
711 network->AddElementwiseUnaryLayer(descriptor, layerName);
712 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
713
714 inputLayer->GetOutputSlot(0).Connect(elementwiseUnaryLayer->GetInputSlot(0));
715 elementwiseUnaryLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
716
717 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
718 elementwiseUnaryLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
719
720 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
721
722 CHECK(deserializedNetwork);
723
724 LayerVerifierBaseWithDescriptor<armnn::ElementwiseUnaryDescriptor>
725 verifier(layerName, { inputInfo }, { outputInfo }, descriptor);
726
727 deserializedNetwork->ExecuteStrategy(verifier);
728}
729
730TEST_CASE("SerializeElementwiseUnary")
731{
732 using op = armnn::UnaryOperation;
733 std::initializer_list<op> allUnaryOperations = {op::Abs, op::Exp, op::Sqrt, op::Rsqrt, op::Neg,
734 op::LogicalNot, op::Log, op::Sin};
735
736 for (auto unaryOperation : allUnaryOperations)
737 {
738 SerializeElementwiseUnaryTest(unaryOperation);
739 }
740}
741
Sadik Armagan1625efc2021-06-10 18:24:34 +0100742TEST_CASE("SerializeFill")
Keith Davis300ad562020-06-04 16:34:23 +0100743{
Keith Davis300ad562020-06-04 16:34:23 +0100744 const std::string layerName("fill");
Teresa Charlin4b10fef2020-07-29 09:36:41 +0100745 const armnn::TensorInfo inputInfo({4}, armnn::DataType::Signed32);
Keith Davis300ad562020-06-04 16:34:23 +0100746 const armnn::TensorInfo outputInfo({1, 3, 3, 1}, armnn::DataType::Float32);
747
748 armnn::FillDescriptor descriptor(1.0f);
749
750 armnn::INetworkPtr network = armnn::INetwork::Create();
751 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
752 armnn::IConnectableLayer* const fillLayer = network->AddFillLayer(descriptor, layerName.c_str());
753 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
754
755 inputLayer->GetOutputSlot(0).Connect(fillLayer->GetInputSlot(0));
756 fillLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
757
758 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
759 fillLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
760
761 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100762 CHECK(deserializedNetwork);
Keith Davis300ad562020-06-04 16:34:23 +0100763
Finn Williamsb454c5c2021-02-09 15:56:23 +0000764 LayerVerifierBaseWithDescriptor<armnn::FillDescriptor> verifier(layerName, {inputInfo}, {outputInfo}, descriptor);
Keith Davis300ad562020-06-04 16:34:23 +0100765
Finn Williamsb454c5c2021-02-09 15:56:23 +0000766 deserializedNetwork->ExecuteStrategy(verifier);
Keith Davis300ad562020-06-04 16:34:23 +0100767}
768
Sadik Armagan1625efc2021-06-10 18:24:34 +0100769TEST_CASE("SerializeFloor")
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100770{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000771 const std::string layerName("floor");
772 const armnn::TensorInfo info({4,4}, armnn::DataType::Float32);
773
774 armnn::INetworkPtr network = armnn::INetwork::Create();
775 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
776 armnn::IConnectableLayer* const floorLayer = network->AddFloorLayer(layerName.c_str());
777 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
778
779 inputLayer->GetOutputSlot(0).Connect(floorLayer->GetInputSlot(0));
780 floorLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
781
782 inputLayer->GetOutputSlot(0).SetTensorInfo(info);
783 floorLayer->GetOutputSlot(0).SetTensorInfo(info);
784
785 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100786 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000787
Finn Williamsb454c5c2021-02-09 15:56:23 +0000788 LayerVerifierBase verifier(layerName, {info}, {info});
789 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000790}
791
Sadik Armagan1625efc2021-06-10 18:24:34 +0100792TEST_CASE("SerializeFullyConnected")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000793{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000794 const std::string layerName("fullyConnected");
795 const armnn::TensorInfo inputInfo ({ 2, 5, 1, 1 }, armnn::DataType::Float32);
796 const armnn::TensorInfo outputInfo({ 2, 3 }, armnn::DataType::Float32);
797
798 const armnn::TensorInfo weightsInfo({ 5, 3 }, armnn::DataType::Float32);
799 const armnn::TensorInfo biasesInfo ({ 3 }, armnn::DataType::Float32);
800 std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements());
801 std::vector<float> biasesData = GenerateRandomData<float>(biasesInfo.GetNumElements());
802 armnn::ConstTensor weights(weightsInfo, weightsData);
803 armnn::ConstTensor biases(biasesInfo, biasesData);
804
805 armnn::FullyConnectedDescriptor descriptor;
806 descriptor.m_BiasEnabled = true;
807 descriptor.m_TransposeWeightMatrix = false;
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000808 descriptor.m_ConstantWeights = true;
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000809
810 armnn::INetworkPtr network = armnn::INetwork::Create();
811 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
812 armnn::IConnectableLayer* const fullyConnectedLayer =
Matteo Martincighfc598e12019-05-14 10:36:13 +0100813 network->AddFullyConnectedLayer(descriptor,
814 weights,
815 armnn::Optional<armnn::ConstTensor>(biases),
816 layerName.c_str());
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000817 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
818
819 inputLayer->GetOutputSlot(0).Connect(fullyConnectedLayer->GetInputSlot(0));
820 fullyConnectedLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
821
822 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
823 fullyConnectedLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
824
825 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100826 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000827
Finn Williamsb454c5c2021-02-09 15:56:23 +0000828 const std::vector<armnn::ConstTensor> constants {weights, biases};
829 LayerVerifierBaseWithDescriptorAndConstants<armnn::FullyConnectedDescriptor> verifier(
830 layerName, {inputInfo}, {outputInfo}, descriptor, constants);
831 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000832}
833
Sadik Armagan1625efc2021-06-10 18:24:34 +0100834TEST_CASE("SerializeFullyConnectedWeightsAsInputs")
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000835{
836 const std::string layerName("fullyConnected_weights_as_inputs");
837 const armnn::TensorInfo inputInfo ({ 2, 5, 1, 1 }, armnn::DataType::Float32);
838 const armnn::TensorInfo outputInfo({ 2, 3 }, armnn::DataType::Float32);
839
840 const armnn::TensorInfo weightsInfo({ 5, 3 }, armnn::DataType::Float32);
841 const armnn::TensorInfo biasesInfo ({ 3 }, armnn::DataType::Float32);
842
843 armnn::Optional<armnn::ConstTensor> weights = armnn::EmptyOptional();
844 armnn::Optional<armnn::ConstTensor> bias = armnn::EmptyOptional();
845
846 armnn::FullyConnectedDescriptor descriptor;
847 descriptor.m_BiasEnabled = true;
848 descriptor.m_TransposeWeightMatrix = false;
849 descriptor.m_ConstantWeights = false;
850
851 armnn::INetworkPtr network = armnn::INetwork::Create();
852 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
853 armnn::IConnectableLayer* const weightsInputLayer = network->AddInputLayer(1);
854 armnn::IConnectableLayer* const biasInputLayer = network->AddInputLayer(2);
855 armnn::IConnectableLayer* const fullyConnectedLayer =
856 network->AddFullyConnectedLayer(descriptor,
857 weights,
858 bias,
859 layerName.c_str());
860 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
861
862 inputLayer->GetOutputSlot(0).Connect(fullyConnectedLayer->GetInputSlot(0));
863 weightsInputLayer->GetOutputSlot(0).Connect(fullyConnectedLayer->GetInputSlot(1));
864 biasInputLayer->GetOutputSlot(0).Connect(fullyConnectedLayer->GetInputSlot(2));
865 fullyConnectedLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
866
867 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
868 weightsInputLayer->GetOutputSlot(0).SetTensorInfo(weightsInfo);
869 biasInputLayer->GetOutputSlot(0).SetTensorInfo(biasesInfo);
870 fullyConnectedLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
871
872 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100873 CHECK(deserializedNetwork);
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000874
875 const std::vector<armnn::ConstTensor> constants {};
876 LayerVerifierBaseWithDescriptorAndConstants<armnn::FullyConnectedDescriptor> verifier(
877 layerName, {inputInfo, weightsInfo, biasesInfo}, {outputInfo}, descriptor, constants);
878 deserializedNetwork->ExecuteStrategy(verifier);
879}
880
Sadik Armagan1625efc2021-06-10 18:24:34 +0100881TEST_CASE("SerializeGather")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000882{
Teresa Charlin52664732020-06-29 16:27:03 +0100883 using GatherDescriptor = armnn::GatherDescriptor;
884 class GatherLayerVerifier : public LayerVerifierBaseWithDescriptor<GatherDescriptor>
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000885 {
886 public:
887 GatherLayerVerifier(const std::string& layerName,
888 const std::vector<armnn::TensorInfo>& inputInfos,
Teresa Charlin52664732020-06-29 16:27:03 +0100889 const std::vector<armnn::TensorInfo>& outputInfos,
890 const GatherDescriptor& descriptor)
891 : LayerVerifierBaseWithDescriptor<GatherDescriptor>(layerName, inputInfos, outputInfos, descriptor) {}
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000892
Finn Williamsb454c5c2021-02-09 15:56:23 +0000893 void ExecuteStrategy(const armnn::IConnectableLayer* layer,
894 const armnn::BaseDescriptor& descriptor,
895 const std::vector<armnn::ConstTensor>& constants,
896 const char* name,
897 const armnn::LayerBindingId id = 0) override
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000898 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000899 armnn::IgnoreUnused(constants, id);
900 switch (layer->GetType())
901 {
902 case armnn::LayerType::Input: break;
903 case armnn::LayerType::Output: break;
904 case armnn::LayerType::Constant: break;
905 default:
906 {
907 VerifyNameAndConnections(layer, name);
908 const GatherDescriptor& layerDescriptor = static_cast<const GatherDescriptor&>(descriptor);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100909 CHECK(layerDescriptor.m_Axis == m_Descriptor.m_Axis);
Finn Williamsb454c5c2021-02-09 15:56:23 +0000910 }
911 }
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000912 }
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000913 };
914
915 const std::string layerName("gather");
Derek Lambertif90c56d2020-01-10 17:14:08 +0000916 armnn::TensorInfo paramsInfo({ 8 }, armnn::DataType::QAsymmU8);
917 armnn::TensorInfo outputInfo({ 3 }, armnn::DataType::QAsymmU8);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000918 const armnn::TensorInfo indicesInfo({ 3 }, armnn::DataType::Signed32);
Teresa Charlin52664732020-06-29 16:27:03 +0100919 GatherDescriptor descriptor;
920 descriptor.m_Axis = 1;
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000921
922 paramsInfo.SetQuantizationScale(1.0f);
923 paramsInfo.SetQuantizationOffset(0);
924 outputInfo.SetQuantizationScale(1.0f);
925 outputInfo.SetQuantizationOffset(0);
926
927 const std::vector<int32_t>& indicesData = {7, 6, 5};
928
929 armnn::INetworkPtr network = armnn::INetwork::Create();
930 armnn::IConnectableLayer *const inputLayer = network->AddInputLayer(0);
931 armnn::IConnectableLayer *const constantLayer =
932 network->AddConstantLayer(armnn::ConstTensor(indicesInfo, indicesData));
Teresa Charlin52664732020-06-29 16:27:03 +0100933 armnn::IConnectableLayer *const gatherLayer = network->AddGatherLayer(descriptor, layerName.c_str());
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000934 armnn::IConnectableLayer *const outputLayer = network->AddOutputLayer(0);
935
936 inputLayer->GetOutputSlot(0).Connect(gatherLayer->GetInputSlot(0));
937 constantLayer->GetOutputSlot(0).Connect(gatherLayer->GetInputSlot(1));
938 gatherLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
939
940 inputLayer->GetOutputSlot(0).SetTensorInfo(paramsInfo);
941 constantLayer->GetOutputSlot(0).SetTensorInfo(indicesInfo);
942 gatherLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
943
944 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100945 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000946
Teresa Charlin52664732020-06-29 16:27:03 +0100947 GatherLayerVerifier verifier(layerName, {paramsInfo, indicesInfo}, {outputInfo}, descriptor);
Finn Williamsb454c5c2021-02-09 15:56:23 +0000948 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000949}
950
Aron Virginas-Tar6d2e6592019-10-22 11:44:47 +0100951
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100952// NOTE: Until the deprecated AddGreaterLayer disappears this test checks that calling
953// AddGreaterLayer places a ComparisonLayer into the serialized format and that
954// when this deserialises we have a ComparisonLayer
Sadik Armagan1625efc2021-06-10 18:24:34 +0100955TEST_CASE("SerializeGreaterDeprecated")
Aron Virginas-Tar781ced92019-10-03 11:15:39 +0100956{
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100957 const std::string layerName("greater");
958
959 const armnn::TensorShape shape{2, 1, 2, 4};
960
961 const armnn::TensorInfo inputInfo = armnn::TensorInfo(shape, armnn::DataType::Float32);
962 const armnn::TensorInfo outputInfo = armnn::TensorInfo(shape, armnn::DataType::Boolean);
963
964 armnn::INetworkPtr network = armnn::INetwork::Create();
965 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
966 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
967 ARMNN_NO_DEPRECATE_WARN_BEGIN
968 armnn::IConnectableLayer* const equalLayer = network->AddGreaterLayer(layerName.c_str());
969 ARMNN_NO_DEPRECATE_WARN_END
970 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
971
972 inputLayer0->GetOutputSlot(0).Connect(equalLayer->GetInputSlot(0));
973 inputLayer1->GetOutputSlot(0).Connect(equalLayer->GetInputSlot(1));
974 equalLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
975
976 inputLayer0->GetOutputSlot(0).SetTensorInfo(inputInfo);
977 inputLayer1->GetOutputSlot(0).SetTensorInfo(inputInfo);
978 equalLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
979
980 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100981 CHECK(deserializedNetwork);
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100982
Finn Williamsb454c5c2021-02-09 15:56:23 +0000983 LayerVerifierBase verifier(layerName, { inputInfo, inputInfo }, { outputInfo });
984 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100985}
986
Aron Virginas-Tar6d2e6592019-10-22 11:44:47 +0100987
Sadik Armagan1625efc2021-06-10 18:24:34 +0100988TEST_CASE("SerializeInstanceNormalization")
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100989{
Aron Virginas-Tar781ced92019-10-03 11:15:39 +0100990 const std::string layerName("instanceNormalization");
991 const armnn::TensorInfo info({ 1, 2, 1, 5 }, armnn::DataType::Float32);
992
993 armnn::InstanceNormalizationDescriptor descriptor;
994 descriptor.m_Gamma = 1.1f;
995 descriptor.m_Beta = 0.1f;
996 descriptor.m_Eps = 0.0001f;
997 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
998
999 armnn::INetworkPtr network = armnn::INetwork::Create();
1000 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1001 armnn::IConnectableLayer* const instanceNormLayer =
1002 network->AddInstanceNormalizationLayer(descriptor, layerName.c_str());
1003 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1004
1005 inputLayer->GetOutputSlot(0).Connect(instanceNormLayer->GetInputSlot(0));
1006 instanceNormLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1007
1008 inputLayer->GetOutputSlot(0).SetTensorInfo(info);
1009 instanceNormLayer->GetOutputSlot(0).SetTensorInfo(info);
1010
1011 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001012 CHECK(deserializedNetwork);
Aron Virginas-Tar781ced92019-10-03 11:15:39 +01001013
Finn Williamsb454c5c2021-02-09 15:56:23 +00001014 LayerVerifierBaseWithDescriptor<armnn::InstanceNormalizationDescriptor> verifier(
1015 layerName, {info}, {info}, descriptor);
1016 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tar781ced92019-10-03 11:15:39 +01001017}
1018
Sadik Armagan1625efc2021-06-10 18:24:34 +01001019TEST_CASE("SerializeL2Normalization")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001020{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001021 const std::string l2NormLayerName("l2Normalization");
1022 const armnn::TensorInfo info({1, 2, 1, 5}, armnn::DataType::Float32);
1023
1024 armnn::L2NormalizationDescriptor desc;
1025 desc.m_DataLayout = armnn::DataLayout::NCHW;
Ferran Balaguer0dcffec2019-06-18 16:25:06 +01001026 desc.m_Eps = 0.0001f;
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001027
1028 armnn::INetworkPtr network = armnn::INetwork::Create();
1029 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
1030 armnn::IConnectableLayer* const l2NormLayer = network->AddL2NormalizationLayer(desc, l2NormLayerName.c_str());
1031 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1032
1033 inputLayer0->GetOutputSlot(0).Connect(l2NormLayer->GetInputSlot(0));
1034 l2NormLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1035
1036 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
1037 l2NormLayer->GetOutputSlot(0).SetTensorInfo(info);
1038
1039 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001040 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001041
Finn Williamsb454c5c2021-02-09 15:56:23 +00001042 LayerVerifierBaseWithDescriptor<armnn::L2NormalizationDescriptor> verifier(
1043 l2NormLayerName, {info}, {info}, desc);
1044 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001045}
1046
Sadik Armagan1625efc2021-06-10 18:24:34 +01001047TEST_CASE("EnsureL2NormalizationBackwardCompatibility")
Ferran Balaguer0dcffec2019-06-18 16:25:06 +01001048{
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001049 // The hex data below is a flat buffer containing a simple network with one input
Ferran Balaguer0dcffec2019-06-18 16:25:06 +01001050 // a L2Normalization layer and an output layer with dimensions as per the tensor infos below.
1051 //
1052 // This test verifies that we can still read back these old style
1053 // models without the normalization epsilon value.
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001054 const std::vector<uint8_t> l2NormalizationModel =
Ferran Balaguer0dcffec2019-06-18 16:25:06 +01001055 {
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001056 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x0A, 0x00,
1057 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
1058 0x3C, 0x01, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
1059 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xE8, 0xFE, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x0B,
1060 0x04, 0x00, 0x00, 0x00, 0xD6, 0xFE, 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x08, 0x00,
1061 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x9E, 0xFF, 0xFF, 0xFF, 0x02, 0x00, 0x00, 0x00,
1062 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00,
1063 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1064 0x4C, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
1065 0x00, 0x20, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00,
1066 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
1067 0x0E, 0x00, 0x18, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x14, 0x00, 0x0E, 0x00, 0x00, 0x00,
1068 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x20, 0x00,
1069 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x6C, 0x32, 0x4E, 0x6F, 0x72, 0x6D, 0x61, 0x6C, 0x69, 0x7A, 0x61, 0x74,
1070 0x69, 0x6F, 0x6E, 0x00, 0x01, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00,
1071 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
1072 0x52, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00,
1073 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
1074 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1075 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x07, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09,
1076 0x04, 0x00, 0x00, 0x00, 0xF6, 0xFF, 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0A, 0x00,
1077 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x00, 0x00,
1078 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00,
1079 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1080 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0A, 0x00, 0x00, 0x00,
1081 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x08, 0x00,
1082 0x07, 0x00, 0x0C, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
1083 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
1084 0x05, 0x00, 0x00, 0x00, 0x00
1085 };
1086
1087 armnn::INetworkPtr deserializedNetwork =
1088 DeserializeNetwork(std::string(l2NormalizationModel.begin(), l2NormalizationModel.end()));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001089 CHECK(deserializedNetwork);
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001090
Ferran Balaguer0dcffec2019-06-18 16:25:06 +01001091 const std::string layerName("l2Normalization");
1092 const armnn::TensorInfo inputInfo = armnn::TensorInfo({1, 2, 1, 5}, armnn::DataType::Float32);
1093
1094 armnn::L2NormalizationDescriptor desc;
1095 desc.m_DataLayout = armnn::DataLayout::NCHW;
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001096 // Since this variable does not exist in the l2NormalizationModel dump, the default value will be loaded
Ferran Balaguer0dcffec2019-06-18 16:25:06 +01001097 desc.m_Eps = 1e-12f;
1098
Finn Williamsb454c5c2021-02-09 15:56:23 +00001099 LayerVerifierBaseWithDescriptor<armnn::L2NormalizationDescriptor> verifier(
1100 layerName, {inputInfo}, {inputInfo}, desc);
1101 deserializedNetwork->ExecuteStrategy(verifier);
Ferran Balaguer0dcffec2019-06-18 16:25:06 +01001102}
1103
Sadik Armagan1625efc2021-06-10 18:24:34 +01001104TEST_CASE("SerializeLogicalBinary")
James Conroyaba90cd2020-11-06 16:28:18 +00001105{
James Conroyaba90cd2020-11-06 16:28:18 +00001106 const std::string layerName("logicalBinaryAnd");
1107
1108 const armnn::TensorShape shape{2, 1, 2, 2};
1109
1110 const armnn::TensorInfo inputInfo = armnn::TensorInfo(shape, armnn::DataType::Boolean);
1111 const armnn::TensorInfo outputInfo = armnn::TensorInfo(shape, armnn::DataType::Boolean);
1112
1113 armnn::LogicalBinaryDescriptor descriptor(armnn::LogicalBinaryOperation::LogicalAnd);
1114
1115 armnn::INetworkPtr network = armnn::INetwork::Create();
1116 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
1117 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
1118 armnn::IConnectableLayer* const logicalBinaryLayer = network->AddLogicalBinaryLayer(descriptor, layerName.c_str());
1119 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1120
1121 inputLayer0->GetOutputSlot(0).Connect(logicalBinaryLayer->GetInputSlot(0));
1122 inputLayer1->GetOutputSlot(0).Connect(logicalBinaryLayer->GetInputSlot(1));
1123 logicalBinaryLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1124
1125 inputLayer0->GetOutputSlot(0).SetTensorInfo(inputInfo);
1126 inputLayer1->GetOutputSlot(0).SetTensorInfo(inputInfo);
1127 logicalBinaryLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1128
1129 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001130 CHECK(deserializedNetwork);
James Conroyaba90cd2020-11-06 16:28:18 +00001131
Finn Williamsb454c5c2021-02-09 15:56:23 +00001132 LayerVerifierBaseWithDescriptor<armnn::LogicalBinaryDescriptor> verifier(
1133 layerName, { inputInfo, inputInfo }, { outputInfo }, descriptor);
1134 deserializedNetwork->ExecuteStrategy(verifier);
James Conroyaba90cd2020-11-06 16:28:18 +00001135}
1136
Sadik Armagan1625efc2021-06-10 18:24:34 +01001137TEST_CASE("SerializeLogSoftmax")
Sadik Armagan26257852019-10-14 13:00:47 +01001138{
Sadik Armagan26257852019-10-14 13:00:47 +01001139 const std::string layerName("log_softmax");
1140 const armnn::TensorInfo info({1, 10}, armnn::DataType::Float32);
1141
1142 armnn::LogSoftmaxDescriptor descriptor;
1143 descriptor.m_Beta = 1.0f;
1144 descriptor.m_Axis = -1;
1145
1146 armnn::INetworkPtr network = armnn::INetwork::Create();
1147 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1148 armnn::IConnectableLayer* const logSoftmaxLayer = network->AddLogSoftmaxLayer(descriptor, layerName.c_str());
1149 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1150
1151 inputLayer->GetOutputSlot(0).Connect(logSoftmaxLayer->GetInputSlot(0));
1152 logSoftmaxLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1153
1154 inputLayer->GetOutputSlot(0).SetTensorInfo(info);
1155 logSoftmaxLayer->GetOutputSlot(0).SetTensorInfo(info);
1156
1157 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001158 CHECK(deserializedNetwork);
Sadik Armagan26257852019-10-14 13:00:47 +01001159
Finn Williamsb454c5c2021-02-09 15:56:23 +00001160 LayerVerifierBaseWithDescriptor<armnn::LogSoftmaxDescriptor> verifier(layerName, {info}, {info}, descriptor);
1161 deserializedNetwork->ExecuteStrategy(verifier);
Sadik Armagan26257852019-10-14 13:00:47 +01001162}
1163
Sadik Armagan1625efc2021-06-10 18:24:34 +01001164TEST_CASE("SerializeMaximum")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001165{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001166 const std::string layerName("maximum");
1167 const armnn::TensorInfo info({ 1, 2, 2, 3 }, armnn::DataType::Float32);
1168
1169 armnn::INetworkPtr network = armnn::INetwork::Create();
1170 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
1171 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
1172 armnn::IConnectableLayer* const maximumLayer = network->AddMaximumLayer(layerName.c_str());
1173 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1174
1175 inputLayer0->GetOutputSlot(0).Connect(maximumLayer->GetInputSlot(0));
1176 inputLayer1->GetOutputSlot(0).Connect(maximumLayer->GetInputSlot(1));
1177 maximumLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1178
1179 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
1180 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
1181 maximumLayer->GetOutputSlot(0).SetTensorInfo(info);
1182
1183 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001184 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001185
Finn Williamsb454c5c2021-02-09 15:56:23 +00001186 LayerVerifierBase verifier(layerName, {info, info}, {info});
1187 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001188}
1189
Sadik Armagan1625efc2021-06-10 18:24:34 +01001190TEST_CASE("SerializeMean")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001191{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001192 const std::string layerName("mean");
1193 const armnn::TensorInfo inputInfo({1, 1, 3, 2}, armnn::DataType::Float32);
1194 const armnn::TensorInfo outputInfo({1, 1, 1, 2}, armnn::DataType::Float32);
1195
1196 armnn::MeanDescriptor descriptor;
1197 descriptor.m_Axis = { 2 };
1198 descriptor.m_KeepDims = true;
1199
1200 armnn::INetworkPtr network = armnn::INetwork::Create();
1201 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1202 armnn::IConnectableLayer* const meanLayer = network->AddMeanLayer(descriptor, layerName.c_str());
1203 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1204
1205 inputLayer->GetOutputSlot(0).Connect(meanLayer->GetInputSlot(0));
1206 meanLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1207
1208 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
1209 meanLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1210
1211 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001212 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001213
Finn Williamsb454c5c2021-02-09 15:56:23 +00001214 LayerVerifierBaseWithDescriptor<armnn::MeanDescriptor> verifier(layerName, {inputInfo}, {outputInfo}, descriptor);
1215 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001216}
1217
Sadik Armagan1625efc2021-06-10 18:24:34 +01001218TEST_CASE("SerializeMerge")
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +01001219{
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +01001220 const std::string layerName("merge");
1221 const armnn::TensorInfo info({ 1, 2, 2, 3 }, armnn::DataType::Float32);
1222
1223 armnn::INetworkPtr network = armnn::INetwork::Create();
1224 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
1225 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
1226 armnn::IConnectableLayer* const mergeLayer = network->AddMergeLayer(layerName.c_str());
1227 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1228
1229 inputLayer0->GetOutputSlot(0).Connect(mergeLayer->GetInputSlot(0));
1230 inputLayer1->GetOutputSlot(0).Connect(mergeLayer->GetInputSlot(1));
1231 mergeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1232
1233 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
1234 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
1235 mergeLayer->GetOutputSlot(0).SetTensorInfo(info);
1236
1237 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001238 CHECK(deserializedNetwork);
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +01001239
Finn Williamsb454c5c2021-02-09 15:56:23 +00001240 LayerVerifierBase verifier(layerName, {info, info}, {info});
1241 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +01001242}
1243
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01001244class MergerLayerVerifier : public LayerVerifierBaseWithDescriptor<armnn::OriginsDescriptor>
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001245{
Jim Flynn5fa83932019-05-09 15:35:43 +01001246public:
1247 MergerLayerVerifier(const std::string& layerName,
1248 const std::vector<armnn::TensorInfo>& inputInfos,
1249 const std::vector<armnn::TensorInfo>& outputInfos,
1250 const armnn::OriginsDescriptor& descriptor)
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01001251 : LayerVerifierBaseWithDescriptor<armnn::OriginsDescriptor>(layerName, inputInfos, outputInfos, descriptor) {}
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001252
Finn Williamsb454c5c2021-02-09 15:56:23 +00001253 void ExecuteStrategy(const armnn::IConnectableLayer* layer,
1254 const armnn::BaseDescriptor& descriptor,
1255 const std::vector<armnn::ConstTensor>& constants,
1256 const char* name,
1257 const armnn::LayerBindingId id = 0) override
Jim Flynn5fa83932019-05-09 15:35:43 +01001258 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001259 armnn::IgnoreUnused(descriptor, constants, id);
1260 switch (layer->GetType())
1261 {
1262 case armnn::LayerType::Input: break;
1263 case armnn::LayerType::Output: break;
1264 case armnn::LayerType::Merge:
1265 {
1266 throw armnn::Exception("MergerLayer should have translated to ConcatLayer");
1267 break;
1268 }
1269 case armnn::LayerType::Concat:
1270 {
1271 VerifyNameAndConnections(layer, name);
1272 const armnn::MergerDescriptor& layerDescriptor =
1273 static_cast<const armnn::MergerDescriptor&>(descriptor);
1274 VerifyDescriptor(layerDescriptor);
1275 break;
1276 }
1277 default:
1278 {
1279 throw armnn::Exception("Unexpected layer type in Merge test model");
1280 }
1281 }
Jim Flynn5fa83932019-05-09 15:35:43 +01001282 }
Jim Flynn5fa83932019-05-09 15:35:43 +01001283};
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001284
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01001285// NOTE: Until the deprecated AddMergerLayer disappears this test checks that calling
Jim Flynne242f2d2019-05-22 14:24:13 +01001286// AddMergerLayer places a ConcatLayer into the serialized format and that
1287// when this deserialises we have a ConcatLayer
Sadik Armagan1625efc2021-06-10 18:24:34 +01001288TEST_CASE("SerializeMerger")
Jim Flynn5fa83932019-05-09 15:35:43 +01001289{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001290 const std::string layerName("merger");
1291 const armnn::TensorInfo inputInfo = armnn::TensorInfo({2, 3, 2, 2}, armnn::DataType::Float32);
1292 const armnn::TensorInfo outputInfo = armnn::TensorInfo({4, 3, 2, 2}, armnn::DataType::Float32);
1293
1294 const std::vector<armnn::TensorShape> shapes({inputInfo.GetShape(), inputInfo.GetShape()});
1295
1296 armnn::OriginsDescriptor descriptor =
Jim Flynn825af452019-05-20 12:49:28 +01001297 armnn::CreateDescriptorForConcatenation(shapes.begin(), shapes.end(), 0);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001298
1299 armnn::INetworkPtr network = armnn::INetwork::Create();
1300 armnn::IConnectableLayer* const inputLayerOne = network->AddInputLayer(0);
1301 armnn::IConnectableLayer* const inputLayerTwo = network->AddInputLayer(1);
Jim Flynn906f9462019-05-10 13:55:21 +01001302 ARMNN_NO_DEPRECATE_WARN_BEGIN
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001303 armnn::IConnectableLayer* const mergerLayer = network->AddMergerLayer(descriptor, layerName.c_str());
Jim Flynn906f9462019-05-10 13:55:21 +01001304 ARMNN_NO_DEPRECATE_WARN_END
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001305 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1306
1307 inputLayerOne->GetOutputSlot(0).Connect(mergerLayer->GetInputSlot(0));
1308 inputLayerTwo->GetOutputSlot(0).Connect(mergerLayer->GetInputSlot(1));
1309 mergerLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1310
1311 inputLayerOne->GetOutputSlot(0).SetTensorInfo(inputInfo);
1312 inputLayerTwo->GetOutputSlot(0).SetTensorInfo(inputInfo);
1313 mergerLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1314
Jim Flynn5fa83932019-05-09 15:35:43 +01001315 std::string mergerLayerNetwork = SerializeNetwork(*network);
1316 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(mergerLayerNetwork);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001317 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001318
1319 MergerLayerVerifier verifier(layerName, {inputInfo, inputInfo}, {outputInfo}, descriptor);
Finn Williamsb454c5c2021-02-09 15:56:23 +00001320 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001321}
1322
Sadik Armagan1625efc2021-06-10 18:24:34 +01001323TEST_CASE("EnsureMergerLayerBackwardCompatibility")
Jim Flynn5fa83932019-05-09 15:35:43 +01001324{
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001325 // The hex data below is a flat buffer containing a simple network with two inputs
Jim Flynne242f2d2019-05-22 14:24:13 +01001326 // a merger layer (now deprecated) and an output layer with dimensions as per the tensor infos below.
1327 //
1328 // This test verifies that we can still read back these old style
Jim Flynn5fa83932019-05-09 15:35:43 +01001329 // models replacing the MergerLayers with ConcatLayers with the same parameters.
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001330 const std::vector<uint8_t> mergerModel =
Jim Flynn5fa83932019-05-09 15:35:43 +01001331 {
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001332 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x0A, 0x00,
1333 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
1334 0x38, 0x02, 0x00, 0x00, 0x8C, 0x01, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x02, 0x00,
1335 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
1336 0xF4, 0xFD, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x0B, 0x04, 0x00, 0x00, 0x00, 0x92, 0xFE, 0xFF, 0xFF, 0x04, 0x00,
1337 0x00, 0x00, 0x9A, 0xFE, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x7E, 0xFE, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00,
1338 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00,
1339 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1340 0xF8, 0xFE, 0xFF, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0xFE, 0xFF, 0xFF, 0x00, 0x00,
1341 0x00, 0x1F, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00,
1342 0x68, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00,
1343 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
1344 0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x22, 0xFF, 0xFF, 0xFF, 0x04, 0x00,
1345 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1346 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
1347 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFF, 0xFF, 0xFF,
1348 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x1C, 0x00,
1349 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x6D, 0x65, 0x72, 0x67, 0x65, 0x72, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
1350 0x5C, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x34, 0xFF,
1351 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x92, 0xFE, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00,
1352 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00,
1353 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00,
1354 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00,
1355 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0E, 0x00,
1356 0x07, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00,
1357 0x06, 0x00, 0x08, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0E, 0x00,
1358 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
1359 0x0E, 0x00, 0x18, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x14, 0x00, 0x0E, 0x00, 0x00, 0x00,
1360 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00,
1361 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
1362 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00,
1363 0x00, 0x00, 0x66, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1364 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00,
1365 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x07, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09,
1366 0x04, 0x00, 0x00, 0x00, 0xF6, 0xFF, 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0A, 0x00,
1367 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x00, 0x00,
1368 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00,
1369 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1370 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0A, 0x00, 0x00, 0x00,
1371 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x08, 0x00,
1372 0x07, 0x00, 0x0C, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
1373 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
1374 0x02, 0x00, 0x00, 0x00
1375 };
1376
1377 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(std::string(mergerModel.begin(), mergerModel.end()));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001378 CHECK(deserializedNetwork);
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001379
1380 const armnn::TensorInfo inputInfo = armnn::TensorInfo({ 2, 3, 2, 2 }, armnn::DataType::Float32);
1381 const armnn::TensorInfo outputInfo = armnn::TensorInfo({ 4, 3, 2, 2 }, armnn::DataType::Float32);
Jim Flynn5fa83932019-05-09 15:35:43 +01001382
1383 const std::vector<armnn::TensorShape> shapes({inputInfo.GetShape(), inputInfo.GetShape()});
1384
1385 armnn::OriginsDescriptor descriptor =
Jim Flynn825af452019-05-20 12:49:28 +01001386 armnn::CreateDescriptorForConcatenation(shapes.begin(), shapes.end(), 0);
Jim Flynn5fa83932019-05-09 15:35:43 +01001387
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001388 MergerLayerVerifier verifier("merger", { inputInfo, inputInfo }, { outputInfo }, descriptor);
Finn Williamsb454c5c2021-02-09 15:56:23 +00001389 deserializedNetwork->ExecuteStrategy(verifier);
Jim Flynn5fa83932019-05-09 15:35:43 +01001390}
1391
Sadik Armagan1625efc2021-06-10 18:24:34 +01001392TEST_CASE("SerializeConcat")
Jim Flynne242f2d2019-05-22 14:24:13 +01001393{
1394 const std::string layerName("concat");
1395 const armnn::TensorInfo inputInfo = armnn::TensorInfo({2, 3, 2, 2}, armnn::DataType::Float32);
1396 const armnn::TensorInfo outputInfo = armnn::TensorInfo({4, 3, 2, 2}, armnn::DataType::Float32);
1397
1398 const std::vector<armnn::TensorShape> shapes({inputInfo.GetShape(), inputInfo.GetShape()});
1399
1400 armnn::OriginsDescriptor descriptor =
1401 armnn::CreateDescriptorForConcatenation(shapes.begin(), shapes.end(), 0);
1402
1403 armnn::INetworkPtr network = armnn::INetwork::Create();
1404 armnn::IConnectableLayer* const inputLayerOne = network->AddInputLayer(0);
1405 armnn::IConnectableLayer* const inputLayerTwo = network->AddInputLayer(1);
1406 armnn::IConnectableLayer* const concatLayer = network->AddConcatLayer(descriptor, layerName.c_str());
1407 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1408
1409 inputLayerOne->GetOutputSlot(0).Connect(concatLayer->GetInputSlot(0));
1410 inputLayerTwo->GetOutputSlot(0).Connect(concatLayer->GetInputSlot(1));
1411 concatLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1412
1413 inputLayerOne->GetOutputSlot(0).SetTensorInfo(inputInfo);
1414 inputLayerTwo->GetOutputSlot(0).SetTensorInfo(inputInfo);
1415 concatLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1416
1417 std::string concatLayerNetwork = SerializeNetwork(*network);
1418 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(concatLayerNetwork);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001419 CHECK(deserializedNetwork);
Jim Flynne242f2d2019-05-22 14:24:13 +01001420
1421 // NOTE: using the MergerLayerVerifier to ensure that it is a concat layer and not a
1422 // merger layer that gets placed into the graph.
1423 MergerLayerVerifier verifier(layerName, {inputInfo, inputInfo}, {outputInfo}, descriptor);
Finn Williamsb454c5c2021-02-09 15:56:23 +00001424 deserializedNetwork->ExecuteStrategy(verifier);
Jim Flynne242f2d2019-05-22 14:24:13 +01001425}
1426
Sadik Armagan1625efc2021-06-10 18:24:34 +01001427TEST_CASE("SerializeMinimum")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001428{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001429 const std::string layerName("minimum");
1430 const armnn::TensorInfo info({ 1, 2, 2, 3 }, armnn::DataType::Float32);
1431
1432 armnn::INetworkPtr network = armnn::INetwork::Create();
1433 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
1434 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
1435 armnn::IConnectableLayer* const minimumLayer = network->AddMinimumLayer(layerName.c_str());
1436 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1437
1438 inputLayer0->GetOutputSlot(0).Connect(minimumLayer->GetInputSlot(0));
1439 inputLayer1->GetOutputSlot(0).Connect(minimumLayer->GetInputSlot(1));
1440 minimumLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1441
1442 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
1443 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
1444 minimumLayer->GetOutputSlot(0).SetTensorInfo(info);
1445
1446 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001447 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001448
Finn Williamsb454c5c2021-02-09 15:56:23 +00001449 LayerVerifierBase verifier(layerName, {info, info}, {info});
1450 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001451}
1452
Sadik Armagan1625efc2021-06-10 18:24:34 +01001453TEST_CASE("SerializeMultiplication")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001454{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001455 const std::string layerName("multiplication");
1456 const armnn::TensorInfo info({ 1, 5, 2, 3 }, armnn::DataType::Float32);
1457
1458 armnn::INetworkPtr network = armnn::INetwork::Create();
1459 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
1460 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
1461 armnn::IConnectableLayer* const multiplicationLayer = network->AddMultiplicationLayer(layerName.c_str());
1462 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1463
1464 inputLayer0->GetOutputSlot(0).Connect(multiplicationLayer->GetInputSlot(0));
1465 inputLayer1->GetOutputSlot(0).Connect(multiplicationLayer->GetInputSlot(1));
1466 multiplicationLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1467
1468 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
1469 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
1470 multiplicationLayer->GetOutputSlot(0).SetTensorInfo(info);
1471
1472 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001473 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001474
Finn Williamsb454c5c2021-02-09 15:56:23 +00001475 LayerVerifierBase verifier(layerName, {info, info}, {info});
1476 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001477}
1478
Sadik Armagan1625efc2021-06-10 18:24:34 +01001479TEST_CASE("SerializePrelu")
Ellen Norris-Thompson51982472019-06-19 11:46:21 +01001480{
Ellen Norris-Thompson51982472019-06-19 11:46:21 +01001481 const std::string layerName("prelu");
1482
1483 armnn::TensorInfo inputTensorInfo ({ 4, 1, 2 }, armnn::DataType::Float32);
1484 armnn::TensorInfo alphaTensorInfo ({ 5, 4, 3, 1 }, armnn::DataType::Float32);
1485 armnn::TensorInfo outputTensorInfo({ 5, 4, 3, 2 }, armnn::DataType::Float32);
1486
1487 armnn::INetworkPtr network = armnn::INetwork::Create();
1488 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1489 armnn::IConnectableLayer* const alphaLayer = network->AddInputLayer(1);
1490 armnn::IConnectableLayer* const preluLayer = network->AddPreluLayer(layerName.c_str());
1491 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1492
1493 inputLayer->GetOutputSlot(0).Connect(preluLayer->GetInputSlot(0));
1494 alphaLayer->GetOutputSlot(0).Connect(preluLayer->GetInputSlot(1));
1495 preluLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1496
1497 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
1498 alphaLayer->GetOutputSlot(0).SetTensorInfo(alphaTensorInfo);
1499 preluLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
1500
1501 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001502 CHECK(deserializedNetwork);
Ellen Norris-Thompson51982472019-06-19 11:46:21 +01001503
Finn Williamsb454c5c2021-02-09 15:56:23 +00001504 LayerVerifierBase verifier(layerName, {inputTensorInfo, alphaTensorInfo}, {outputTensorInfo});
1505 deserializedNetwork->ExecuteStrategy(verifier);
Ellen Norris-Thompson51982472019-06-19 11:46:21 +01001506}
1507
Sadik Armagan1625efc2021-06-10 18:24:34 +01001508TEST_CASE("SerializeNormalization")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001509{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001510 const std::string layerName("normalization");
1511 const armnn::TensorInfo info({2, 1, 2, 2}, armnn::DataType::Float32);
1512
1513 armnn::NormalizationDescriptor desc;
1514 desc.m_DataLayout = armnn::DataLayout::NCHW;
1515 desc.m_NormSize = 3;
1516 desc.m_Alpha = 1;
1517 desc.m_Beta = 1;
1518 desc.m_K = 1;
1519
1520 armnn::INetworkPtr network = armnn::INetwork::Create();
1521 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1522 armnn::IConnectableLayer* const normalizationLayer = network->AddNormalizationLayer(desc, layerName.c_str());
1523 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1524
1525 inputLayer->GetOutputSlot(0).Connect(normalizationLayer->GetInputSlot(0));
1526 normalizationLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1527
1528 inputLayer->GetOutputSlot(0).SetTensorInfo(info);
1529 normalizationLayer->GetOutputSlot(0).SetTensorInfo(info);
1530
1531 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001532 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001533
Finn Williamsb454c5c2021-02-09 15:56:23 +00001534 LayerVerifierBaseWithDescriptor<armnn::NormalizationDescriptor> verifier(layerName, {info}, {info}, desc);
1535 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001536}
1537
Sadik Armagan1625efc2021-06-10 18:24:34 +01001538TEST_CASE("SerializePad")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001539{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001540 const std::string layerName("pad");
1541 const armnn::TensorInfo inputTensorInfo = armnn::TensorInfo({1, 2, 3, 4}, armnn::DataType::Float32);
1542 const armnn::TensorInfo outputTensorInfo = armnn::TensorInfo({1, 3, 5, 7}, armnn::DataType::Float32);
1543
1544 armnn::PadDescriptor desc({{0, 0}, {1, 0}, {1, 1}, {1, 2}});
1545
1546 armnn::INetworkPtr network = armnn::INetwork::Create();
1547 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1548 armnn::IConnectableLayer* const padLayer = network->AddPadLayer(desc, layerName.c_str());
1549 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1550
1551 inputLayer->GetOutputSlot(0).Connect(padLayer->GetInputSlot(0));
1552 padLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1553
1554 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
1555 padLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
1556
1557 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001558 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001559
Finn Williamsb454c5c2021-02-09 15:56:23 +00001560 LayerVerifierBaseWithDescriptor<armnn::PadDescriptor> verifier(layerName,
1561 {inputTensorInfo},
1562 {outputTensorInfo},
1563 desc);
1564 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001565}
1566
Sadik Armagan1625efc2021-06-10 18:24:34 +01001567TEST_CASE("EnsurePadBackwardCompatibility")
Jim Flynn965c7c62019-06-24 14:32:41 +01001568{
1569 // The PadDescriptor is being extended with a float PadValue (so a value other than 0
1570 // can be used to pad the tensor.
1571 //
1572 // This test contains a binary representation of a simple input->pad->output network
1573 // prior to this change to test that the descriptor has been updated in a backward
1574 // compatible way with respect to Deserialization of older binary dumps
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001575 const std::vector<uint8_t> padModel =
Jim Flynn965c7c62019-06-24 14:32:41 +01001576 {
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001577 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x0A, 0x00,
1578 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
1579 0x54, 0x01, 0x00, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
1580 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xD0, 0xFE, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x0B,
1581 0x04, 0x00, 0x00, 0x00, 0x96, 0xFF, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x9E, 0xFF, 0xFF, 0xFF, 0x04, 0x00,
1582 0x00, 0x00, 0x72, 0xFF, 0xFF, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
1583 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
1584 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00,
1585 0x00, 0x00, 0x00, 0x00, 0x24, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x16, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00,
1586 0x0E, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00,
1587 0x00, 0x00, 0x06, 0x00, 0x08, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00,
1588 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1589 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
1590 0x0E, 0x00, 0x18, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x14, 0x00, 0x0E, 0x00, 0x00, 0x00,
1591 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00,
1592 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x70, 0x61, 0x64, 0x00, 0x01, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00,
1593 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00,
1594 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x52, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00,
1595 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00,
1596 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00,
1597 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x07, 0x00, 0x08, 0x00, 0x08, 0x00,
1598 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xF6, 0xFF, 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x00,
1599 0x00, 0x00, 0x06, 0x00, 0x0A, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00,
1600 0x0E, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x0E, 0x00, 0x00, 0x00,
1601 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
1602 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00,
1603 0x08, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
1604 0x0A, 0x00, 0x10, 0x00, 0x08, 0x00, 0x07, 0x00, 0x0C, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
1605 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00,
1606 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00
1607 };
1608
1609 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(std::string(padModel.begin(), padModel.end()));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001610 CHECK(deserializedNetwork);
Jim Flynn965c7c62019-06-24 14:32:41 +01001611
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001612 const armnn::TensorInfo inputInfo = armnn::TensorInfo({ 1, 2, 3, 4 }, armnn::DataType::Float32);
1613 const armnn::TensorInfo outputInfo = armnn::TensorInfo({ 1, 3, 5, 7 }, armnn::DataType::Float32);
Jim Flynn965c7c62019-06-24 14:32:41 +01001614
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001615 armnn::PadDescriptor descriptor({{ 0, 0 }, { 1, 0 }, { 1, 1 }, { 1, 2 }});
Jim Flynn965c7c62019-06-24 14:32:41 +01001616
Finn Williamsb454c5c2021-02-09 15:56:23 +00001617 LayerVerifierBaseWithDescriptor<armnn::PadDescriptor> verifier("pad", { inputInfo }, { outputInfo }, descriptor);
1618 deserializedNetwork->ExecuteStrategy(verifier);
Jim Flynn965c7c62019-06-24 14:32:41 +01001619}
1620
Sadik Armagan1625efc2021-06-10 18:24:34 +01001621TEST_CASE("SerializePermute")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001622{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001623 const std::string layerName("permute");
1624 const armnn::TensorInfo inputTensorInfo({4, 3, 2, 1}, armnn::DataType::Float32);
1625 const armnn::TensorInfo outputTensorInfo({1, 2, 3, 4}, armnn::DataType::Float32);
1626
1627 armnn::PermuteDescriptor descriptor(armnn::PermutationVector({3, 2, 1, 0}));
1628
1629 armnn::INetworkPtr network = armnn::INetwork::Create();
1630 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1631 armnn::IConnectableLayer* const permuteLayer = network->AddPermuteLayer(descriptor, layerName.c_str());
1632 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1633
1634 inputLayer->GetOutputSlot(0).Connect(permuteLayer->GetInputSlot(0));
1635 permuteLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1636
1637 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
1638 permuteLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
1639
1640 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001641 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001642
Finn Williamsb454c5c2021-02-09 15:56:23 +00001643 LayerVerifierBaseWithDescriptor<armnn::PermuteDescriptor> verifier(
1644 layerName, {inputTensorInfo}, {outputTensorInfo}, descriptor);
1645 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001646}
1647
Sadik Armagan1625efc2021-06-10 18:24:34 +01001648TEST_CASE("SerializePooling2d")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001649{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001650 const std::string layerName("pooling2d");
1651 const armnn::TensorInfo inputInfo({1, 2, 2, 1}, armnn::DataType::Float32);
1652 const armnn::TensorInfo outputInfo({1, 1, 1, 1}, armnn::DataType::Float32);
1653
1654 armnn::Pooling2dDescriptor desc;
1655 desc.m_DataLayout = armnn::DataLayout::NHWC;
1656 desc.m_PadTop = 0;
1657 desc.m_PadBottom = 0;
1658 desc.m_PadLeft = 0;
1659 desc.m_PadRight = 0;
1660 desc.m_PoolType = armnn::PoolingAlgorithm::Average;
1661 desc.m_OutputShapeRounding = armnn::OutputShapeRounding::Floor;
1662 desc.m_PaddingMethod = armnn::PaddingMethod::Exclude;
1663 desc.m_PoolHeight = 2;
1664 desc.m_PoolWidth = 2;
1665 desc.m_StrideX = 2;
1666 desc.m_StrideY = 2;
1667
1668 armnn::INetworkPtr network = armnn::INetwork::Create();
1669 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1670 armnn::IConnectableLayer* const pooling2dLayer = network->AddPooling2dLayer(desc, layerName.c_str());
1671 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1672
1673 inputLayer->GetOutputSlot(0).Connect(pooling2dLayer->GetInputSlot(0));
1674 pooling2dLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1675
1676 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
1677 pooling2dLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1678
1679 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001680 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001681
Finn Williamsb454c5c2021-02-09 15:56:23 +00001682 LayerVerifierBaseWithDescriptor<armnn::Pooling2dDescriptor> verifier(
1683 layerName, {inputInfo}, {outputInfo}, desc);
1684 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001685}
1686
Sadik Armagan1625efc2021-06-10 18:24:34 +01001687TEST_CASE("SerializeQuantize")
Derek Lamberti87acb272019-03-27 16:51:31 +00001688{
Derek Lamberti87acb272019-03-27 16:51:31 +00001689 const std::string layerName("quantize");
1690 const armnn::TensorInfo info({ 1, 2, 2, 3 }, armnn::DataType::Float32);
1691
1692 armnn::INetworkPtr network = armnn::INetwork::Create();
1693 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1694 armnn::IConnectableLayer* const quantizeLayer = network->AddQuantizeLayer(layerName.c_str());
1695 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1696
1697 inputLayer->GetOutputSlot(0).Connect(quantizeLayer->GetInputSlot(0));
1698 quantizeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1699
1700 inputLayer->GetOutputSlot(0).SetTensorInfo(info);
1701 quantizeLayer->GetOutputSlot(0).SetTensorInfo(info);
1702
1703 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001704 CHECK(deserializedNetwork);
Derek Lamberti87acb272019-03-27 16:51:31 +00001705
Finn Williamsb454c5c2021-02-09 15:56:23 +00001706 LayerVerifierBase verifier(layerName, {info}, {info});
1707 deserializedNetwork->ExecuteStrategy(verifier);
Derek Lamberti87acb272019-03-27 16:51:31 +00001708}
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01001709
Sadik Armagan1625efc2021-06-10 18:24:34 +01001710TEST_CASE("SerializeRank")
Finn Williams2605b232020-06-10 15:53:46 +01001711{
Finn Williams2605b232020-06-10 15:53:46 +01001712 const std::string layerName("rank");
1713 const armnn::TensorInfo inputInfo({1, 9}, armnn::DataType::Float32);
1714 const armnn::TensorInfo outputInfo({1}, armnn::DataType::Signed32);
1715
1716 armnn::INetworkPtr network = armnn::INetwork::Create();
1717 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1718 armnn::IConnectableLayer* const rankLayer = network->AddRankLayer(layerName.c_str());
1719 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1720
1721 inputLayer->GetOutputSlot(0).Connect(rankLayer->GetInputSlot(0));
1722 rankLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1723
1724 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
1725 rankLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1726
1727 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001728 CHECK(deserializedNetwork);
Finn Williams2605b232020-06-10 15:53:46 +01001729
Finn Williamsb454c5c2021-02-09 15:56:23 +00001730 LayerVerifierBase verifier(layerName, {inputInfo}, {outputInfo});
1731 deserializedNetwork->ExecuteStrategy(verifier);
Finn Williams2605b232020-06-10 15:53:46 +01001732}
1733
Sadik Armagan1625efc2021-06-10 18:24:34 +01001734TEST_CASE("SerializeReduceSum")
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +00001735{
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +00001736 const std::string layerName("Reduce_Sum");
1737 const armnn::TensorInfo inputInfo({1, 1, 3, 2}, armnn::DataType::Float32);
1738 const armnn::TensorInfo outputInfo({1, 1, 1, 2}, armnn::DataType::Float32);
1739
1740 armnn::ReduceDescriptor descriptor;
1741 descriptor.m_vAxis = { 2 };
1742 descriptor.m_ReduceOperation = armnn::ReduceOperation::Sum;
1743
1744 armnn::INetworkPtr network = armnn::INetwork::Create();
1745 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1746 armnn::IConnectableLayer* const reduceSumLayer = network->AddReduceLayer(descriptor, layerName.c_str());
1747 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1748
1749 inputLayer->GetOutputSlot(0).Connect(reduceSumLayer->GetInputSlot(0));
1750 reduceSumLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1751
1752 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
1753 reduceSumLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1754
1755 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001756 CHECK(deserializedNetwork);
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +00001757
Finn Williamsb454c5c2021-02-09 15:56:23 +00001758 LayerVerifierBaseWithDescriptor<armnn::ReduceDescriptor> verifier(layerName, {inputInfo}, {outputInfo}, descriptor);
1759 deserializedNetwork->ExecuteStrategy(verifier);
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +00001760}
1761
Sadik Armagan1625efc2021-06-10 18:24:34 +01001762TEST_CASE("SerializeReshape")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001763{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001764 const std::string layerName("reshape");
1765 const armnn::TensorInfo inputInfo({1, 9}, armnn::DataType::Float32);
1766 const armnn::TensorInfo outputInfo({3, 3}, armnn::DataType::Float32);
1767
1768 armnn::ReshapeDescriptor descriptor({3, 3});
1769
1770 armnn::INetworkPtr network = armnn::INetwork::Create();
1771 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1772 armnn::IConnectableLayer* const reshapeLayer = network->AddReshapeLayer(descriptor, layerName.c_str());
1773 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1774
1775 inputLayer->GetOutputSlot(0).Connect(reshapeLayer->GetInputSlot(0));
1776 reshapeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1777
1778 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
1779 reshapeLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1780
1781 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001782 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001783
Finn Williamsb454c5c2021-02-09 15:56:23 +00001784 LayerVerifierBaseWithDescriptor<armnn::ReshapeDescriptor> verifier(
1785 layerName, {inputInfo}, {outputInfo}, descriptor);
1786 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001787}
1788
Sadik Armagan1625efc2021-06-10 18:24:34 +01001789TEST_CASE("SerializeResize")
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01001790{
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01001791 const std::string layerName("resize");
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00001792 const armnn::TensorInfo inputInfo = armnn::TensorInfo({1, 3, 5, 5}, armnn::DataType::Float32);
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01001793 const armnn::TensorInfo outputInfo = armnn::TensorInfo({1, 3, 2, 4}, armnn::DataType::Float32);
1794
1795 armnn::ResizeDescriptor desc;
Aron Virginas-Tar169d2f12019-07-01 19:01:44 +01001796 desc.m_TargetWidth = 4;
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01001797 desc.m_TargetHeight = 2;
Aron Virginas-Tar169d2f12019-07-01 19:01:44 +01001798 desc.m_Method = armnn::ResizeMethod::NearestNeighbor;
David Monahan4a0c9b92020-05-30 09:48:39 +01001799 desc.m_AlignCorners = true;
1800 desc.m_HalfPixelCenters = true;
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01001801
1802 armnn::INetworkPtr network = armnn::INetwork::Create();
1803 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1804 armnn::IConnectableLayer* const resizeLayer = network->AddResizeLayer(desc, layerName.c_str());
1805 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1806
1807 inputLayer->GetOutputSlot(0).Connect(resizeLayer->GetInputSlot(0));
1808 resizeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1809
1810 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
1811 resizeLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1812
1813 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001814 CHECK(deserializedNetwork);
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01001815
Finn Williamsb454c5c2021-02-09 15:56:23 +00001816 LayerVerifierBaseWithDescriptor<armnn::ResizeDescriptor> verifier(layerName, {inputInfo}, {outputInfo}, desc);
1817 deserializedNetwork->ExecuteStrategy(verifier);
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01001818}
1819
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00001820class ResizeBilinearLayerVerifier : public LayerVerifierBaseWithDescriptor<armnn::ResizeBilinearDescriptor>
1821{
1822public:
1823 ResizeBilinearLayerVerifier(const std::string& layerName,
1824 const std::vector<armnn::TensorInfo>& inputInfos,
1825 const std::vector<armnn::TensorInfo>& outputInfos,
1826 const armnn::ResizeBilinearDescriptor& descriptor)
1827 : LayerVerifierBaseWithDescriptor<armnn::ResizeBilinearDescriptor>(
1828 layerName, inputInfos, outputInfos, descriptor) {}
1829
Finn Williamsb454c5c2021-02-09 15:56:23 +00001830 void ExecuteStrategy(const armnn::IConnectableLayer* layer,
1831 const armnn::BaseDescriptor& descriptor,
1832 const std::vector<armnn::ConstTensor>& constants,
1833 const char* name,
1834 const armnn::LayerBindingId id = 0) override
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00001835 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001836 armnn::IgnoreUnused(descriptor, constants, id);
1837 switch (layer->GetType())
1838 {
1839 case armnn::LayerType::Input: break;
1840 case armnn::LayerType::Output: break;
1841 case armnn::LayerType::Resize:
1842 {
1843 VerifyNameAndConnections(layer, name);
1844 const armnn::ResizeDescriptor& layerDescriptor =
1845 static_cast<const armnn::ResizeDescriptor&>(descriptor);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001846 CHECK(layerDescriptor.m_Method == armnn::ResizeMethod::Bilinear);
1847 CHECK(layerDescriptor.m_TargetWidth == m_Descriptor.m_TargetWidth);
1848 CHECK(layerDescriptor.m_TargetHeight == m_Descriptor.m_TargetHeight);
1849 CHECK(layerDescriptor.m_DataLayout == m_Descriptor.m_DataLayout);
1850 CHECK(layerDescriptor.m_AlignCorners == m_Descriptor.m_AlignCorners);
1851 CHECK(layerDescriptor.m_HalfPixelCenters == m_Descriptor.m_HalfPixelCenters);
Finn Williamsb454c5c2021-02-09 15:56:23 +00001852 break;
1853 }
1854 default:
1855 {
1856 throw armnn::Exception("Unexpected layer type in test model. ResizeBiliniar "
1857 "should have translated to Resize");
1858 }
1859 }
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00001860 }
1861};
1862
1863// NOTE: Until the deprecated AddResizeBilinearLayer disappears this test checks that
1864// calling AddResizeBilinearLayer places a ResizeLayer into the serialized format
1865// and that when this deserialises we have a ResizeLayer
Sadik Armagan1625efc2021-06-10 18:24:34 +01001866TEST_CASE("SerializeResizeBilinear")
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00001867{
1868 const std::string layerName("resizeBilinear");
1869 const armnn::TensorInfo inputInfo = armnn::TensorInfo({1, 3, 5, 5}, armnn::DataType::Float32);
1870 const armnn::TensorInfo outputInfo = armnn::TensorInfo({1, 3, 2, 4}, armnn::DataType::Float32);
1871
1872 armnn::ResizeBilinearDescriptor desc;
1873 desc.m_TargetWidth = 4u;
1874 desc.m_TargetHeight = 2u;
David Monahan4a0c9b92020-05-30 09:48:39 +01001875 desc.m_AlignCorners = true;
1876 desc.m_HalfPixelCenters = true;
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00001877
1878 armnn::INetworkPtr network = armnn::INetwork::Create();
1879 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1880 ARMNN_NO_DEPRECATE_WARN_BEGIN
1881 armnn::IConnectableLayer* const resizeLayer = network->AddResizeBilinearLayer(desc, layerName.c_str());
1882 ARMNN_NO_DEPRECATE_WARN_END
1883 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1884
1885 inputLayer->GetOutputSlot(0).Connect(resizeLayer->GetInputSlot(0));
1886 resizeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1887
1888 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
1889 resizeLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1890
1891 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001892 CHECK(deserializedNetwork);
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00001893
1894 ResizeBilinearLayerVerifier verifier(layerName, {inputInfo}, {outputInfo}, desc);
Finn Williamsb454c5c2021-02-09 15:56:23 +00001895 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00001896}
1897
Sadik Armagan1625efc2021-06-10 18:24:34 +01001898TEST_CASE("EnsureResizeBilinearBackwardCompatibility")
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00001899{
1900 // The hex data below is a flat buffer containing a simple network with an input,
1901 // a ResizeBilinearLayer (now deprecated) and an output
1902 //
1903 // This test verifies that we can still deserialize this old-style model by replacing
1904 // the ResizeBilinearLayer with an equivalent ResizeLayer
1905 const std::vector<uint8_t> resizeBilinearModel =
1906 {
1907 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x0A, 0x00,
1908 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
1909 0x50, 0x01, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
1910 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xD4, 0xFE, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x0B,
1911 0x04, 0x00, 0x00, 0x00, 0xC2, 0xFE, 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x08, 0x00,
1912 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x8A, 0xFF, 0xFF, 0xFF, 0x02, 0x00, 0x00, 0x00,
1913 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00,
1914 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1915 0x38, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
1916 0x00, 0x1A, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00,
1917 0x34, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x12, 0x00, 0x08, 0x00, 0x0C, 0x00,
1918 0x07, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
1919 0x00, 0x00, 0x0E, 0x00, 0x18, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x14, 0x00, 0x0E, 0x00,
1920 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00,
1921 0x20, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x72, 0x65, 0x73, 0x69, 0x7A, 0x65, 0x42, 0x69, 0x6C, 0x69,
1922 0x6E, 0x65, 0x61, 0x72, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
1923 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00,
1924 0x00, 0x00, 0x52, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1925 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00,
1926 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1927 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x07, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
1928 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xF6, 0xFF, 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00,
1929 0x0A, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x14, 0x00,
1930 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
1931 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1932 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0A, 0x00,
1933 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x10, 0x00,
1934 0x08, 0x00, 0x07, 0x00, 0x0C, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00,
1935 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00,
1936 0x00, 0x00, 0x05, 0x00, 0x00, 0x00
1937 };
1938
1939 armnn::INetworkPtr deserializedNetwork =
1940 DeserializeNetwork(std::string(resizeBilinearModel.begin(), resizeBilinearModel.end()));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001941 CHECK(deserializedNetwork);
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00001942
1943 const armnn::TensorInfo inputInfo = armnn::TensorInfo({1, 3, 5, 5}, armnn::DataType::Float32);
1944 const armnn::TensorInfo outputInfo = armnn::TensorInfo({1, 3, 2, 4}, armnn::DataType::Float32);
1945
1946 armnn::ResizeBilinearDescriptor descriptor;
1947 descriptor.m_TargetWidth = 4u;
1948 descriptor.m_TargetHeight = 2u;
1949
1950 ResizeBilinearLayerVerifier verifier("resizeBilinear", { inputInfo }, { outputInfo }, descriptor);
Finn Williamsb454c5c2021-02-09 15:56:23 +00001951 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00001952}
1953
Keith Davis3ae3f972021-05-21 16:33:48 +01001954TEST_CASE("SerializeShape")
1955{
1956 const std::string layerName("shape");
1957 const armnn::TensorInfo inputInfo({1, 3, 3, 1}, armnn::DataType::Signed32);
1958 const armnn::TensorInfo outputInfo({ 4 }, armnn::DataType::Signed32);
1959
1960 armnn::INetworkPtr network = armnn::INetwork::Create();
1961 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1962 armnn::IConnectableLayer* const shapeLayer = network->AddShapeLayer(layerName.c_str());
1963 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1964
1965 inputLayer->GetOutputSlot(0).Connect(shapeLayer->GetInputSlot(0));
1966 shapeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1967
1968 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
1969 shapeLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1970
1971 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
1972 CHECK(deserializedNetwork);
1973
1974 LayerVerifierBase verifier(layerName, {inputInfo}, {outputInfo});
1975
1976 deserializedNetwork->ExecuteStrategy(verifier);
1977}
1978
Sadik Armagan1625efc2021-06-10 18:24:34 +01001979TEST_CASE("SerializeSlice")
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +01001980{
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +01001981 const std::string layerName{"slice"};
1982
1983 const armnn::TensorInfo inputInfo = armnn::TensorInfo({3, 2, 3, 1}, armnn::DataType::Float32);
1984 const armnn::TensorInfo outputInfo = armnn::TensorInfo({2, 2, 2, 1}, armnn::DataType::Float32);
1985
1986 armnn::SliceDescriptor descriptor({ 0, 0, 1, 0}, {2, 2, 2, 1});
1987
1988 armnn::INetworkPtr network = armnn::INetwork::Create();
1989
1990 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1991 armnn::IConnectableLayer* const sliceLayer = network->AddSliceLayer(descriptor, layerName.c_str());
1992 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1993
1994 inputLayer->GetOutputSlot(0).Connect(sliceLayer->GetInputSlot(0));
1995 sliceLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1996
1997 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
1998 sliceLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1999
2000 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002001 CHECK(deserializedNetwork);
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +01002002
Finn Williamsb454c5c2021-02-09 15:56:23 +00002003 LayerVerifierBaseWithDescriptor<armnn::SliceDescriptor> verifier(layerName, {inputInfo}, {outputInfo}, descriptor);
2004 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +01002005}
2006
Sadik Armagan1625efc2021-06-10 18:24:34 +01002007TEST_CASE("SerializeSoftmax")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002008{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002009 const std::string layerName("softmax");
2010 const armnn::TensorInfo info({1, 10}, armnn::DataType::Float32);
2011
2012 armnn::SoftmaxDescriptor descriptor;
2013 descriptor.m_Beta = 1.0f;
2014
2015 armnn::INetworkPtr network = armnn::INetwork::Create();
2016 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2017 armnn::IConnectableLayer* const softmaxLayer = network->AddSoftmaxLayer(descriptor, layerName.c_str());
2018 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2019
2020 inputLayer->GetOutputSlot(0).Connect(softmaxLayer->GetInputSlot(0));
2021 softmaxLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2022
2023 inputLayer->GetOutputSlot(0).SetTensorInfo(info);
2024 softmaxLayer->GetOutputSlot(0).SetTensorInfo(info);
2025
2026 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002027 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002028
Finn Williamsb454c5c2021-02-09 15:56:23 +00002029 LayerVerifierBaseWithDescriptor<armnn::SoftmaxDescriptor> verifier(layerName, {info}, {info}, descriptor);
2030 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002031}
2032
Sadik Armagan1625efc2021-06-10 18:24:34 +01002033TEST_CASE("SerializeSpaceToBatchNd")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002034{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002035 const std::string layerName("spaceToBatchNd");
2036 const armnn::TensorInfo inputInfo({2, 1, 2, 4}, armnn::DataType::Float32);
2037 const armnn::TensorInfo outputInfo({8, 1, 1, 3}, armnn::DataType::Float32);
2038
2039 armnn::SpaceToBatchNdDescriptor desc;
2040 desc.m_DataLayout = armnn::DataLayout::NCHW;
2041 desc.m_BlockShape = {2, 2};
2042 desc.m_PadList = {{0, 0}, {2, 0}};
2043
2044 armnn::INetworkPtr network = armnn::INetwork::Create();
2045 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2046 armnn::IConnectableLayer* const spaceToBatchNdLayer = network->AddSpaceToBatchNdLayer(desc, layerName.c_str());
2047 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2048
2049 inputLayer->GetOutputSlot(0).Connect(spaceToBatchNdLayer->GetInputSlot(0));
2050 spaceToBatchNdLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2051
2052 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2053 spaceToBatchNdLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2054
2055 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002056 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002057
Finn Williamsb454c5c2021-02-09 15:56:23 +00002058 LayerVerifierBaseWithDescriptor<armnn::SpaceToBatchNdDescriptor> verifier(
2059 layerName, {inputInfo}, {outputInfo}, desc);
2060 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002061}
2062
Sadik Armagan1625efc2021-06-10 18:24:34 +01002063TEST_CASE("SerializeSpaceToDepth")
Aron Virginas-Taraa067142019-06-11 16:01:44 +01002064{
Aron Virginas-Taraa067142019-06-11 16:01:44 +01002065 const std::string layerName("spaceToDepth");
2066
2067 const armnn::TensorInfo inputInfo ({ 1, 16, 8, 3 }, armnn::DataType::Float32);
2068 const armnn::TensorInfo outputInfo({ 1, 8, 4, 12 }, armnn::DataType::Float32);
2069
2070 armnn::SpaceToDepthDescriptor desc;
2071 desc.m_BlockSize = 2;
2072 desc.m_DataLayout = armnn::DataLayout::NHWC;
2073
2074 armnn::INetworkPtr network = armnn::INetwork::Create();
2075 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2076 armnn::IConnectableLayer* const spaceToDepthLayer = network->AddSpaceToDepthLayer(desc, layerName.c_str());
2077 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2078
2079 inputLayer->GetOutputSlot(0).Connect(spaceToDepthLayer->GetInputSlot(0));
2080 spaceToDepthLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2081
2082 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2083 spaceToDepthLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2084
2085 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002086 CHECK(deserializedNetwork);
Aron Virginas-Taraa067142019-06-11 16:01:44 +01002087
Finn Williamsb454c5c2021-02-09 15:56:23 +00002088 LayerVerifierBaseWithDescriptor<armnn::SpaceToDepthDescriptor> verifier(
2089 layerName, {inputInfo}, {outputInfo}, desc);
2090 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Taraa067142019-06-11 16:01:44 +01002091}
2092
Sadik Armagan1625efc2021-06-10 18:24:34 +01002093TEST_CASE("SerializeSplitter")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002094{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002095 const unsigned int numViews = 3;
2096 const unsigned int numDimensions = 4;
2097 const unsigned int inputShape[] = {1, 18, 4, 4};
2098 const unsigned int outputShape[] = {1, 6, 4, 4};
2099
2100 // This is modelled on how the caffe parser sets up a splitter layer to partition an input along dimension one.
2101 unsigned int splitterDimSizes[4] = {static_cast<unsigned int>(inputShape[0]),
2102 static_cast<unsigned int>(inputShape[1]),
2103 static_cast<unsigned int>(inputShape[2]),
2104 static_cast<unsigned int>(inputShape[3])};
2105 splitterDimSizes[1] /= numViews;
2106 armnn::ViewsDescriptor desc(numViews, numDimensions);
2107
2108 for (unsigned int g = 0; g < numViews; ++g)
2109 {
2110 desc.SetViewOriginCoord(g, 1, splitterDimSizes[1] * g);
2111
2112 for (unsigned int dimIdx=0; dimIdx < 4; dimIdx++)
2113 {
2114 desc.SetViewSize(g, dimIdx, splitterDimSizes[dimIdx]);
2115 }
2116 }
2117
2118 const std::string layerName("splitter");
2119 const armnn::TensorInfo inputInfo(numDimensions, inputShape, armnn::DataType::Float32);
2120 const armnn::TensorInfo outputInfo(numDimensions, outputShape, armnn::DataType::Float32);
2121
2122 armnn::INetworkPtr network = armnn::INetwork::Create();
2123 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2124 armnn::IConnectableLayer* const splitterLayer = network->AddSplitterLayer(desc, layerName.c_str());
2125 armnn::IConnectableLayer* const outputLayer0 = network->AddOutputLayer(0);
2126 armnn::IConnectableLayer* const outputLayer1 = network->AddOutputLayer(1);
2127 armnn::IConnectableLayer* const outputLayer2 = network->AddOutputLayer(2);
2128
2129 inputLayer->GetOutputSlot(0).Connect(splitterLayer->GetInputSlot(0));
2130 splitterLayer->GetOutputSlot(0).Connect(outputLayer0->GetInputSlot(0));
2131 splitterLayer->GetOutputSlot(1).Connect(outputLayer1->GetInputSlot(0));
2132 splitterLayer->GetOutputSlot(2).Connect(outputLayer2->GetInputSlot(0));
2133
2134 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2135 splitterLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2136 splitterLayer->GetOutputSlot(1).SetTensorInfo(outputInfo);
2137 splitterLayer->GetOutputSlot(2).SetTensorInfo(outputInfo);
2138
2139 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002140 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002141
Finn Williamsb454c5c2021-02-09 15:56:23 +00002142 LayerVerifierBaseWithDescriptor<armnn::ViewsDescriptor> verifier(
2143 layerName, {inputInfo}, {outputInfo, outputInfo, outputInfo}, desc);
2144 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002145}
2146
Sadik Armagan1625efc2021-06-10 18:24:34 +01002147TEST_CASE("SerializeStack")
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01002148{
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01002149 const std::string layerName("stack");
2150
2151 armnn::TensorInfo inputTensorInfo ({4, 3, 5}, armnn::DataType::Float32);
2152 armnn::TensorInfo outputTensorInfo({4, 3, 2, 5}, armnn::DataType::Float32);
2153
2154 armnn::StackDescriptor descriptor(2, 2, {4, 3, 5});
2155
2156 armnn::INetworkPtr network = armnn::INetwork::Create();
2157 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(0);
2158 armnn::IConnectableLayer* const inputLayer2 = network->AddInputLayer(1);
2159 armnn::IConnectableLayer* const stackLayer = network->AddStackLayer(descriptor, layerName.c_str());
2160 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2161
2162 inputLayer1->GetOutputSlot(0).Connect(stackLayer->GetInputSlot(0));
2163 inputLayer2->GetOutputSlot(0).Connect(stackLayer->GetInputSlot(1));
2164 stackLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2165
2166 inputLayer1->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
2167 inputLayer2->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
2168 stackLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
2169
2170 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002171 CHECK(deserializedNetwork);
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01002172
Finn Williamsb454c5c2021-02-09 15:56:23 +00002173 LayerVerifierBaseWithDescriptor<armnn::StackDescriptor> verifier(
2174 layerName, {inputTensorInfo, inputTensorInfo}, {outputTensorInfo}, descriptor);
2175 deserializedNetwork->ExecuteStrategy(verifier);
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01002176}
2177
Sadik Armagan1625efc2021-06-10 18:24:34 +01002178TEST_CASE("SerializeStandIn")
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01002179{
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01002180 const std::string layerName("standIn");
2181
2182 armnn::TensorInfo tensorInfo({ 1u }, armnn::DataType::Float32);
2183 armnn::StandInDescriptor descriptor(2u, 2u);
2184
2185 armnn::INetworkPtr network = armnn::INetwork::Create();
2186 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
2187 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
2188 armnn::IConnectableLayer* const standInLayer = network->AddStandInLayer(descriptor, layerName.c_str());
2189 armnn::IConnectableLayer* const outputLayer0 = network->AddOutputLayer(0);
2190 armnn::IConnectableLayer* const outputLayer1 = network->AddOutputLayer(1);
2191
2192 inputLayer0->GetOutputSlot(0).Connect(standInLayer->GetInputSlot(0));
2193 inputLayer0->GetOutputSlot(0).SetTensorInfo(tensorInfo);
2194
2195 inputLayer1->GetOutputSlot(0).Connect(standInLayer->GetInputSlot(1));
2196 inputLayer1->GetOutputSlot(0).SetTensorInfo(tensorInfo);
2197
2198 standInLayer->GetOutputSlot(0).Connect(outputLayer0->GetInputSlot(0));
2199 standInLayer->GetOutputSlot(0).SetTensorInfo(tensorInfo);
2200
2201 standInLayer->GetOutputSlot(1).Connect(outputLayer1->GetInputSlot(0));
2202 standInLayer->GetOutputSlot(1).SetTensorInfo(tensorInfo);
2203
2204 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002205 CHECK(deserializedNetwork);
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01002206
Finn Williamsb454c5c2021-02-09 15:56:23 +00002207 LayerVerifierBaseWithDescriptor<armnn::StandInDescriptor> verifier(
2208 layerName, { tensorInfo, tensorInfo }, { tensorInfo, tensorInfo }, descriptor);
2209 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01002210}
2211
Sadik Armagan1625efc2021-06-10 18:24:34 +01002212TEST_CASE("SerializeStridedSlice")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002213{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002214 const std::string layerName("stridedSlice");
2215 const armnn::TensorInfo inputInfo = armnn::TensorInfo({3, 2, 3, 1}, armnn::DataType::Float32);
2216 const armnn::TensorInfo outputInfo = armnn::TensorInfo({3, 1}, armnn::DataType::Float32);
2217
2218 armnn::StridedSliceDescriptor desc({0, 0, 1, 0}, {1, 1, 1, 1}, {1, 1, 1, 1});
2219 desc.m_EndMask = (1 << 4) - 1;
2220 desc.m_ShrinkAxisMask = (1 << 1) | (1 << 2);
2221 desc.m_DataLayout = armnn::DataLayout::NCHW;
2222
2223 armnn::INetworkPtr network = armnn::INetwork::Create();
2224 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2225 armnn::IConnectableLayer* const stridedSliceLayer = network->AddStridedSliceLayer(desc, layerName.c_str());
2226 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2227
2228 inputLayer->GetOutputSlot(0).Connect(stridedSliceLayer->GetInputSlot(0));
2229 stridedSliceLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2230
2231 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2232 stridedSliceLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2233
2234 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002235 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002236
Finn Williamsb454c5c2021-02-09 15:56:23 +00002237 LayerVerifierBaseWithDescriptor<armnn::StridedSliceDescriptor> verifier(
2238 layerName, {inputInfo}, {outputInfo}, desc);
2239 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002240}
2241
Sadik Armagan1625efc2021-06-10 18:24:34 +01002242TEST_CASE("SerializeSubtraction")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002243{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002244 const std::string layerName("subtraction");
2245 const armnn::TensorInfo info({ 1, 4 }, armnn::DataType::Float32);
2246
2247 armnn::INetworkPtr network = armnn::INetwork::Create();
2248 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
2249 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
2250 armnn::IConnectableLayer* const subtractionLayer = network->AddSubtractionLayer(layerName.c_str());
2251 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2252
2253 inputLayer0->GetOutputSlot(0).Connect(subtractionLayer->GetInputSlot(0));
2254 inputLayer1->GetOutputSlot(0).Connect(subtractionLayer->GetInputSlot(1));
2255 subtractionLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2256
2257 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
2258 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
2259 subtractionLayer->GetOutputSlot(0).SetTensorInfo(info);
2260
2261 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002262 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002263
Finn Williamsb454c5c2021-02-09 15:56:23 +00002264 LayerVerifierBase verifier(layerName, {info, info}, {info});
2265 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +00002266}
2267
Sadik Armagan1625efc2021-06-10 18:24:34 +01002268TEST_CASE("SerializeSwitch")
Sadik Armaganeff363d2019-04-05 15:25:46 +01002269{
2270 class SwitchLayerVerifier : public LayerVerifierBase
2271 {
2272 public:
2273 SwitchLayerVerifier(const std::string& layerName,
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01002274 const std::vector<armnn::TensorInfo>& inputInfos,
2275 const std::vector<armnn::TensorInfo>& outputInfos)
Finn Williamsb454c5c2021-02-09 15:56:23 +00002276 : LayerVerifierBase(layerName, inputInfos, outputInfos) {}
Sadik Armaganeff363d2019-04-05 15:25:46 +01002277
Finn Williamsb454c5c2021-02-09 15:56:23 +00002278 void ExecuteStrategy(const armnn::IConnectableLayer* layer,
2279 const armnn::BaseDescriptor& descriptor,
2280 const std::vector<armnn::ConstTensor>& constants,
2281 const char* name,
2282 const armnn::LayerBindingId id = 0) override
Sadik Armaganeff363d2019-04-05 15:25:46 +01002283 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00002284 armnn::IgnoreUnused(descriptor, constants, id);
2285 switch (layer->GetType())
2286 {
2287 case armnn::LayerType::Input: break;
2288 case armnn::LayerType::Output: break;
2289 case armnn::LayerType::Constant: break;
2290 case armnn::LayerType::Switch:
2291 {
2292 VerifyNameAndConnections(layer, name);
2293 break;
2294 }
2295 default:
2296 {
2297 throw armnn::Exception("Unexpected layer type in Switch test model");
2298 }
2299 }
Sadik Armaganeff363d2019-04-05 15:25:46 +01002300 }
Sadik Armaganeff363d2019-04-05 15:25:46 +01002301 };
2302
2303 const std::string layerName("switch");
2304 const armnn::TensorInfo info({ 1, 4 }, armnn::DataType::Float32);
2305
2306 std::vector<float> constantData = GenerateRandomData<float>(info.GetNumElements());
2307 armnn::ConstTensor constTensor(info, constantData);
2308
2309 armnn::INetworkPtr network = armnn::INetwork::Create();
2310 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2311 armnn::IConnectableLayer* const constantLayer = network->AddConstantLayer(constTensor, "constant");
2312 armnn::IConnectableLayer* const switchLayer = network->AddSwitchLayer(layerName.c_str());
2313 armnn::IConnectableLayer* const trueOutputLayer = network->AddOutputLayer(0);
2314 armnn::IConnectableLayer* const falseOutputLayer = network->AddOutputLayer(1);
2315
2316 inputLayer->GetOutputSlot(0).Connect(switchLayer->GetInputSlot(0));
2317 constantLayer->GetOutputSlot(0).Connect(switchLayer->GetInputSlot(1));
2318 switchLayer->GetOutputSlot(0).Connect(trueOutputLayer->GetInputSlot(0));
2319 switchLayer->GetOutputSlot(1).Connect(falseOutputLayer->GetInputSlot(0));
2320
2321 inputLayer->GetOutputSlot(0).SetTensorInfo(info);
2322 constantLayer->GetOutputSlot(0).SetTensorInfo(info);
2323 switchLayer->GetOutputSlot(0).SetTensorInfo(info);
2324 switchLayer->GetOutputSlot(1).SetTensorInfo(info);
2325
2326 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002327 CHECK(deserializedNetwork);
Sadik Armaganeff363d2019-04-05 15:25:46 +01002328
2329 SwitchLayerVerifier verifier(layerName, {info, info}, {info, info});
Finn Williamsb454c5c2021-02-09 15:56:23 +00002330 deserializedNetwork->ExecuteStrategy(verifier);
Sadik Armaganeff363d2019-04-05 15:25:46 +01002331}
2332
Sadik Armagan1625efc2021-06-10 18:24:34 +01002333TEST_CASE("SerializeTranspose")
Mike Kellyc9ea45a2020-02-28 18:11:58 +00002334{
Mike Kellyc9ea45a2020-02-28 18:11:58 +00002335 const std::string layerName("transpose");
2336 const armnn::TensorInfo inputTensorInfo({4, 3, 2, 1}, armnn::DataType::Float32);
2337 const armnn::TensorInfo outputTensorInfo({1, 2, 3, 4}, armnn::DataType::Float32);
2338
2339 armnn::TransposeDescriptor descriptor(armnn::PermutationVector({3, 2, 1, 0}));
2340
2341 armnn::INetworkPtr network = armnn::INetwork::Create();
2342 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2343 armnn::IConnectableLayer* const transposeLayer = network->AddTransposeLayer(descriptor, layerName.c_str());
2344 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2345
2346 inputLayer->GetOutputSlot(0).Connect(transposeLayer->GetInputSlot(0));
2347 transposeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2348
2349 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
2350 transposeLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
2351
2352 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002353 CHECK(deserializedNetwork);
Mike Kellyc9ea45a2020-02-28 18:11:58 +00002354
Finn Williamsb454c5c2021-02-09 15:56:23 +00002355 LayerVerifierBaseWithDescriptor<armnn::TransposeDescriptor> verifier(
2356 layerName, {inputTensorInfo}, {outputTensorInfo}, descriptor);
2357 deserializedNetwork->ExecuteStrategy(verifier);
Mike Kellyc9ea45a2020-02-28 18:11:58 +00002358}
2359
Sadik Armagan1625efc2021-06-10 18:24:34 +01002360TEST_CASE("SerializeTransposeConvolution2d")
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01002361{
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01002362 const std::string layerName("transposeConvolution2d");
2363 const armnn::TensorInfo inputInfo ({ 1, 7, 7, 1 }, armnn::DataType::Float32);
2364 const armnn::TensorInfo outputInfo({ 1, 9, 9, 1 }, armnn::DataType::Float32);
2365
2366 const armnn::TensorInfo weightsInfo({ 1, 3, 3, 1 }, armnn::DataType::Float32);
2367 const armnn::TensorInfo biasesInfo ({ 1 }, armnn::DataType::Float32);
2368
2369 std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements());
2370 armnn::ConstTensor weights(weightsInfo, weightsData);
2371
2372 std::vector<float> biasesData = GenerateRandomData<float>(biasesInfo.GetNumElements());
2373 armnn::ConstTensor biases(biasesInfo, biasesData);
2374
2375 armnn::TransposeConvolution2dDescriptor descriptor;
2376 descriptor.m_PadLeft = 1;
2377 descriptor.m_PadRight = 1;
2378 descriptor.m_PadTop = 1;
2379 descriptor.m_PadBottom = 1;
2380 descriptor.m_StrideX = 1;
2381 descriptor.m_StrideY = 1;
2382 descriptor.m_BiasEnabled = true;
2383 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
2384
2385 armnn::INetworkPtr network = armnn::INetwork::Create();
2386 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2387 armnn::IConnectableLayer* const convLayer =
2388 network->AddTransposeConvolution2dLayer(descriptor,
2389 weights,
2390 armnn::Optional<armnn::ConstTensor>(biases),
2391 layerName.c_str());
2392 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2393
2394 inputLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(0));
2395 convLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2396
2397 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2398 convLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2399
2400 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002401 CHECK(deserializedNetwork);
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01002402
Finn Williamsb454c5c2021-02-09 15:56:23 +00002403 const std::vector<armnn::ConstTensor> constants {weights, biases};
2404 LayerVerifierBaseWithDescriptorAndConstants<armnn::TransposeConvolution2dDescriptor> verifier(
2405 layerName, {inputInfo}, {outputInfo}, descriptor, constants);
2406 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01002407}
2408
Sadik Armagan1625efc2021-06-10 18:24:34 +01002409TEST_CASE("SerializeDeserializeNonLinearNetwork")
Sadik Armagandb059fd2019-03-20 12:28:32 +00002410{
2411 class ConstantLayerVerifier : public LayerVerifierBase
2412 {
2413 public:
2414 ConstantLayerVerifier(const std::string& layerName,
2415 const std::vector<armnn::TensorInfo>& inputInfos,
2416 const std::vector<armnn::TensorInfo>& outputInfos,
2417 const armnn::ConstTensor& layerInput)
2418 : LayerVerifierBase(layerName, inputInfos, outputInfos)
2419 , m_LayerInput(layerInput) {}
2420
Finn Williamsb454c5c2021-02-09 15:56:23 +00002421 void ExecuteStrategy(const armnn::IConnectableLayer* layer,
2422 const armnn::BaseDescriptor& descriptor,
2423 const std::vector<armnn::ConstTensor>& constants,
2424 const char* name,
2425 const armnn::LayerBindingId id = 0) override
Sadik Armagandb059fd2019-03-20 12:28:32 +00002426 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00002427 armnn::IgnoreUnused(descriptor, constants, id);
2428 switch (layer->GetType())
2429 {
2430 case armnn::LayerType::Input: break;
2431 case armnn::LayerType::Output: break;
2432 case armnn::LayerType::Addition: break;
2433 case armnn::LayerType::Constant:
2434 {
2435 VerifyNameAndConnections(layer, name);
2436 CompareConstTensor(constants.at(0), m_LayerInput);
2437 break;
2438 }
2439 default:
2440 {
2441 throw armnn::Exception("Unexpected layer type in test model");
2442 }
2443 }
Sadik Armagandb059fd2019-03-20 12:28:32 +00002444 }
2445
Sadik Armagandb059fd2019-03-20 12:28:32 +00002446 private:
2447 armnn::ConstTensor m_LayerInput;
2448 };
2449
2450 const std::string layerName("constant");
2451 const armnn::TensorInfo info({ 2, 3 }, armnn::DataType::Float32);
2452
2453 std::vector<float> constantData = GenerateRandomData<float>(info.GetNumElements());
2454 armnn::ConstTensor constTensor(info, constantData);
2455
2456 armnn::INetworkPtr network(armnn::INetwork::Create());
2457 armnn::IConnectableLayer* input = network->AddInputLayer(0);
2458 armnn::IConnectableLayer* add = network->AddAdditionLayer();
2459 armnn::IConnectableLayer* constant = network->AddConstantLayer(constTensor, layerName.c_str());
2460 armnn::IConnectableLayer* output = network->AddOutputLayer(0);
2461
2462 input->GetOutputSlot(0).Connect(add->GetInputSlot(0));
2463 constant->GetOutputSlot(0).Connect(add->GetInputSlot(1));
2464 add->GetOutputSlot(0).Connect(output->GetInputSlot(0));
2465
2466 input->GetOutputSlot(0).SetTensorInfo(info);
2467 constant->GetOutputSlot(0).SetTensorInfo(info);
2468 add->GetOutputSlot(0).SetTensorInfo(info);
2469
2470 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002471 CHECK(deserializedNetwork);
Sadik Armagandb059fd2019-03-20 12:28:32 +00002472
2473 ConstantLayerVerifier verifier(layerName, {}, {info}, constTensor);
Finn Williamsb454c5c2021-02-09 15:56:23 +00002474 deserializedNetwork->ExecuteStrategy(verifier);
James Conroy8d333182020-05-13 10:27:58 +01002475}
2476
Teresa Charlin50de4fa2021-05-31 18:47:33 +01002477}