blob: a568bf15c9e82db9cc0b7e0152cd33df9bfcc2b3 [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
Samuel Yapa04f4a12022-08-19 11:14:38 +010095TEST_CASE("SerializeBatchMatMul")
96{
97 const std::string layerName("batchMatMul");
98 const armnn::TensorInfo inputXInfo({2, 3, 4, 5}, armnn::DataType::Float32);
99 const armnn::TensorInfo inputYInfo({2, 4, 3, 5}, armnn::DataType::Float32);
100
101 const armnn::TensorInfo outputInfo({2, 3, 3, 5}, armnn::DataType::Float32);
102
103 armnn::BatchMatMulDescriptor descriptor(false,
104 false,
105 false,
106 false,
107 armnn::DataLayout::NHWC,
108 armnn::DataLayout::NHWC);
109
110 armnn::INetworkPtr network = armnn::INetwork::Create();
111 armnn::IConnectableLayer* const inputXLayer = network->AddInputLayer(0);
112 armnn::IConnectableLayer* const inputYLayer = network->AddInputLayer(1);
113
114 armnn::IConnectableLayer* const batchMatMulLayer =
115 network->AddBatchMatMulLayer(descriptor, layerName.c_str());
116 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
117
118 inputXLayer->GetOutputSlot(0).Connect(batchMatMulLayer->GetInputSlot(0));
119 inputYLayer->GetOutputSlot(0).Connect(batchMatMulLayer->GetInputSlot(1));
120 batchMatMulLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
121
122 inputXLayer->GetOutputSlot(0).SetTensorInfo(inputXInfo);
123 inputYLayer->GetOutputSlot(0).SetTensorInfo(inputYInfo);
124 batchMatMulLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
125
126 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
127 CHECK(deserializedNetwork);
128
129 LayerVerifierBaseWithDescriptor<armnn::BatchMatMulDescriptor> verifier(layerName,
130 {inputXInfo, inputYInfo},
131 {outputInfo},
132 descriptor);
133 deserializedNetwork->ExecuteStrategy(verifier);
134}
135
Sadik Armagan1625efc2021-06-10 18:24:34 +0100136TEST_CASE("SerializeBatchNormalization")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000137{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000138 const std::string layerName("batchNormalization");
139 const armnn::TensorInfo inputInfo ({ 1, 3, 3, 1 }, armnn::DataType::Float32);
140 const armnn::TensorInfo outputInfo({ 1, 3, 3, 1 }, armnn::DataType::Float32);
141
Cathal Corbett5b8093c2021-10-22 11:12:07 +0100142 const armnn::TensorInfo meanInfo({1}, armnn::DataType::Float32, 0.0f, 0, true);
143 const armnn::TensorInfo varianceInfo({1}, armnn::DataType::Float32, 0.0f, 0, true);
144 const armnn::TensorInfo betaInfo({1}, armnn::DataType::Float32, 0.0f, 0, true);
145 const armnn::TensorInfo gammaInfo({1}, armnn::DataType::Float32, 0.0f, 0, true);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000146
147 armnn::BatchNormalizationDescriptor descriptor;
148 descriptor.m_Eps = 0.0010000000475f;
149 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
150
151 std::vector<float> meanData({5.0});
152 std::vector<float> varianceData({2.0});
153 std::vector<float> betaData({1.0});
154 std::vector<float> gammaData({0.0});
155
Finn Williamsb454c5c2021-02-09 15:56:23 +0000156 std::vector<armnn::ConstTensor> constants;
157 constants.emplace_back(armnn::ConstTensor(meanInfo, meanData));
158 constants.emplace_back(armnn::ConstTensor(varianceInfo, varianceData));
159 constants.emplace_back(armnn::ConstTensor(betaInfo, betaData));
160 constants.emplace_back(armnn::ConstTensor(gammaInfo, gammaData));
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000161
162 armnn::INetworkPtr network = armnn::INetwork::Create();
163 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
164 armnn::IConnectableLayer* const batchNormalizationLayer =
Finn Williamsb454c5c2021-02-09 15:56:23 +0000165 network->AddBatchNormalizationLayer(descriptor,
166 constants[0],
167 constants[1],
168 constants[2],
169 constants[3],
170 layerName.c_str());
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000171 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
172
173 inputLayer->GetOutputSlot(0).Connect(batchNormalizationLayer->GetInputSlot(0));
174 batchNormalizationLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
175
176 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
177 batchNormalizationLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
178
179 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100180 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000181
Finn Williamsb454c5c2021-02-09 15:56:23 +0000182 LayerVerifierBaseWithDescriptorAndConstants<armnn::BatchNormalizationDescriptor> verifier(
183 layerName, {inputInfo}, {outputInfo}, descriptor, constants);
184 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000185}
186
Sadik Armagan1625efc2021-06-10 18:24:34 +0100187TEST_CASE("SerializeBatchToSpaceNd")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000188{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000189 const std::string layerName("spaceToBatchNd");
190 const armnn::TensorInfo inputInfo({4, 1, 2, 2}, armnn::DataType::Float32);
191 const armnn::TensorInfo outputInfo({1, 1, 4, 4}, armnn::DataType::Float32);
192
193 armnn::BatchToSpaceNdDescriptor desc;
194 desc.m_DataLayout = armnn::DataLayout::NCHW;
195 desc.m_BlockShape = {2, 2};
196 desc.m_Crops = {{0, 0}, {0, 0}};
197
198 armnn::INetworkPtr network = armnn::INetwork::Create();
199 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
200 armnn::IConnectableLayer* const batchToSpaceNdLayer = network->AddBatchToSpaceNdLayer(desc, layerName.c_str());
201 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
202
203 inputLayer->GetOutputSlot(0).Connect(batchToSpaceNdLayer->GetInputSlot(0));
204 batchToSpaceNdLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
205
206 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
207 batchToSpaceNdLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
208
209 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100210 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000211
Finn Williamsb454c5c2021-02-09 15:56:23 +0000212 LayerVerifierBaseWithDescriptor<armnn::BatchToSpaceNdDescriptor> verifier(layerName,
213 {inputInfo},
214 {outputInfo},
215 desc);
216 deserializedNetwork->ExecuteStrategy(verifier);
Mike Kelly8c1701a2019-02-11 17:01:27 +0000217}
218
Sadik Armagan1625efc2021-06-10 18:24:34 +0100219TEST_CASE("SerializeCast")
mathad01b392e982021-04-07 12:07:30 +0100220{
221 const std::string layerName("cast");
222
223 const armnn::TensorShape shape{1, 5, 2, 3};
224
225 const armnn::TensorInfo inputInfo = armnn::TensorInfo(shape, armnn::DataType::Signed32);
226 const armnn::TensorInfo outputInfo = armnn::TensorInfo(shape, armnn::DataType::Float32);
227
228 armnn::INetworkPtr network = armnn::INetwork::Create();
229 armnn::IConnectableLayer* inputLayer = network->AddInputLayer(0);
230 armnn::IConnectableLayer* castLayer = network->AddCastLayer(layerName.c_str());
231 armnn::IConnectableLayer* outputLayer = network->AddOutputLayer(0);
232
233 inputLayer->GetOutputSlot(0).Connect(castLayer->GetInputSlot(0));
234 castLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
235
236 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
237 castLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
238
239 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100240 CHECK(deserializedNetwork);
mathad01b392e982021-04-07 12:07:30 +0100241
242 LayerVerifierBase verifier(layerName, {inputInfo}, {outputInfo});
243 deserializedNetwork->ExecuteStrategy(verifier);
244}
245
Simon Obute51f67772021-09-03 15:50:13 +0100246TEST_CASE("SerializeChannelShuffle")
247{
248 const std::string layerName("channelShuffle");
249 const armnn::TensorInfo inputInfo({1, 9}, armnn::DataType::Float32);
250 const armnn::TensorInfo outputInfo({1, 9}, armnn::DataType::Float32);
251
252 armnn::ChannelShuffleDescriptor descriptor({3, 1});
253
254 armnn::INetworkPtr network = armnn::INetwork::Create();
255 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
256 armnn::IConnectableLayer* const ChannelShuffleLayer =
257 network->AddChannelShuffleLayer(descriptor, layerName.c_str());
258 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
259
260 inputLayer->GetOutputSlot(0).Connect(ChannelShuffleLayer->GetInputSlot(0));
261 ChannelShuffleLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
262
263 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
264 ChannelShuffleLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
265
266 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
267 CHECK(deserializedNetwork);
268
269 LayerVerifierBaseWithDescriptor<armnn::ChannelShuffleDescriptor> verifier(
270 layerName, {inputInfo}, {outputInfo}, descriptor);
271 deserializedNetwork->ExecuteStrategy(verifier);
272}
273
Sadik Armagan1625efc2021-06-10 18:24:34 +0100274TEST_CASE("SerializeComparison")
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100275{
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100276 const std::string layerName("comparison");
277
278 const armnn::TensorShape shape{2, 1, 2, 4};
279
280 const armnn::TensorInfo inputInfo = armnn::TensorInfo(shape, armnn::DataType::Float32);
281 const armnn::TensorInfo outputInfo = armnn::TensorInfo(shape, armnn::DataType::Boolean);
282
283 armnn::ComparisonDescriptor descriptor(armnn::ComparisonOperation::NotEqual);
284
285 armnn::INetworkPtr network = armnn::INetwork::Create();
286 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
287 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
288 armnn::IConnectableLayer* const comparisonLayer = network->AddComparisonLayer(descriptor, layerName.c_str());
289 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
290
291 inputLayer0->GetOutputSlot(0).Connect(comparisonLayer->GetInputSlot(0));
292 inputLayer1->GetOutputSlot(0).Connect(comparisonLayer->GetInputSlot(1));
293 comparisonLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
294
295 inputLayer0->GetOutputSlot(0).SetTensorInfo(inputInfo);
296 inputLayer1->GetOutputSlot(0).SetTensorInfo(inputInfo);
297 comparisonLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
298
299 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100300 CHECK(deserializedNetwork);
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100301
Finn Williamsb454c5c2021-02-09 15:56:23 +0000302 LayerVerifierBaseWithDescriptor<armnn::ComparisonDescriptor> verifier(layerName,
303 { inputInfo, inputInfo },
304 { outputInfo },
305 descriptor);
306 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100307}
308
Sadik Armagan1625efc2021-06-10 18:24:34 +0100309TEST_CASE("SerializeConstant")
Conor Kennedy76277882019-02-26 08:29:54 +0000310{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000311 class ConstantLayerVerifier : public LayerVerifierBase
Conor Kennedy76277882019-02-26 08:29:54 +0000312 {
313 public:
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000314 ConstantLayerVerifier(const std::string& layerName,
315 const std::vector<armnn::TensorInfo>& inputInfos,
316 const std::vector<armnn::TensorInfo>& outputInfos,
Finn Williamsb454c5c2021-02-09 15:56:23 +0000317 const std::vector<armnn::ConstTensor>& constants)
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100318 : LayerVerifierBase(layerName, inputInfos, outputInfos)
Finn Williamsb454c5c2021-02-09 15:56:23 +0000319 , m_Constants(constants) {}
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000320
Finn Williamsb454c5c2021-02-09 15:56:23 +0000321 void ExecuteStrategy(const armnn::IConnectableLayer* layer,
322 const armnn::BaseDescriptor& descriptor,
323 const std::vector<armnn::ConstTensor>& constants,
324 const char* name,
325 const armnn::LayerBindingId id = 0) override
Conor Kennedy76277882019-02-26 08:29:54 +0000326 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000327 armnn::IgnoreUnused(descriptor, id);
328
329 switch (layer->GetType())
330 {
331 case armnn::LayerType::Input: break;
332 case armnn::LayerType::Output: break;
333 case armnn::LayerType::Addition: break;
334 default:
335 {
336 this->VerifyNameAndConnections(layer, name);
337
338 for (std::size_t i = 0; i < constants.size(); i++)
339 {
340 CompareConstTensor(constants[i], m_Constants[i]);
341 }
342 }
343 }
Conor Kennedy76277882019-02-26 08:29:54 +0000344 }
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000345
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000346 private:
Finn Williamsb454c5c2021-02-09 15:56:23 +0000347 const std::vector<armnn::ConstTensor> m_Constants;
Conor Kennedy76277882019-02-26 08:29:54 +0000348 };
349
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000350 const std::string layerName("constant");
Cathal Corbett5b8093c2021-10-22 11:12:07 +0100351 const armnn::TensorInfo info({ 2, 3 }, armnn::DataType::Float32, 0.0f, 0, true);
Conor Kennedy76277882019-02-26 08:29:54 +0000352
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000353 std::vector<float> constantData = GenerateRandomData<float>(info.GetNumElements());
354 armnn::ConstTensor constTensor(info, constantData);
Conor Kennedy76277882019-02-26 08:29:54 +0000355
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000356 armnn::INetworkPtr network(armnn::INetwork::Create());
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000357 armnn::IConnectableLayer* input = network->AddInputLayer(0);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000358 armnn::IConnectableLayer* constant = network->AddConstantLayer(constTensor, layerName.c_str());
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000359 armnn::IConnectableLayer* add = network->AddAdditionLayer();
360 armnn::IConnectableLayer* output = network->AddOutputLayer(0);
Conor Kennedy76277882019-02-26 08:29:54 +0000361
362 input->GetOutputSlot(0).Connect(add->GetInputSlot(0));
363 constant->GetOutputSlot(0).Connect(add->GetInputSlot(1));
364 add->GetOutputSlot(0).Connect(output->GetInputSlot(0));
365
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000366 input->GetOutputSlot(0).SetTensorInfo(info);
367 constant->GetOutputSlot(0).SetTensorInfo(info);
368 add->GetOutputSlot(0).SetTensorInfo(info);
Conor Kennedy76277882019-02-26 08:29:54 +0000369
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000370 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100371 CHECK(deserializedNetwork);
Conor Kennedy76277882019-02-26 08:29:54 +0000372
Finn Williamsb454c5c2021-02-09 15:56:23 +0000373 ConstantLayerVerifier verifier(layerName, {}, {info}, {constTensor});
374 deserializedNetwork->ExecuteStrategy(verifier);
Conor Kennedy76277882019-02-26 08:29:54 +0000375}
376
Keith Davisb4dd5cc2022-04-07 11:32:00 +0100377using Convolution2dDescriptor = armnn::Convolution2dDescriptor;
378class Convolution2dLayerVerifier : public LayerVerifierBaseWithDescriptor<Convolution2dDescriptor>
379{
380public:
381 Convolution2dLayerVerifier(const std::string& layerName,
382 const std::vector<armnn::TensorInfo>& inputInfos,
383 const std::vector<armnn::TensorInfo>& outputInfos,
384 const Convolution2dDescriptor& descriptor)
385 : LayerVerifierBaseWithDescriptor<Convolution2dDescriptor>(layerName, inputInfos, outputInfos, descriptor) {}
386
387 void ExecuteStrategy(const armnn::IConnectableLayer* layer,
388 const armnn::BaseDescriptor& descriptor,
389 const std::vector<armnn::ConstTensor>& constants,
390 const char* name,
391 const armnn::LayerBindingId id = 0) override
392 {
393 armnn::IgnoreUnused(constants, id);
394 switch (layer->GetType())
395 {
396 case armnn::LayerType::Input: break;
397 case armnn::LayerType::Output: break;
398 case armnn::LayerType::Constant: break;
399 default:
400 {
401 VerifyNameAndConnections(layer, name);
402 const Convolution2dDescriptor& layerDescriptor =
403 static_cast<const Convolution2dDescriptor&>(descriptor);
404 CHECK(layerDescriptor.m_BiasEnabled == m_Descriptor.m_BiasEnabled);
405 }
406 }
407 }
408};
409
Sadik Armagan1625efc2021-06-10 18:24:34 +0100410TEST_CASE("SerializeConvolution2d")
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000411{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000412 const std::string layerName("convolution2d");
413 const armnn::TensorInfo inputInfo ({ 1, 5, 5, 1 }, armnn::DataType::Float32);
414 const armnn::TensorInfo outputInfo({ 1, 3, 3, 1 }, armnn::DataType::Float32);
Saoirse Stewart263829c2019-02-19 15:54:14 +0000415
Cathal Corbett5b8093c2021-10-22 11:12:07 +0100416 const armnn::TensorInfo weightsInfo({ 1, 3, 3, 1 }, armnn::DataType::Float32, 0.0f, 0, true);
417 const armnn::TensorInfo biasesInfo ({ 1 }, armnn::DataType::Float32, 0.0f, 0, true);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000418
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000419 std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements());
420 armnn::ConstTensor weights(weightsInfo, weightsData);
421
422 std::vector<float> biasesData = GenerateRandomData<float>(biasesInfo.GetNumElements());
423 armnn::ConstTensor biases(biasesInfo, biasesData);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000424
425 armnn::Convolution2dDescriptor descriptor;
426 descriptor.m_PadLeft = 1;
427 descriptor.m_PadRight = 1;
428 descriptor.m_PadTop = 1;
429 descriptor.m_PadBottom = 1;
430 descriptor.m_StrideX = 2;
431 descriptor.m_StrideY = 2;
Aron Virginas-Tar5e1b0cf2019-06-21 14:20:11 +0100432 descriptor.m_DilationX = 2;
433 descriptor.m_DilationY = 2;
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000434 descriptor.m_BiasEnabled = true;
435 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
436
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000437 armnn::INetworkPtr network = armnn::INetwork::Create();
438 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
Keith Davisb4dd5cc2022-04-07 11:32:00 +0100439 ARMNN_NO_DEPRECATE_WARN_BEGIN
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000440 armnn::IConnectableLayer* const convLayer =
Matteo Martincighfc598e12019-05-14 10:36:13 +0100441 network->AddConvolution2dLayer(descriptor,
442 weights,
443 armnn::Optional<armnn::ConstTensor>(biases),
444 layerName.c_str());
Keith Davisb4dd5cc2022-04-07 11:32:00 +0100445 ARMNN_NO_DEPRECATE_WARN_END
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000446 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000447
448 inputLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(0));
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000449 convLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000450
451 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000452 convLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
453
454 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100455 CHECK(deserializedNetwork);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000456
Keith Davisb4dd5cc2022-04-07 11:32:00 +0100457 Convolution2dLayerVerifier verifier(layerName, {inputInfo, weightsInfo, biasesInfo}, {outputInfo}, descriptor);
Finn Williamsb454c5c2021-02-09 15:56:23 +0000458 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000459}
460
Keith Davis721e6292022-05-17 10:06:53 +0100461TEST_CASE("SerializeConvolution2dWithPerAxisParamsTestDeprecatedMethod")
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000462{
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000463 using namespace armnn;
464
465 const std::string layerName("convolution2dWithPerAxis");
466 const TensorInfo inputInfo ({ 1, 3, 1, 2 }, DataType::QAsymmU8, 0.55f, 128);
467 const TensorInfo outputInfo({ 1, 3, 1, 3 }, DataType::QAsymmU8, 0.75f, 128);
468
469 const std::vector<float> quantScales{ 0.75f, 0.65f, 0.85f };
470 constexpr unsigned int quantDimension = 0;
471
Cathal Corbett5b8093c2021-10-22 11:12:07 +0100472 const TensorInfo kernelInfo({ 3, 1, 1, 2 }, DataType::QSymmS8, quantScales, quantDimension, true);
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000473
474 const std::vector<float> biasQuantScales{ 0.25f, 0.50f, 0.75f };
Cathal Corbett5b8093c2021-10-22 11:12:07 +0100475 const TensorInfo biasInfo({ 3 }, DataType::Signed32, biasQuantScales, quantDimension, true);
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000476
477 std::vector<int8_t> kernelData = GenerateRandomData<int8_t>(kernelInfo.GetNumElements());
478 armnn::ConstTensor weights(kernelInfo, kernelData);
479 std::vector<int32_t> biasData = GenerateRandomData<int32_t>(biasInfo.GetNumElements());
480 armnn::ConstTensor biases(biasInfo, biasData);
481
482 Convolution2dDescriptor descriptor;
483 descriptor.m_StrideX = 1;
484 descriptor.m_StrideY = 1;
485 descriptor.m_PadLeft = 0;
486 descriptor.m_PadRight = 0;
487 descriptor.m_PadTop = 0;
488 descriptor.m_PadBottom = 0;
489 descriptor.m_BiasEnabled = true;
490 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
491
492 armnn::INetworkPtr network = armnn::INetwork::Create();
493 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
Keith Davisb4dd5cc2022-04-07 11:32:00 +0100494 ARMNN_NO_DEPRECATE_WARN_BEGIN
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000495 armnn::IConnectableLayer* const convLayer =
496 network->AddConvolution2dLayer(descriptor,
497 weights,
498 armnn::Optional<armnn::ConstTensor>(biases),
499 layerName.c_str());
Keith Davisb4dd5cc2022-04-07 11:32:00 +0100500 ARMNN_NO_DEPRECATE_WARN_END
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000501 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
502
503 inputLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(0));
504 convLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
505
506 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
507 convLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
508
509 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100510 CHECK(deserializedNetwork);
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000511
Keith Davisb4dd5cc2022-04-07 11:32:00 +0100512 Convolution2dLayerVerifier verifier(layerName, {inputInfo, kernelInfo, biasInfo}, {outputInfo}, descriptor);
513
514 deserializedNetwork->ExecuteStrategy(verifier);
515}
516
517TEST_CASE("SerializeConvolution2dWeightsAndBiasesAsConstantLayers")
518{
519 const std::string layerName("convolution2d");
520 const armnn::TensorInfo inputInfo ({ 1, 5, 5, 1 }, armnn::DataType::Float32);
521 const armnn::TensorInfo outputInfo({ 1, 3, 3, 1 }, armnn::DataType::Float32);
522
523 const armnn::TensorInfo weightsInfo({ 1, 3, 3, 1 }, armnn::DataType::Float32, 0.0f, 0, true);
524 const armnn::TensorInfo biasesInfo ({ 1 }, armnn::DataType::Float32, 0.0f, 0, true);
525
526 std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements());
527 armnn::ConstTensor weights(weightsInfo, weightsData);
528
529 std::vector<float> biasesData = GenerateRandomData<float>(biasesInfo.GetNumElements());
530 armnn::ConstTensor biases(biasesInfo, biasesData);
531
532 armnn::Convolution2dDescriptor descriptor;
533 descriptor.m_PadLeft = 1;
534 descriptor.m_PadRight = 1;
535 descriptor.m_PadTop = 1;
536 descriptor.m_PadBottom = 1;
537 descriptor.m_StrideX = 2;
538 descriptor.m_StrideY = 2;
539 descriptor.m_DilationX = 2;
540 descriptor.m_DilationY = 2;
541 descriptor.m_BiasEnabled = true;
542 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
543
544 armnn::INetworkPtr network = armnn::INetwork::Create();
545 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
546 armnn::IConnectableLayer* const weightsLayer = network->AddConstantLayer(weights, "Weights");
547 armnn::IConnectableLayer* const biasesLayer = network->AddConstantLayer(biases, "Biases");
548 armnn::IConnectableLayer* const convLayer = network->AddConvolution2dLayer(descriptor,
549 layerName.c_str());
550 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
551
552 inputLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(0));
553 weightsLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(1));
554 biasesLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(2));
555 convLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
556
557 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
558 weightsLayer->GetOutputSlot(0).SetTensorInfo(weightsInfo);
559 biasesLayer->GetOutputSlot(0).SetTensorInfo(biasesInfo);
560 convLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
561
562 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
563 CHECK(deserializedNetwork);
564
Finn Williamsb454c5c2021-02-09 15:56:23 +0000565 const std::vector<armnn::ConstTensor>& constants {weights, biases};
Keith Davisb4dd5cc2022-04-07 11:32:00 +0100566 LayerVerifierBaseWithDescriptorAndConstants<armnn::Convolution2dDescriptor> verifier(
567 layerName, {inputInfo, weightsInfo, biasesInfo}, {outputInfo}, descriptor, constants);
568
Finn Williamsb454c5c2021-02-09 15:56:23 +0000569 deserializedNetwork->ExecuteStrategy(verifier);
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000570}
571
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100572TEST_CASE("SerializeConvolution3d")
573{
574 const std::string layerName("convolution3d");
575 const armnn::TensorInfo inputInfo ({ 1, 5, 5, 5, 1 }, armnn::DataType::Float32);
576 const armnn::TensorInfo outputInfo({ 1, 2, 2, 2, 1 }, armnn::DataType::Float32);
577
Cathal Corbett5b8093c2021-10-22 11:12:07 +0100578 const armnn::TensorInfo weightsInfo({ 3, 3, 3, 1, 1 }, armnn::DataType::Float32, 0.0f, 0, true);
579 const armnn::TensorInfo biasesInfo ({ 1 }, armnn::DataType::Float32, 0.0f, 0, true);
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100580
581 std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements());
582 armnn::ConstTensor weights(weightsInfo, weightsData);
583
584 std::vector<float> biasesData = GenerateRandomData<float>(biasesInfo.GetNumElements());
585 armnn::ConstTensor biases(biasesInfo, biasesData);
586
587 armnn::Convolution3dDescriptor descriptor;
588 descriptor.m_PadLeft = 0;
589 descriptor.m_PadRight = 0;
590 descriptor.m_PadTop = 0;
591 descriptor.m_PadBottom = 0;
592 descriptor.m_PadFront = 0;
593 descriptor.m_PadBack = 0;
594 descriptor.m_DilationX = 1;
595 descriptor.m_DilationY = 1;
596 descriptor.m_DilationZ = 1;
597 descriptor.m_StrideX = 2;
598 descriptor.m_StrideY = 2;
599 descriptor.m_StrideZ = 2;
600 descriptor.m_BiasEnabled = true;
601 descriptor.m_DataLayout = armnn::DataLayout::NDHWC;
602
603 armnn::INetworkPtr network = armnn::INetwork::Create();
604 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100605 armnn::IConnectableLayer* const weightsLayer = network->AddConstantLayer(weights, "Weights");
606 armnn::IConnectableLayer* const biasesLayer = network->AddConstantLayer(biases, "Biases");
607 armnn::IConnectableLayer* const convLayer = network->AddConvolution3dLayer(descriptor, layerName.c_str());
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100608 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
609
610 inputLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(0));
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100611 weightsLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(1));
612 biasesLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(2));
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100613 convLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
614
615 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100616 weightsLayer->GetOutputSlot(0).SetTensorInfo(weightsInfo);
617 biasesLayer->GetOutputSlot(0).SetTensorInfo(biasesInfo);
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100618 convLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
619
620 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
621 CHECK(deserializedNetwork);
622
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100623 LayerVerifierBaseWithDescriptor<armnn::Convolution3dDescriptor> verifier(
624 layerName, {inputInfo, weightsInfo, biasesInfo}, {outputInfo}, descriptor);
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100625 deserializedNetwork->ExecuteStrategy(verifier);
626}
627
Sadik Armagan1625efc2021-06-10 18:24:34 +0100628TEST_CASE("SerializeDepthToSpace")
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100629{
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100630 const std::string layerName("depthToSpace");
631
632 const armnn::TensorInfo inputInfo ({ 1, 8, 4, 12 }, armnn::DataType::Float32);
633 const armnn::TensorInfo outputInfo({ 1, 16, 8, 3 }, armnn::DataType::Float32);
634
635 armnn::DepthToSpaceDescriptor desc;
636 desc.m_BlockSize = 2;
637 desc.m_DataLayout = armnn::DataLayout::NHWC;
638
639 armnn::INetworkPtr network = armnn::INetwork::Create();
640 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
641 armnn::IConnectableLayer* const depthToSpaceLayer = network->AddDepthToSpaceLayer(desc, layerName.c_str());
642 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
643
644 inputLayer->GetOutputSlot(0).Connect(depthToSpaceLayer->GetInputSlot(0));
645 depthToSpaceLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
646
647 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
648 depthToSpaceLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
649
650 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100651 CHECK(deserializedNetwork);
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100652
Finn Williamsb454c5c2021-02-09 15:56:23 +0000653 LayerVerifierBaseWithDescriptor<armnn::DepthToSpaceDescriptor> verifier(layerName, {inputInfo}, {outputInfo}, desc);
654 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100655}
656
Sadik Armagan1625efc2021-06-10 18:24:34 +0100657TEST_CASE("SerializeDepthwiseConvolution2d")
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000658{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000659 const std::string layerName("depwiseConvolution2d");
660 const armnn::TensorInfo inputInfo ({ 1, 5, 5, 3 }, armnn::DataType::Float32);
661 const armnn::TensorInfo outputInfo({ 1, 3, 3, 3 }, armnn::DataType::Float32);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000662
Cathal Corbett5b8093c2021-10-22 11:12:07 +0100663 const armnn::TensorInfo weightsInfo({ 1, 3, 3, 3 }, armnn::DataType::Float32, 0.0f, 0, true);
664 const armnn::TensorInfo biasesInfo ({ 3 }, armnn::DataType::Float32, 0.0f, 0, true);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000665
666 std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements());
667 armnn::ConstTensor weights(weightsInfo, weightsData);
668
669 std::vector<int32_t> biasesData = GenerateRandomData<int32_t>(biasesInfo.GetNumElements());
670 armnn::ConstTensor biases(biasesInfo, biasesData);
671
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000672 armnn::DepthwiseConvolution2dDescriptor descriptor;
Aron Virginas-Tar5e1b0cf2019-06-21 14:20:11 +0100673 descriptor.m_PadLeft = 1;
674 descriptor.m_PadRight = 1;
675 descriptor.m_PadTop = 1;
676 descriptor.m_PadBottom = 1;
677 descriptor.m_StrideX = 2;
678 descriptor.m_StrideY = 2;
679 descriptor.m_DilationX = 2;
680 descriptor.m_DilationY = 2;
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000681 descriptor.m_BiasEnabled = true;
682 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
683
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000684 armnn::INetworkPtr network = armnn::INetwork::Create();
685 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
Cathal Corbett06902652022-04-14 17:55:11 +0100686 armnn::IConnectableLayer* const depthwiseConvLayer = network->AddDepthwiseConvolution2dLayer(descriptor,
687 layerName.c_str());
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000688 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
689
690 inputLayer->GetOutputSlot(0).Connect(depthwiseConvLayer->GetInputSlot(0));
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000691 depthwiseConvLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000692
693 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000694 depthwiseConvLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
695
Cathal Corbett06902652022-04-14 17:55:11 +0100696 armnn::IConnectableLayer* const weightsLayer = network->AddConstantLayer(weights);
697 weightsLayer->GetOutputSlot(0).Connect(depthwiseConvLayer->GetInputSlot(1u));
698 weightsLayer->GetOutputSlot(0).SetTensorInfo(weights.GetInfo());
699
700 armnn::IConnectableLayer* const biasLayer = network->AddConstantLayer(biases);
701 biasLayer->GetOutputSlot(0).Connect(depthwiseConvLayer->GetInputSlot(2u));
702 biasLayer->GetOutputSlot(0).SetTensorInfo(biases.GetInfo());
703
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000704 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100705 CHECK(deserializedNetwork);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000706
Finn Williamsb454c5c2021-02-09 15:56:23 +0000707 const std::vector<armnn::ConstTensor>& constants {weights, biases};
708 LayerVerifierBaseWithDescriptorAndConstants<armnn::DepthwiseConvolution2dDescriptor> verifier(
Cathal Corbett06902652022-04-14 17:55:11 +0100709 layerName, {inputInfo, weightsInfo, biasesInfo}, {outputInfo}, descriptor, constants);
Finn Williamsb454c5c2021-02-09 15:56:23 +0000710 deserializedNetwork->ExecuteStrategy(verifier);
Jim Flynn18ce3382019-03-08 11:08:30 +0000711}
712
Sadik Armagan1625efc2021-06-10 18:24:34 +0100713TEST_CASE("SerializeDepthwiseConvolution2dWithPerAxisParams")
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000714{
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000715 using namespace armnn;
716
717 const std::string layerName("depwiseConvolution2dWithPerAxis");
718 const TensorInfo inputInfo ({ 1, 3, 3, 2 }, DataType::QAsymmU8, 0.55f, 128);
719 const TensorInfo outputInfo({ 1, 2, 2, 4 }, DataType::QAsymmU8, 0.75f, 128);
720
721 const std::vector<float> quantScales{ 0.75f, 0.80f, 0.90f, 0.95f };
722 const unsigned int quantDimension = 0;
Cathal Corbett5b8093c2021-10-22 11:12:07 +0100723 TensorInfo kernelInfo({ 2, 2, 2, 2 }, DataType::QSymmS8, quantScales, quantDimension, true);
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000724
725 const std::vector<float> biasQuantScales{ 0.25f, 0.35f, 0.45f, 0.55f };
726 constexpr unsigned int biasQuantDimension = 0;
Cathal Corbett5b8093c2021-10-22 11:12:07 +0100727 TensorInfo biasInfo({ 4 }, DataType::Signed32, biasQuantScales, biasQuantDimension, true);
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000728
729 std::vector<int8_t> kernelData = GenerateRandomData<int8_t>(kernelInfo.GetNumElements());
730 armnn::ConstTensor weights(kernelInfo, kernelData);
731 std::vector<int32_t> biasData = GenerateRandomData<int32_t>(biasInfo.GetNumElements());
732 armnn::ConstTensor biases(biasInfo, biasData);
733
734 DepthwiseConvolution2dDescriptor descriptor;
735 descriptor.m_StrideX = 1;
736 descriptor.m_StrideY = 1;
737 descriptor.m_PadLeft = 0;
738 descriptor.m_PadRight = 0;
739 descriptor.m_PadTop = 0;
740 descriptor.m_PadBottom = 0;
741 descriptor.m_DilationX = 1;
742 descriptor.m_DilationY = 1;
743 descriptor.m_BiasEnabled = true;
744 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
745
746 armnn::INetworkPtr network = armnn::INetwork::Create();
747 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
Cathal Corbett06902652022-04-14 17:55:11 +0100748 armnn::IConnectableLayer* const depthwiseConvLayer = network->AddDepthwiseConvolution2dLayer(descriptor,
749 layerName.c_str());
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000750 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
751
752 inputLayer->GetOutputSlot(0).Connect(depthwiseConvLayer->GetInputSlot(0));
753 depthwiseConvLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
754
755 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
756 depthwiseConvLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
757
Cathal Corbett06902652022-04-14 17:55:11 +0100758 armnn::IConnectableLayer* const weightsLayer = network->AddConstantLayer(weights);
759 weightsLayer->GetOutputSlot(0).Connect(depthwiseConvLayer->GetInputSlot(1u));
760 weightsLayer->GetOutputSlot(0).SetTensorInfo(weights.GetInfo());
761
762 armnn::IConnectableLayer* const biasLayer = network->AddConstantLayer(biases);
763 biasLayer->GetOutputSlot(0).Connect(depthwiseConvLayer->GetInputSlot(2u));
764 biasLayer->GetOutputSlot(0).SetTensorInfo(biases.GetInfo());
765
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000766 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100767 CHECK(deserializedNetwork);
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000768
Finn Williamsb454c5c2021-02-09 15:56:23 +0000769 const std::vector<armnn::ConstTensor>& constants {weights, biases};
770 LayerVerifierBaseWithDescriptorAndConstants<armnn::DepthwiseConvolution2dDescriptor> verifier(
Cathal Corbett06902652022-04-14 17:55:11 +0100771 layerName, {inputInfo, kernelInfo, biasInfo}, {outputInfo}, descriptor, constants);
772 deserializedNetwork->ExecuteStrategy(verifier);
773}
774
775TEST_CASE("SerializeDepthwiseConvolution2dWeightsAndBiasesAsConstantLayers")
776{
777 const std::string layerName("depthwiseConvolution2d");
778 const armnn::TensorInfo inputInfo ({ 1, 5, 5, 1 }, armnn::DataType::Float32);
779 const armnn::TensorInfo outputInfo({ 1, 3, 3, 1 }, armnn::DataType::Float32);
780
781 const armnn::TensorInfo weightsInfo({ 1, 3, 3, 1 }, armnn::DataType::Float32, 0.0f, 0, true);
782 const armnn::TensorInfo biasesInfo ({ 1 }, armnn::DataType::Float32, 0.0f, 0, true);
783
784 std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements());
785 armnn::ConstTensor weights(weightsInfo, weightsData);
786
787 std::vector<float> biasesData = GenerateRandomData<float>(biasesInfo.GetNumElements());
788 armnn::ConstTensor biases(biasesInfo, biasesData);
789
790 armnn::DepthwiseConvolution2dDescriptor descriptor;
791 descriptor.m_PadLeft = 1;
792 descriptor.m_PadRight = 1;
793 descriptor.m_PadTop = 1;
794 descriptor.m_PadBottom = 1;
795 descriptor.m_StrideX = 2;
796 descriptor.m_StrideY = 2;
797 descriptor.m_DilationX = 2;
798 descriptor.m_DilationY = 2;
799 descriptor.m_BiasEnabled = true;
800 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
801
802 armnn::INetworkPtr network = armnn::INetwork::Create();
803 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
804 armnn::IConnectableLayer* const weightsLayer = network->AddConstantLayer(weights, "Weights");
805 armnn::IConnectableLayer* const biasesLayer = network->AddConstantLayer(biases, "Biases");
806 armnn::IConnectableLayer* const convLayer = network->AddDepthwiseConvolution2dLayer(descriptor,
807 layerName.c_str());
808 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
809
810 inputLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(0));
811 weightsLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(1));
812 biasesLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(2));
813 convLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
814
815 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
816 weightsLayer->GetOutputSlot(0).SetTensorInfo(weightsInfo);
817 biasesLayer->GetOutputSlot(0).SetTensorInfo(biasesInfo);
818 convLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
819
820 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
821 CHECK(deserializedNetwork);
822
823 const std::vector<armnn::ConstTensor>& constants {weights, biases};
824 LayerVerifierBaseWithDescriptorAndConstants<armnn::DepthwiseConvolution2dDescriptor> verifier(
825 layerName, {inputInfo, weightsInfo, biasesInfo}, {outputInfo}, descriptor, constants);
826
Finn Williamsb454c5c2021-02-09 15:56:23 +0000827 deserializedNetwork->ExecuteStrategy(verifier);
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000828}
829
Sadik Armagan1625efc2021-06-10 18:24:34 +0100830TEST_CASE("SerializeDequantize")
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000831{
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000832 const std::string layerName("dequantize");
Derek Lambertif90c56d2020-01-10 17:14:08 +0000833 const armnn::TensorInfo inputInfo({ 1, 5, 2, 3 }, armnn::DataType::QAsymmU8, 0.5f, 1);
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000834 const armnn::TensorInfo outputInfo({ 1, 5, 2, 3 }, armnn::DataType::Float32);
835
836 armnn::INetworkPtr network = armnn::INetwork::Create();
837 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
838 armnn::IConnectableLayer* const dequantizeLayer = network->AddDequantizeLayer(layerName.c_str());
839 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
840
841 inputLayer->GetOutputSlot(0).Connect(dequantizeLayer->GetInputSlot(0));
842 dequantizeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
843
844 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
845 dequantizeLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
846
847 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100848 CHECK(deserializedNetwork);
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000849
Finn Williamsb454c5c2021-02-09 15:56:23 +0000850 LayerVerifierBase verifier(layerName, {inputInfo}, {outputInfo});
851 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000852}
853
Sadik Armagan1625efc2021-06-10 18:24:34 +0100854TEST_CASE("SerializeDeserializeDetectionPostProcess")
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000855{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000856 const std::string layerName("detectionPostProcess");
857
858 const std::vector<armnn::TensorInfo> inputInfos({
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000859 armnn::TensorInfo({ 1, 6, 4 }, armnn::DataType::Float32),
860 armnn::TensorInfo({ 1, 6, 3}, armnn::DataType::Float32)
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000861 });
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000862
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000863 const std::vector<armnn::TensorInfo> outputInfos({
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000864 armnn::TensorInfo({ 1, 3, 4 }, armnn::DataType::Float32),
865 armnn::TensorInfo({ 1, 3 }, armnn::DataType::Float32),
866 armnn::TensorInfo({ 1, 3 }, armnn::DataType::Float32),
867 armnn::TensorInfo({ 1 }, armnn::DataType::Float32)
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000868 });
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000869
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000870 armnn::DetectionPostProcessDescriptor descriptor;
871 descriptor.m_UseRegularNms = true;
872 descriptor.m_MaxDetections = 3;
873 descriptor.m_MaxClassesPerDetection = 1;
874 descriptor.m_DetectionsPerClass =1;
875 descriptor.m_NmsScoreThreshold = 0.0;
876 descriptor.m_NmsIouThreshold = 0.5;
877 descriptor.m_NumClasses = 2;
878 descriptor.m_ScaleY = 10.0;
879 descriptor.m_ScaleX = 10.0;
880 descriptor.m_ScaleH = 5.0;
881 descriptor.m_ScaleW = 5.0;
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000882
Cathal Corbett5b8093c2021-10-22 11:12:07 +0100883 const armnn::TensorInfo anchorsInfo({ 6, 4 }, armnn::DataType::Float32, 0.0f, 0, true);
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000884 const std::vector<float> anchorsData({
885 0.5f, 0.5f, 1.0f, 1.0f,
886 0.5f, 0.5f, 1.0f, 1.0f,
887 0.5f, 0.5f, 1.0f, 1.0f,
888 0.5f, 10.5f, 1.0f, 1.0f,
889 0.5f, 10.5f, 1.0f, 1.0f,
890 0.5f, 100.5f, 1.0f, 1.0f
891 });
892 armnn::ConstTensor anchors(anchorsInfo, anchorsData);
893
894 armnn::INetworkPtr network = armnn::INetwork::Create();
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000895 armnn::IConnectableLayer* const detectionLayer =
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000896 network->AddDetectionPostProcessLayer(descriptor, anchors, layerName.c_str());
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000897
898 for (unsigned int i = 0; i < 2; i++)
899 {
900 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(static_cast<int>(i));
901 inputLayer->GetOutputSlot(0).Connect(detectionLayer->GetInputSlot(i));
902 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfos[i]);
903 }
904
905 for (unsigned int i = 0; i < 4; i++)
906 {
907 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(static_cast<int>(i));
908 detectionLayer->GetOutputSlot(i).Connect(outputLayer->GetInputSlot(0));
909 detectionLayer->GetOutputSlot(i).SetTensorInfo(outputInfos[i]);
910 }
911
912 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100913 CHECK(deserializedNetwork);
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000914
Finn Williamsb454c5c2021-02-09 15:56:23 +0000915 const std::vector<armnn::ConstTensor>& constants {anchors};
916 LayerVerifierBaseWithDescriptorAndConstants<armnn::DetectionPostProcessDescriptor> verifier(
917 layerName, inputInfos, outputInfos, descriptor, constants);
918 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000919}
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000920
Sadik Armagan1625efc2021-06-10 18:24:34 +0100921TEST_CASE("SerializeDivision")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000922{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000923 const std::string layerName("division");
924 const armnn::TensorInfo info({ 1, 5, 2, 3 }, armnn::DataType::Float32);
925
926 armnn::INetworkPtr network = armnn::INetwork::Create();
927 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
928 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
929 armnn::IConnectableLayer* const divisionLayer = network->AddDivisionLayer(layerName.c_str());
930 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
931
932 inputLayer0->GetOutputSlot(0).Connect(divisionLayer->GetInputSlot(0));
933 inputLayer1->GetOutputSlot(0).Connect(divisionLayer->GetInputSlot(1));
934 divisionLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
935
936 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
937 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
938 divisionLayer->GetOutputSlot(0).SetTensorInfo(info);
939
940 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100941 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000942
Finn Williamsb454c5c2021-02-09 15:56:23 +0000943 LayerVerifierBase verifier(layerName, {info, info}, {info});
944 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000945}
946
Jan Eilers1b2654f2021-09-24 15:45:46 +0100947TEST_CASE("SerializeDeserializeComparisonEqual")
Aron Virginas-Tar6d2e6592019-10-22 11:44:47 +0100948{
Finn Williamsb454c5c2021-02-09 15:56:23 +0000949 const std::string layerName("EqualLayer");
950 const armnn::TensorInfo inputTensorInfo1 = armnn::TensorInfo({2, 1, 2, 4}, armnn::DataType::Float32);
951 const armnn::TensorInfo inputTensorInfo2 = armnn::TensorInfo({2, 1, 2, 4}, armnn::DataType::Float32);
952 const armnn::TensorInfo outputTensorInfo = armnn::TensorInfo({2, 1, 2, 4}, armnn::DataType::Boolean);
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100953
954 armnn::INetworkPtr network = armnn::INetwork::Create();
Finn Williamsb454c5c2021-02-09 15:56:23 +0000955 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(0);
956 armnn::IConnectableLayer* const inputLayer2 = network->AddInputLayer(1);
Jan Eilers1b2654f2021-09-24 15:45:46 +0100957 armnn::ComparisonDescriptor equalDescriptor(armnn::ComparisonOperation::Equal);
958 armnn::IConnectableLayer* const equalLayer = network->AddComparisonLayer(equalDescriptor, layerName.c_str());
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100959 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
960
Finn Williamsb454c5c2021-02-09 15:56:23 +0000961 inputLayer1->GetOutputSlot(0).Connect(equalLayer->GetInputSlot(0));
962 inputLayer1->GetOutputSlot(0).SetTensorInfo(inputTensorInfo1);
963 inputLayer2->GetOutputSlot(0).Connect(equalLayer->GetInputSlot(1));
964 inputLayer2->GetOutputSlot(0).SetTensorInfo(inputTensorInfo2);
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100965 equalLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
Finn Williamsb454c5c2021-02-09 15:56:23 +0000966 equalLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100967
968 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100969 CHECK(deserializedNetwork);
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100970
Finn Williamsb454c5c2021-02-09 15:56:23 +0000971 LayerVerifierBase verifier(layerName, {inputTensorInfo1, inputTensorInfo2}, {outputTensorInfo});
972 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tar6d2e6592019-10-22 11:44:47 +0100973}
974
Teresa Charlin50de4fa2021-05-31 18:47:33 +0100975void SerializeElementwiseUnaryTest(armnn::UnaryOperation unaryOperation)
976{
977 auto layerName = GetUnaryOperationAsCString(unaryOperation);
978
979 const armnn::TensorShape shape{2, 1, 2, 2};
980
981 const armnn::TensorInfo inputInfo = armnn::TensorInfo(shape, armnn::DataType::Float32);
982 const armnn::TensorInfo outputInfo = armnn::TensorInfo(shape, armnn::DataType::Float32);
983
984 armnn::ElementwiseUnaryDescriptor descriptor(unaryOperation);
985
986 armnn::INetworkPtr network = armnn::INetwork::Create();
987 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
988 armnn::IConnectableLayer* const elementwiseUnaryLayer =
989 network->AddElementwiseUnaryLayer(descriptor, layerName);
990 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
991
992 inputLayer->GetOutputSlot(0).Connect(elementwiseUnaryLayer->GetInputSlot(0));
993 elementwiseUnaryLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
994
995 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
996 elementwiseUnaryLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
997
998 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
999
1000 CHECK(deserializedNetwork);
1001
1002 LayerVerifierBaseWithDescriptor<armnn::ElementwiseUnaryDescriptor>
1003 verifier(layerName, { inputInfo }, { outputInfo }, descriptor);
1004
1005 deserializedNetwork->ExecuteStrategy(verifier);
1006}
1007
1008TEST_CASE("SerializeElementwiseUnary")
1009{
1010 using op = armnn::UnaryOperation;
1011 std::initializer_list<op> allUnaryOperations = {op::Abs, op::Exp, op::Sqrt, op::Rsqrt, op::Neg,
1012 op::LogicalNot, op::Log, op::Sin};
1013
1014 for (auto unaryOperation : allUnaryOperations)
1015 {
1016 SerializeElementwiseUnaryTest(unaryOperation);
1017 }
1018}
1019
Sadik Armagan1625efc2021-06-10 18:24:34 +01001020TEST_CASE("SerializeFill")
Keith Davis300ad562020-06-04 16:34:23 +01001021{
Keith Davis300ad562020-06-04 16:34:23 +01001022 const std::string layerName("fill");
Teresa Charlin4b10fef2020-07-29 09:36:41 +01001023 const armnn::TensorInfo inputInfo({4}, armnn::DataType::Signed32);
Keith Davis300ad562020-06-04 16:34:23 +01001024 const armnn::TensorInfo outputInfo({1, 3, 3, 1}, armnn::DataType::Float32);
1025
1026 armnn::FillDescriptor descriptor(1.0f);
1027
1028 armnn::INetworkPtr network = armnn::INetwork::Create();
1029 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1030 armnn::IConnectableLayer* const fillLayer = network->AddFillLayer(descriptor, layerName.c_str());
1031 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1032
1033 inputLayer->GetOutputSlot(0).Connect(fillLayer->GetInputSlot(0));
1034 fillLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1035
1036 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
1037 fillLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1038
1039 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001040 CHECK(deserializedNetwork);
Keith Davis300ad562020-06-04 16:34:23 +01001041
Finn Williamsb454c5c2021-02-09 15:56:23 +00001042 LayerVerifierBaseWithDescriptor<armnn::FillDescriptor> verifier(layerName, {inputInfo}, {outputInfo}, descriptor);
Keith Davis300ad562020-06-04 16:34:23 +01001043
Finn Williamsb454c5c2021-02-09 15:56:23 +00001044 deserializedNetwork->ExecuteStrategy(verifier);
Keith Davis300ad562020-06-04 16:34:23 +01001045}
1046
Sadik Armagan1625efc2021-06-10 18:24:34 +01001047TEST_CASE("SerializeFloor")
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01001048{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001049 const std::string layerName("floor");
1050 const armnn::TensorInfo info({4,4}, armnn::DataType::Float32);
1051
1052 armnn::INetworkPtr network = armnn::INetwork::Create();
1053 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1054 armnn::IConnectableLayer* const floorLayer = network->AddFloorLayer(layerName.c_str());
1055 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1056
1057 inputLayer->GetOutputSlot(0).Connect(floorLayer->GetInputSlot(0));
1058 floorLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1059
1060 inputLayer->GetOutputSlot(0).SetTensorInfo(info);
1061 floorLayer->GetOutputSlot(0).SetTensorInfo(info);
1062
1063 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001064 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001065
Finn Williamsb454c5c2021-02-09 15:56:23 +00001066 LayerVerifierBase verifier(layerName, {info}, {info});
1067 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001068}
1069
Matthew Sloyan81beae32021-07-13 19:46:11 +01001070using FullyConnectedDescriptor = armnn::FullyConnectedDescriptor;
1071class FullyConnectedLayerVerifier : public LayerVerifierBaseWithDescriptor<FullyConnectedDescriptor>
1072{
1073public:
1074 FullyConnectedLayerVerifier(const std::string& layerName,
1075 const std::vector<armnn::TensorInfo>& inputInfos,
1076 const std::vector<armnn::TensorInfo>& outputInfos,
1077 const FullyConnectedDescriptor& descriptor)
1078 : LayerVerifierBaseWithDescriptor<FullyConnectedDescriptor>(layerName, inputInfos, outputInfos, descriptor) {}
1079
1080 void ExecuteStrategy(const armnn::IConnectableLayer* layer,
1081 const armnn::BaseDescriptor& descriptor,
1082 const std::vector<armnn::ConstTensor>& constants,
1083 const char* name,
1084 const armnn::LayerBindingId id = 0) override
1085 {
1086 armnn::IgnoreUnused(constants, id);
1087 switch (layer->GetType())
1088 {
1089 case armnn::LayerType::Input: break;
1090 case armnn::LayerType::Output: break;
1091 case armnn::LayerType::Constant: break;
1092 default:
1093 {
1094 VerifyNameAndConnections(layer, name);
1095 const FullyConnectedDescriptor& layerDescriptor =
1096 static_cast<const FullyConnectedDescriptor&>(descriptor);
1097 CHECK(layerDescriptor.m_ConstantWeights == m_Descriptor.m_ConstantWeights);
1098 CHECK(layerDescriptor.m_BiasEnabled == m_Descriptor.m_BiasEnabled);
1099 CHECK(layerDescriptor.m_TransposeWeightMatrix == m_Descriptor.m_TransposeWeightMatrix);
1100 }
1101 }
1102 }
1103};
1104
Sadik Armagan1625efc2021-06-10 18:24:34 +01001105TEST_CASE("SerializeFullyConnected")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001106{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001107 const std::string layerName("fullyConnected");
1108 const armnn::TensorInfo inputInfo ({ 2, 5, 1, 1 }, armnn::DataType::Float32);
1109 const armnn::TensorInfo outputInfo({ 2, 3 }, armnn::DataType::Float32);
1110
Cathal Corbett5b8093c2021-10-22 11:12:07 +01001111 const armnn::TensorInfo weightsInfo({ 5, 3 }, armnn::DataType::Float32, 0.0f, 0, true);
1112 const armnn::TensorInfo biasesInfo ({ 3 }, armnn::DataType::Float32, 0.0f, 0, true);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001113 std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements());
1114 std::vector<float> biasesData = GenerateRandomData<float>(biasesInfo.GetNumElements());
1115 armnn::ConstTensor weights(weightsInfo, weightsData);
1116 armnn::ConstTensor biases(biasesInfo, biasesData);
1117
1118 armnn::FullyConnectedDescriptor descriptor;
1119 descriptor.m_BiasEnabled = true;
1120 descriptor.m_TransposeWeightMatrix = false;
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001121 descriptor.m_ConstantWeights = true;
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001122
1123 armnn::INetworkPtr network = armnn::INetwork::Create();
1124 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
Francis Murtaghbb6c6492022-02-09 15:13:38 +00001125 armnn::IConnectableLayer* const weightsInputLayer = network->AddInputLayer(1);
1126 armnn::IConnectableLayer* const biasInputLayer = network->AddInputLayer(2);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001127 armnn::IConnectableLayer* const fullyConnectedLayer =
Francis Murtaghbb6c6492022-02-09 15:13:38 +00001128 network->AddFullyConnectedLayer(descriptor,
1129 layerName.c_str());
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001130 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1131
1132 inputLayer->GetOutputSlot(0).Connect(fullyConnectedLayer->GetInputSlot(0));
Francis Murtaghbb6c6492022-02-09 15:13:38 +00001133 weightsInputLayer->GetOutputSlot(0).Connect(fullyConnectedLayer->GetInputSlot(1));
1134 biasInputLayer->GetOutputSlot(0).Connect(fullyConnectedLayer->GetInputSlot(2));
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001135 fullyConnectedLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1136
1137 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
Francis Murtaghbb6c6492022-02-09 15:13:38 +00001138 weightsInputLayer->GetOutputSlot(0).SetTensorInfo(weightsInfo);
1139 biasInputLayer->GetOutputSlot(0).SetTensorInfo(biasesInfo);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001140 fullyConnectedLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1141
1142 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001143 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001144
Matthew Sloyan81beae32021-07-13 19:46:11 +01001145 FullyConnectedLayerVerifier verifier(layerName, {inputInfo, weightsInfo, biasesInfo}, {outputInfo}, descriptor);
Finn Williamsb454c5c2021-02-09 15:56:23 +00001146 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001147}
1148
Matthew Sloyan81beae32021-07-13 19:46:11 +01001149TEST_CASE("SerializeFullyConnectedWeightsAndBiasesAsInputs")
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001150{
1151 const std::string layerName("fullyConnected_weights_as_inputs");
1152 const armnn::TensorInfo inputInfo ({ 2, 5, 1, 1 }, armnn::DataType::Float32);
1153 const armnn::TensorInfo outputInfo({ 2, 3 }, armnn::DataType::Float32);
1154
1155 const armnn::TensorInfo weightsInfo({ 5, 3 }, armnn::DataType::Float32);
1156 const armnn::TensorInfo biasesInfo ({ 3 }, armnn::DataType::Float32);
1157
1158 armnn::Optional<armnn::ConstTensor> weights = armnn::EmptyOptional();
1159 armnn::Optional<armnn::ConstTensor> bias = armnn::EmptyOptional();
1160
1161 armnn::FullyConnectedDescriptor descriptor;
1162 descriptor.m_BiasEnabled = true;
1163 descriptor.m_TransposeWeightMatrix = false;
1164 descriptor.m_ConstantWeights = false;
1165
1166 armnn::INetworkPtr network = armnn::INetwork::Create();
1167 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1168 armnn::IConnectableLayer* const weightsInputLayer = network->AddInputLayer(1);
1169 armnn::IConnectableLayer* const biasInputLayer = network->AddInputLayer(2);
1170 armnn::IConnectableLayer* const fullyConnectedLayer =
1171 network->AddFullyConnectedLayer(descriptor,
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001172 layerName.c_str());
1173 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1174
1175 inputLayer->GetOutputSlot(0).Connect(fullyConnectedLayer->GetInputSlot(0));
1176 weightsInputLayer->GetOutputSlot(0).Connect(fullyConnectedLayer->GetInputSlot(1));
1177 biasInputLayer->GetOutputSlot(0).Connect(fullyConnectedLayer->GetInputSlot(2));
1178 fullyConnectedLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1179
1180 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
1181 weightsInputLayer->GetOutputSlot(0).SetTensorInfo(weightsInfo);
1182 biasInputLayer->GetOutputSlot(0).SetTensorInfo(biasesInfo);
1183 fullyConnectedLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1184
1185 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001186 CHECK(deserializedNetwork);
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001187
1188 const std::vector<armnn::ConstTensor> constants {};
1189 LayerVerifierBaseWithDescriptorAndConstants<armnn::FullyConnectedDescriptor> verifier(
1190 layerName, {inputInfo, weightsInfo, biasesInfo}, {outputInfo}, descriptor, constants);
1191 deserializedNetwork->ExecuteStrategy(verifier);
1192}
1193
Matthew Sloyan81beae32021-07-13 19:46:11 +01001194TEST_CASE("SerializeFullyConnectedWeightsAndBiasesAsConstantLayers")
1195{
1196 const std::string layerName("fullyConnected_weights_as_inputs");
1197 const armnn::TensorInfo inputInfo ({ 2, 5, 1, 1 }, armnn::DataType::Float32);
1198 const armnn::TensorInfo outputInfo({ 2, 3 }, armnn::DataType::Float32);
1199
Cathal Corbett5b8093c2021-10-22 11:12:07 +01001200 const armnn::TensorInfo weightsInfo({ 5, 3 }, armnn::DataType::Float32, 0.0f, 0, true);
1201 const armnn::TensorInfo biasesInfo ({ 3 }, armnn::DataType::Float32, 0.0f, 0, true);
Matthew Sloyan81beae32021-07-13 19:46:11 +01001202
1203 std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements());
1204 std::vector<float> biasesData = GenerateRandomData<float>(biasesInfo.GetNumElements());
1205 armnn::ConstTensor weights(weightsInfo, weightsData);
1206 armnn::ConstTensor biases(biasesInfo, biasesData);
1207
1208 armnn::FullyConnectedDescriptor descriptor;
1209 descriptor.m_BiasEnabled = true;
1210 descriptor.m_TransposeWeightMatrix = false;
1211 descriptor.m_ConstantWeights = true;
1212
1213 armnn::INetworkPtr network = armnn::INetwork::Create();
1214 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1215 armnn::IConnectableLayer* const weightsLayer = network->AddConstantLayer(weights, "Weights");
1216 armnn::IConnectableLayer* const biasesLayer = network->AddConstantLayer(biases, "Biases");
1217 armnn::IConnectableLayer* const fullyConnectedLayer = network->AddFullyConnectedLayer(descriptor,layerName.c_str());
1218 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1219
1220 inputLayer->GetOutputSlot(0).Connect(fullyConnectedLayer->GetInputSlot(0));
1221 weightsLayer->GetOutputSlot(0).Connect(fullyConnectedLayer->GetInputSlot(1));
1222 biasesLayer->GetOutputSlot(0).Connect(fullyConnectedLayer->GetInputSlot(2));
1223 fullyConnectedLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1224
1225 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
1226 weightsLayer->GetOutputSlot(0).SetTensorInfo(weightsInfo);
1227 biasesLayer->GetOutputSlot(0).SetTensorInfo(biasesInfo);
1228 fullyConnectedLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1229
1230 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
1231 CHECK(deserializedNetwork);
1232
1233 FullyConnectedLayerVerifier verifier(layerName, {inputInfo, weightsInfo, biasesInfo}, {outputInfo}, descriptor);
1234 deserializedNetwork->ExecuteStrategy(verifier);
1235}
1236
Sadik Armagan1625efc2021-06-10 18:24:34 +01001237TEST_CASE("SerializeGather")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001238{
Teresa Charlin52664732020-06-29 16:27:03 +01001239 using GatherDescriptor = armnn::GatherDescriptor;
1240 class GatherLayerVerifier : public LayerVerifierBaseWithDescriptor<GatherDescriptor>
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001241 {
1242 public:
1243 GatherLayerVerifier(const std::string& layerName,
1244 const std::vector<armnn::TensorInfo>& inputInfos,
Teresa Charlin52664732020-06-29 16:27:03 +01001245 const std::vector<armnn::TensorInfo>& outputInfos,
1246 const GatherDescriptor& descriptor)
1247 : LayerVerifierBaseWithDescriptor<GatherDescriptor>(layerName, inputInfos, outputInfos, descriptor) {}
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001248
Finn Williamsb454c5c2021-02-09 15:56:23 +00001249 void ExecuteStrategy(const armnn::IConnectableLayer* layer,
1250 const armnn::BaseDescriptor& descriptor,
1251 const std::vector<armnn::ConstTensor>& constants,
1252 const char* name,
1253 const armnn::LayerBindingId id = 0) override
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001254 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001255 armnn::IgnoreUnused(constants, id);
1256 switch (layer->GetType())
1257 {
1258 case armnn::LayerType::Input: break;
1259 case armnn::LayerType::Output: break;
1260 case armnn::LayerType::Constant: break;
1261 default:
1262 {
1263 VerifyNameAndConnections(layer, name);
1264 const GatherDescriptor& layerDescriptor = static_cast<const GatherDescriptor&>(descriptor);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001265 CHECK(layerDescriptor.m_Axis == m_Descriptor.m_Axis);
Finn Williamsb454c5c2021-02-09 15:56:23 +00001266 }
1267 }
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001268 }
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001269 };
1270
1271 const std::string layerName("gather");
Derek Lambertif90c56d2020-01-10 17:14:08 +00001272 armnn::TensorInfo paramsInfo({ 8 }, armnn::DataType::QAsymmU8);
1273 armnn::TensorInfo outputInfo({ 3 }, armnn::DataType::QAsymmU8);
Cathal Corbett5b8093c2021-10-22 11:12:07 +01001274 const armnn::TensorInfo indicesInfo({ 3 }, armnn::DataType::Signed32, 0.0f, 0, true);
Teresa Charlin52664732020-06-29 16:27:03 +01001275 GatherDescriptor descriptor;
1276 descriptor.m_Axis = 1;
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001277
1278 paramsInfo.SetQuantizationScale(1.0f);
1279 paramsInfo.SetQuantizationOffset(0);
1280 outputInfo.SetQuantizationScale(1.0f);
1281 outputInfo.SetQuantizationOffset(0);
1282
1283 const std::vector<int32_t>& indicesData = {7, 6, 5};
1284
1285 armnn::INetworkPtr network = armnn::INetwork::Create();
1286 armnn::IConnectableLayer *const inputLayer = network->AddInputLayer(0);
1287 armnn::IConnectableLayer *const constantLayer =
1288 network->AddConstantLayer(armnn::ConstTensor(indicesInfo, indicesData));
Teresa Charlin52664732020-06-29 16:27:03 +01001289 armnn::IConnectableLayer *const gatherLayer = network->AddGatherLayer(descriptor, layerName.c_str());
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001290 armnn::IConnectableLayer *const outputLayer = network->AddOutputLayer(0);
1291
1292 inputLayer->GetOutputSlot(0).Connect(gatherLayer->GetInputSlot(0));
1293 constantLayer->GetOutputSlot(0).Connect(gatherLayer->GetInputSlot(1));
1294 gatherLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1295
1296 inputLayer->GetOutputSlot(0).SetTensorInfo(paramsInfo);
1297 constantLayer->GetOutputSlot(0).SetTensorInfo(indicesInfo);
1298 gatherLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1299
1300 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001301 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001302
Teresa Charlin52664732020-06-29 16:27:03 +01001303 GatherLayerVerifier verifier(layerName, {paramsInfo, indicesInfo}, {outputInfo}, descriptor);
Finn Williamsb454c5c2021-02-09 15:56:23 +00001304 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001305}
1306
Teresa Charlin6966bfa2022-04-25 17:14:50 +01001307TEST_CASE("SerializeGatherNd")
1308{
1309 class GatherNdLayerVerifier : public LayerVerifierBase
1310 {
1311 public:
1312 GatherNdLayerVerifier(const std::string& layerName,
1313 const std::vector<armnn::TensorInfo>& inputInfos,
1314 const std::vector<armnn::TensorInfo>& outputInfos)
1315 : LayerVerifierBase(layerName, inputInfos, outputInfos) {}
1316
1317 void ExecuteStrategy(const armnn::IConnectableLayer* layer,
Mike Kelly51b8c312022-05-24 11:34:02 +01001318 const armnn::BaseDescriptor&,
Teresa Charlin6966bfa2022-04-25 17:14:50 +01001319 const std::vector<armnn::ConstTensor>& constants,
1320 const char* name,
1321 const armnn::LayerBindingId id = 0) override
1322 {
1323 armnn::IgnoreUnused(constants, id);
1324 switch (layer->GetType())
1325 {
1326 case armnn::LayerType::Input:
1327 case armnn::LayerType::Output:
1328 case armnn::LayerType::Constant:
1329 break;
1330 default:
1331 {
1332 VerifyNameAndConnections(layer, name);
1333 }
1334 }
1335 }
1336 };
1337
1338 const std::string layerName("gatherNd");
1339 armnn::TensorInfo paramsInfo({ 6, 3 }, armnn::DataType::QAsymmU8);
1340 armnn::TensorInfo outputInfo({ 3, 3 }, armnn::DataType::QAsymmU8);
1341 const armnn::TensorInfo indicesInfo({ 3, 1 }, armnn::DataType::Signed32, 0.0f, 0, true);
1342
1343 paramsInfo.SetQuantizationScale(1.0f);
1344 paramsInfo.SetQuantizationOffset(0);
1345 outputInfo.SetQuantizationScale(1.0f);
1346 outputInfo.SetQuantizationOffset(0);
1347
1348 const std::vector<int32_t>& indicesData = {5, 1, 0};
1349
1350 armnn::INetworkPtr network = armnn::INetwork::Create();
1351 armnn::IConnectableLayer *const inputLayer = network->AddInputLayer(0);
1352 armnn::IConnectableLayer *const constantLayer =
1353 network->AddConstantLayer(armnn::ConstTensor(indicesInfo, indicesData));
1354 armnn::IConnectableLayer *const gatherNdLayer = network->AddGatherNdLayer(layerName.c_str());
1355 armnn::IConnectableLayer *const outputLayer = network->AddOutputLayer(0);
1356
1357 inputLayer->GetOutputSlot(0).Connect(gatherNdLayer->GetInputSlot(0));
1358 constantLayer->GetOutputSlot(0).Connect(gatherNdLayer->GetInputSlot(1));
1359 gatherNdLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1360
1361 inputLayer->GetOutputSlot(0).SetTensorInfo(paramsInfo);
1362 constantLayer->GetOutputSlot(0).SetTensorInfo(indicesInfo);
1363 gatherNdLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1364
1365 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
1366 CHECK(deserializedNetwork);
1367
1368 GatherNdLayerVerifier verifier(layerName, {paramsInfo, indicesInfo}, {outputInfo});
1369 deserializedNetwork->ExecuteStrategy(verifier);
1370}
Aron Virginas-Tar6d2e6592019-10-22 11:44:47 +01001371
Jan Eilers1b2654f2021-09-24 15:45:46 +01001372TEST_CASE("SerializeComparisonGreater")
Aron Virginas-Tar781ced92019-10-03 11:15:39 +01001373{
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01001374 const std::string layerName("greater");
1375
1376 const armnn::TensorShape shape{2, 1, 2, 4};
1377
1378 const armnn::TensorInfo inputInfo = armnn::TensorInfo(shape, armnn::DataType::Float32);
1379 const armnn::TensorInfo outputInfo = armnn::TensorInfo(shape, armnn::DataType::Boolean);
1380
1381 armnn::INetworkPtr network = armnn::INetwork::Create();
1382 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
1383 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
Jan Eilers1b2654f2021-09-24 15:45:46 +01001384 armnn::ComparisonDescriptor greaterDescriptor(armnn::ComparisonOperation::Greater);
1385 armnn::IConnectableLayer* const equalLayer = network->AddComparisonLayer(greaterDescriptor, layerName.c_str());
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01001386 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1387
1388 inputLayer0->GetOutputSlot(0).Connect(equalLayer->GetInputSlot(0));
1389 inputLayer1->GetOutputSlot(0).Connect(equalLayer->GetInputSlot(1));
1390 equalLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1391
1392 inputLayer0->GetOutputSlot(0).SetTensorInfo(inputInfo);
1393 inputLayer1->GetOutputSlot(0).SetTensorInfo(inputInfo);
1394 equalLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1395
1396 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001397 CHECK(deserializedNetwork);
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01001398
Finn Williamsb454c5c2021-02-09 15:56:23 +00001399 LayerVerifierBase verifier(layerName, { inputInfo, inputInfo }, { outputInfo });
1400 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01001401}
1402
Aron Virginas-Tar6d2e6592019-10-22 11:44:47 +01001403
Sadik Armagan1625efc2021-06-10 18:24:34 +01001404TEST_CASE("SerializeInstanceNormalization")
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01001405{
Aron Virginas-Tar781ced92019-10-03 11:15:39 +01001406 const std::string layerName("instanceNormalization");
1407 const armnn::TensorInfo info({ 1, 2, 1, 5 }, armnn::DataType::Float32);
1408
1409 armnn::InstanceNormalizationDescriptor descriptor;
1410 descriptor.m_Gamma = 1.1f;
1411 descriptor.m_Beta = 0.1f;
1412 descriptor.m_Eps = 0.0001f;
1413 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
1414
1415 armnn::INetworkPtr network = armnn::INetwork::Create();
1416 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1417 armnn::IConnectableLayer* const instanceNormLayer =
1418 network->AddInstanceNormalizationLayer(descriptor, layerName.c_str());
1419 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1420
1421 inputLayer->GetOutputSlot(0).Connect(instanceNormLayer->GetInputSlot(0));
1422 instanceNormLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1423
1424 inputLayer->GetOutputSlot(0).SetTensorInfo(info);
1425 instanceNormLayer->GetOutputSlot(0).SetTensorInfo(info);
1426
1427 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001428 CHECK(deserializedNetwork);
Aron Virginas-Tar781ced92019-10-03 11:15:39 +01001429
Finn Williamsb454c5c2021-02-09 15:56:23 +00001430 LayerVerifierBaseWithDescriptor<armnn::InstanceNormalizationDescriptor> verifier(
1431 layerName, {info}, {info}, descriptor);
1432 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tar781ced92019-10-03 11:15:39 +01001433}
1434
Sadik Armagan1625efc2021-06-10 18:24:34 +01001435TEST_CASE("SerializeL2Normalization")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001436{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001437 const std::string l2NormLayerName("l2Normalization");
1438 const armnn::TensorInfo info({1, 2, 1, 5}, armnn::DataType::Float32);
1439
1440 armnn::L2NormalizationDescriptor desc;
1441 desc.m_DataLayout = armnn::DataLayout::NCHW;
Ferran Balaguer0dcffec2019-06-18 16:25:06 +01001442 desc.m_Eps = 0.0001f;
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001443
1444 armnn::INetworkPtr network = armnn::INetwork::Create();
1445 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
1446 armnn::IConnectableLayer* const l2NormLayer = network->AddL2NormalizationLayer(desc, l2NormLayerName.c_str());
1447 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1448
1449 inputLayer0->GetOutputSlot(0).Connect(l2NormLayer->GetInputSlot(0));
1450 l2NormLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1451
1452 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
1453 l2NormLayer->GetOutputSlot(0).SetTensorInfo(info);
1454
1455 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001456 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001457
Finn Williamsb454c5c2021-02-09 15:56:23 +00001458 LayerVerifierBaseWithDescriptor<armnn::L2NormalizationDescriptor> verifier(
1459 l2NormLayerName, {info}, {info}, desc);
1460 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001461}
1462
Sadik Armagan1625efc2021-06-10 18:24:34 +01001463TEST_CASE("EnsureL2NormalizationBackwardCompatibility")
Ferran Balaguer0dcffec2019-06-18 16:25:06 +01001464{
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001465 // The hex data below is a flat buffer containing a simple network with one input
Ferran Balaguer0dcffec2019-06-18 16:25:06 +01001466 // a L2Normalization layer and an output layer with dimensions as per the tensor infos below.
1467 //
1468 // This test verifies that we can still read back these old style
1469 // models without the normalization epsilon value.
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001470 const std::vector<uint8_t> l2NormalizationModel =
Ferran Balaguer0dcffec2019-06-18 16:25:06 +01001471 {
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001472 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x0A, 0x00,
1473 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
1474 0x3C, 0x01, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
1475 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xE8, 0xFE, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x0B,
1476 0x04, 0x00, 0x00, 0x00, 0xD6, 0xFE, 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x08, 0x00,
1477 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x9E, 0xFF, 0xFF, 0xFF, 0x02, 0x00, 0x00, 0x00,
1478 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00,
1479 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1480 0x4C, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
1481 0x00, 0x20, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00,
1482 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
1483 0x0E, 0x00, 0x18, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x14, 0x00, 0x0E, 0x00, 0x00, 0x00,
1484 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x20, 0x00,
1485 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x6C, 0x32, 0x4E, 0x6F, 0x72, 0x6D, 0x61, 0x6C, 0x69, 0x7A, 0x61, 0x74,
1486 0x69, 0x6F, 0x6E, 0x00, 0x01, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00,
1487 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
1488 0x52, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00,
1489 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
1490 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1491 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x07, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09,
1492 0x04, 0x00, 0x00, 0x00, 0xF6, 0xFF, 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0A, 0x00,
1493 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x00, 0x00,
1494 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00,
1495 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1496 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0A, 0x00, 0x00, 0x00,
1497 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x08, 0x00,
1498 0x07, 0x00, 0x0C, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
1499 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
1500 0x05, 0x00, 0x00, 0x00, 0x00
1501 };
1502
1503 armnn::INetworkPtr deserializedNetwork =
1504 DeserializeNetwork(std::string(l2NormalizationModel.begin(), l2NormalizationModel.end()));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001505 CHECK(deserializedNetwork);
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001506
Ferran Balaguer0dcffec2019-06-18 16:25:06 +01001507 const std::string layerName("l2Normalization");
1508 const armnn::TensorInfo inputInfo = armnn::TensorInfo({1, 2, 1, 5}, armnn::DataType::Float32);
1509
1510 armnn::L2NormalizationDescriptor desc;
1511 desc.m_DataLayout = armnn::DataLayout::NCHW;
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001512 // Since this variable does not exist in the l2NormalizationModel dump, the default value will be loaded
Ferran Balaguer0dcffec2019-06-18 16:25:06 +01001513 desc.m_Eps = 1e-12f;
1514
Finn Williamsb454c5c2021-02-09 15:56:23 +00001515 LayerVerifierBaseWithDescriptor<armnn::L2NormalizationDescriptor> verifier(
1516 layerName, {inputInfo}, {inputInfo}, desc);
1517 deserializedNetwork->ExecuteStrategy(verifier);
Ferran Balaguer0dcffec2019-06-18 16:25:06 +01001518}
1519
Sadik Armagan1625efc2021-06-10 18:24:34 +01001520TEST_CASE("SerializeLogicalBinary")
James Conroyaba90cd2020-11-06 16:28:18 +00001521{
James Conroyaba90cd2020-11-06 16:28:18 +00001522 const std::string layerName("logicalBinaryAnd");
1523
1524 const armnn::TensorShape shape{2, 1, 2, 2};
1525
1526 const armnn::TensorInfo inputInfo = armnn::TensorInfo(shape, armnn::DataType::Boolean);
1527 const armnn::TensorInfo outputInfo = armnn::TensorInfo(shape, armnn::DataType::Boolean);
1528
1529 armnn::LogicalBinaryDescriptor descriptor(armnn::LogicalBinaryOperation::LogicalAnd);
1530
1531 armnn::INetworkPtr network = armnn::INetwork::Create();
1532 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
1533 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
1534 armnn::IConnectableLayer* const logicalBinaryLayer = network->AddLogicalBinaryLayer(descriptor, layerName.c_str());
1535 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1536
1537 inputLayer0->GetOutputSlot(0).Connect(logicalBinaryLayer->GetInputSlot(0));
1538 inputLayer1->GetOutputSlot(0).Connect(logicalBinaryLayer->GetInputSlot(1));
1539 logicalBinaryLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1540
1541 inputLayer0->GetOutputSlot(0).SetTensorInfo(inputInfo);
1542 inputLayer1->GetOutputSlot(0).SetTensorInfo(inputInfo);
1543 logicalBinaryLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1544
1545 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001546 CHECK(deserializedNetwork);
James Conroyaba90cd2020-11-06 16:28:18 +00001547
Finn Williamsb454c5c2021-02-09 15:56:23 +00001548 LayerVerifierBaseWithDescriptor<armnn::LogicalBinaryDescriptor> verifier(
1549 layerName, { inputInfo, inputInfo }, { outputInfo }, descriptor);
1550 deserializedNetwork->ExecuteStrategy(verifier);
James Conroyaba90cd2020-11-06 16:28:18 +00001551}
1552
Sadik Armagan1625efc2021-06-10 18:24:34 +01001553TEST_CASE("SerializeLogSoftmax")
Sadik Armagan26257852019-10-14 13:00:47 +01001554{
Sadik Armagan26257852019-10-14 13:00:47 +01001555 const std::string layerName("log_softmax");
1556 const armnn::TensorInfo info({1, 10}, armnn::DataType::Float32);
1557
1558 armnn::LogSoftmaxDescriptor descriptor;
1559 descriptor.m_Beta = 1.0f;
1560 descriptor.m_Axis = -1;
1561
1562 armnn::INetworkPtr network = armnn::INetwork::Create();
1563 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1564 armnn::IConnectableLayer* const logSoftmaxLayer = network->AddLogSoftmaxLayer(descriptor, layerName.c_str());
1565 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1566
1567 inputLayer->GetOutputSlot(0).Connect(logSoftmaxLayer->GetInputSlot(0));
1568 logSoftmaxLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1569
1570 inputLayer->GetOutputSlot(0).SetTensorInfo(info);
1571 logSoftmaxLayer->GetOutputSlot(0).SetTensorInfo(info);
1572
1573 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001574 CHECK(deserializedNetwork);
Sadik Armagan26257852019-10-14 13:00:47 +01001575
Finn Williamsb454c5c2021-02-09 15:56:23 +00001576 LayerVerifierBaseWithDescriptor<armnn::LogSoftmaxDescriptor> verifier(layerName, {info}, {info}, descriptor);
1577 deserializedNetwork->ExecuteStrategy(verifier);
Sadik Armagan26257852019-10-14 13:00:47 +01001578}
1579
Sadik Armagan1625efc2021-06-10 18:24:34 +01001580TEST_CASE("SerializeMaximum")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001581{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001582 const std::string layerName("maximum");
1583 const armnn::TensorInfo info({ 1, 2, 2, 3 }, armnn::DataType::Float32);
1584
1585 armnn::INetworkPtr network = armnn::INetwork::Create();
1586 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
1587 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
1588 armnn::IConnectableLayer* const maximumLayer = network->AddMaximumLayer(layerName.c_str());
1589 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1590
1591 inputLayer0->GetOutputSlot(0).Connect(maximumLayer->GetInputSlot(0));
1592 inputLayer1->GetOutputSlot(0).Connect(maximumLayer->GetInputSlot(1));
1593 maximumLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1594
1595 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
1596 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
1597 maximumLayer->GetOutputSlot(0).SetTensorInfo(info);
1598
1599 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001600 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001601
Finn Williamsb454c5c2021-02-09 15:56:23 +00001602 LayerVerifierBase verifier(layerName, {info, info}, {info});
1603 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001604}
1605
Sadik Armagan1625efc2021-06-10 18:24:34 +01001606TEST_CASE("SerializeMean")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001607{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001608 const std::string layerName("mean");
1609 const armnn::TensorInfo inputInfo({1, 1, 3, 2}, armnn::DataType::Float32);
1610 const armnn::TensorInfo outputInfo({1, 1, 1, 2}, armnn::DataType::Float32);
1611
1612 armnn::MeanDescriptor descriptor;
1613 descriptor.m_Axis = { 2 };
1614 descriptor.m_KeepDims = true;
1615
1616 armnn::INetworkPtr network = armnn::INetwork::Create();
1617 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1618 armnn::IConnectableLayer* const meanLayer = network->AddMeanLayer(descriptor, layerName.c_str());
1619 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1620
1621 inputLayer->GetOutputSlot(0).Connect(meanLayer->GetInputSlot(0));
1622 meanLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1623
1624 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
1625 meanLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1626
1627 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001628 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001629
Finn Williamsb454c5c2021-02-09 15:56:23 +00001630 LayerVerifierBaseWithDescriptor<armnn::MeanDescriptor> verifier(layerName, {inputInfo}, {outputInfo}, descriptor);
1631 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001632}
1633
Sadik Armagan1625efc2021-06-10 18:24:34 +01001634TEST_CASE("SerializeMerge")
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +01001635{
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +01001636 const std::string layerName("merge");
1637 const armnn::TensorInfo info({ 1, 2, 2, 3 }, armnn::DataType::Float32);
1638
1639 armnn::INetworkPtr network = armnn::INetwork::Create();
1640 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
1641 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
1642 armnn::IConnectableLayer* const mergeLayer = network->AddMergeLayer(layerName.c_str());
1643 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1644
1645 inputLayer0->GetOutputSlot(0).Connect(mergeLayer->GetInputSlot(0));
1646 inputLayer1->GetOutputSlot(0).Connect(mergeLayer->GetInputSlot(1));
1647 mergeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1648
1649 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
1650 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
1651 mergeLayer->GetOutputSlot(0).SetTensorInfo(info);
1652
1653 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001654 CHECK(deserializedNetwork);
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +01001655
Finn Williamsb454c5c2021-02-09 15:56:23 +00001656 LayerVerifierBase verifier(layerName, {info, info}, {info});
1657 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +01001658}
1659
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01001660class MergerLayerVerifier : public LayerVerifierBaseWithDescriptor<armnn::OriginsDescriptor>
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001661{
Jim Flynn5fa83932019-05-09 15:35:43 +01001662public:
1663 MergerLayerVerifier(const std::string& layerName,
1664 const std::vector<armnn::TensorInfo>& inputInfos,
1665 const std::vector<armnn::TensorInfo>& outputInfos,
1666 const armnn::OriginsDescriptor& descriptor)
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01001667 : LayerVerifierBaseWithDescriptor<armnn::OriginsDescriptor>(layerName, inputInfos, outputInfos, descriptor) {}
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001668
Finn Williamsb454c5c2021-02-09 15:56:23 +00001669 void ExecuteStrategy(const armnn::IConnectableLayer* layer,
1670 const armnn::BaseDescriptor& descriptor,
1671 const std::vector<armnn::ConstTensor>& constants,
1672 const char* name,
1673 const armnn::LayerBindingId id = 0) override
Jim Flynn5fa83932019-05-09 15:35:43 +01001674 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001675 armnn::IgnoreUnused(descriptor, constants, id);
1676 switch (layer->GetType())
1677 {
1678 case armnn::LayerType::Input: break;
1679 case armnn::LayerType::Output: break;
1680 case armnn::LayerType::Merge:
1681 {
1682 throw armnn::Exception("MergerLayer should have translated to ConcatLayer");
1683 break;
1684 }
1685 case armnn::LayerType::Concat:
1686 {
1687 VerifyNameAndConnections(layer, name);
1688 const armnn::MergerDescriptor& layerDescriptor =
1689 static_cast<const armnn::MergerDescriptor&>(descriptor);
1690 VerifyDescriptor(layerDescriptor);
1691 break;
1692 }
1693 default:
1694 {
1695 throw armnn::Exception("Unexpected layer type in Merge test model");
1696 }
1697 }
Jim Flynn5fa83932019-05-09 15:35:43 +01001698 }
Jim Flynn5fa83932019-05-09 15:35:43 +01001699};
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001700
Sadik Armagan1625efc2021-06-10 18:24:34 +01001701TEST_CASE("EnsureMergerLayerBackwardCompatibility")
Jim Flynn5fa83932019-05-09 15:35:43 +01001702{
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001703 // The hex data below is a flat buffer containing a simple network with two inputs
Jim Flynne242f2d2019-05-22 14:24:13 +01001704 // a merger layer (now deprecated) and an output layer with dimensions as per the tensor infos below.
1705 //
1706 // This test verifies that we can still read back these old style
Jim Flynn5fa83932019-05-09 15:35:43 +01001707 // models replacing the MergerLayers with ConcatLayers with the same parameters.
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001708 const std::vector<uint8_t> mergerModel =
Jim Flynn5fa83932019-05-09 15:35:43 +01001709 {
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001710 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x0A, 0x00,
1711 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
1712 0x38, 0x02, 0x00, 0x00, 0x8C, 0x01, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x02, 0x00,
1713 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
1714 0xF4, 0xFD, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x0B, 0x04, 0x00, 0x00, 0x00, 0x92, 0xFE, 0xFF, 0xFF, 0x04, 0x00,
1715 0x00, 0x00, 0x9A, 0xFE, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x7E, 0xFE, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00,
1716 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00,
1717 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1718 0xF8, 0xFE, 0xFF, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0xFE, 0xFF, 0xFF, 0x00, 0x00,
1719 0x00, 0x1F, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00,
1720 0x68, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00,
1721 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
1722 0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x22, 0xFF, 0xFF, 0xFF, 0x04, 0x00,
1723 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1724 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
1725 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFF, 0xFF, 0xFF,
1726 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x1C, 0x00,
1727 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x6D, 0x65, 0x72, 0x67, 0x65, 0x72, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
1728 0x5C, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x34, 0xFF,
1729 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x92, 0xFE, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00,
1730 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00,
1731 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00,
1732 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00,
1733 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0E, 0x00,
1734 0x07, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00,
1735 0x06, 0x00, 0x08, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0E, 0x00,
1736 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
1737 0x0E, 0x00, 0x18, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x14, 0x00, 0x0E, 0x00, 0x00, 0x00,
1738 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00,
1739 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
1740 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00,
1741 0x00, 0x00, 0x66, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1742 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00,
1743 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x07, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09,
1744 0x04, 0x00, 0x00, 0x00, 0xF6, 0xFF, 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0A, 0x00,
1745 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x00, 0x00,
1746 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00,
1747 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1748 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0A, 0x00, 0x00, 0x00,
1749 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x08, 0x00,
1750 0x07, 0x00, 0x0C, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
1751 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
1752 0x02, 0x00, 0x00, 0x00
1753 };
1754
1755 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(std::string(mergerModel.begin(), mergerModel.end()));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001756 CHECK(deserializedNetwork);
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001757
1758 const armnn::TensorInfo inputInfo = armnn::TensorInfo({ 2, 3, 2, 2 }, armnn::DataType::Float32);
1759 const armnn::TensorInfo outputInfo = armnn::TensorInfo({ 4, 3, 2, 2 }, armnn::DataType::Float32);
Jim Flynn5fa83932019-05-09 15:35:43 +01001760
1761 const std::vector<armnn::TensorShape> shapes({inputInfo.GetShape(), inputInfo.GetShape()});
1762
1763 armnn::OriginsDescriptor descriptor =
Jim Flynn825af452019-05-20 12:49:28 +01001764 armnn::CreateDescriptorForConcatenation(shapes.begin(), shapes.end(), 0);
Jim Flynn5fa83932019-05-09 15:35:43 +01001765
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001766 MergerLayerVerifier verifier("merger", { inputInfo, inputInfo }, { outputInfo }, descriptor);
Finn Williamsb454c5c2021-02-09 15:56:23 +00001767 deserializedNetwork->ExecuteStrategy(verifier);
Jim Flynn5fa83932019-05-09 15:35:43 +01001768}
1769
Sadik Armagan1625efc2021-06-10 18:24:34 +01001770TEST_CASE("SerializeConcat")
Jim Flynne242f2d2019-05-22 14:24:13 +01001771{
1772 const std::string layerName("concat");
1773 const armnn::TensorInfo inputInfo = armnn::TensorInfo({2, 3, 2, 2}, armnn::DataType::Float32);
1774 const armnn::TensorInfo outputInfo = armnn::TensorInfo({4, 3, 2, 2}, armnn::DataType::Float32);
1775
1776 const std::vector<armnn::TensorShape> shapes({inputInfo.GetShape(), inputInfo.GetShape()});
1777
1778 armnn::OriginsDescriptor descriptor =
1779 armnn::CreateDescriptorForConcatenation(shapes.begin(), shapes.end(), 0);
1780
1781 armnn::INetworkPtr network = armnn::INetwork::Create();
1782 armnn::IConnectableLayer* const inputLayerOne = network->AddInputLayer(0);
1783 armnn::IConnectableLayer* const inputLayerTwo = network->AddInputLayer(1);
1784 armnn::IConnectableLayer* const concatLayer = network->AddConcatLayer(descriptor, layerName.c_str());
1785 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1786
1787 inputLayerOne->GetOutputSlot(0).Connect(concatLayer->GetInputSlot(0));
1788 inputLayerTwo->GetOutputSlot(0).Connect(concatLayer->GetInputSlot(1));
1789 concatLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1790
1791 inputLayerOne->GetOutputSlot(0).SetTensorInfo(inputInfo);
1792 inputLayerTwo->GetOutputSlot(0).SetTensorInfo(inputInfo);
1793 concatLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1794
1795 std::string concatLayerNetwork = SerializeNetwork(*network);
1796 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(concatLayerNetwork);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001797 CHECK(deserializedNetwork);
Jim Flynne242f2d2019-05-22 14:24:13 +01001798
1799 // NOTE: using the MergerLayerVerifier to ensure that it is a concat layer and not a
1800 // merger layer that gets placed into the graph.
1801 MergerLayerVerifier verifier(layerName, {inputInfo, inputInfo}, {outputInfo}, descriptor);
Finn Williamsb454c5c2021-02-09 15:56:23 +00001802 deserializedNetwork->ExecuteStrategy(verifier);
Jim Flynne242f2d2019-05-22 14:24:13 +01001803}
1804
Sadik Armagan1625efc2021-06-10 18:24:34 +01001805TEST_CASE("SerializeMinimum")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001806{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001807 const std::string layerName("minimum");
1808 const armnn::TensorInfo info({ 1, 2, 2, 3 }, armnn::DataType::Float32);
1809
1810 armnn::INetworkPtr network = armnn::INetwork::Create();
1811 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
1812 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
1813 armnn::IConnectableLayer* const minimumLayer = network->AddMinimumLayer(layerName.c_str());
1814 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1815
1816 inputLayer0->GetOutputSlot(0).Connect(minimumLayer->GetInputSlot(0));
1817 inputLayer1->GetOutputSlot(0).Connect(minimumLayer->GetInputSlot(1));
1818 minimumLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1819
1820 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
1821 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
1822 minimumLayer->GetOutputSlot(0).SetTensorInfo(info);
1823
1824 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001825 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001826
Finn Williamsb454c5c2021-02-09 15:56:23 +00001827 LayerVerifierBase verifier(layerName, {info, info}, {info});
1828 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001829}
1830
Sadik Armagan1625efc2021-06-10 18:24:34 +01001831TEST_CASE("SerializeMultiplication")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001832{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001833 const std::string layerName("multiplication");
1834 const armnn::TensorInfo info({ 1, 5, 2, 3 }, armnn::DataType::Float32);
1835
1836 armnn::INetworkPtr network = armnn::INetwork::Create();
1837 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
1838 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
1839 armnn::IConnectableLayer* const multiplicationLayer = network->AddMultiplicationLayer(layerName.c_str());
1840 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1841
1842 inputLayer0->GetOutputSlot(0).Connect(multiplicationLayer->GetInputSlot(0));
1843 inputLayer1->GetOutputSlot(0).Connect(multiplicationLayer->GetInputSlot(1));
1844 multiplicationLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1845
1846 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
1847 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
1848 multiplicationLayer->GetOutputSlot(0).SetTensorInfo(info);
1849
1850 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001851 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001852
Finn Williamsb454c5c2021-02-09 15:56:23 +00001853 LayerVerifierBase verifier(layerName, {info, info}, {info});
1854 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001855}
1856
Sadik Armagan1625efc2021-06-10 18:24:34 +01001857TEST_CASE("SerializePrelu")
Ellen Norris-Thompson51982472019-06-19 11:46:21 +01001858{
Ellen Norris-Thompson51982472019-06-19 11:46:21 +01001859 const std::string layerName("prelu");
1860
1861 armnn::TensorInfo inputTensorInfo ({ 4, 1, 2 }, armnn::DataType::Float32);
1862 armnn::TensorInfo alphaTensorInfo ({ 5, 4, 3, 1 }, armnn::DataType::Float32);
1863 armnn::TensorInfo outputTensorInfo({ 5, 4, 3, 2 }, armnn::DataType::Float32);
1864
1865 armnn::INetworkPtr network = armnn::INetwork::Create();
1866 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1867 armnn::IConnectableLayer* const alphaLayer = network->AddInputLayer(1);
1868 armnn::IConnectableLayer* const preluLayer = network->AddPreluLayer(layerName.c_str());
1869 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1870
1871 inputLayer->GetOutputSlot(0).Connect(preluLayer->GetInputSlot(0));
1872 alphaLayer->GetOutputSlot(0).Connect(preluLayer->GetInputSlot(1));
1873 preluLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1874
1875 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
1876 alphaLayer->GetOutputSlot(0).SetTensorInfo(alphaTensorInfo);
1877 preluLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
1878
1879 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001880 CHECK(deserializedNetwork);
Ellen Norris-Thompson51982472019-06-19 11:46:21 +01001881
Finn Williamsb454c5c2021-02-09 15:56:23 +00001882 LayerVerifierBase verifier(layerName, {inputTensorInfo, alphaTensorInfo}, {outputTensorInfo});
1883 deserializedNetwork->ExecuteStrategy(verifier);
Ellen Norris-Thompson51982472019-06-19 11:46:21 +01001884}
1885
Sadik Armagan1625efc2021-06-10 18:24:34 +01001886TEST_CASE("SerializeNormalization")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001887{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001888 const std::string layerName("normalization");
1889 const armnn::TensorInfo info({2, 1, 2, 2}, armnn::DataType::Float32);
1890
1891 armnn::NormalizationDescriptor desc;
1892 desc.m_DataLayout = armnn::DataLayout::NCHW;
1893 desc.m_NormSize = 3;
1894 desc.m_Alpha = 1;
1895 desc.m_Beta = 1;
1896 desc.m_K = 1;
1897
1898 armnn::INetworkPtr network = armnn::INetwork::Create();
1899 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1900 armnn::IConnectableLayer* const normalizationLayer = network->AddNormalizationLayer(desc, layerName.c_str());
1901 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1902
1903 inputLayer->GetOutputSlot(0).Connect(normalizationLayer->GetInputSlot(0));
1904 normalizationLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1905
1906 inputLayer->GetOutputSlot(0).SetTensorInfo(info);
1907 normalizationLayer->GetOutputSlot(0).SetTensorInfo(info);
1908
1909 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001910 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001911
Finn Williamsb454c5c2021-02-09 15:56:23 +00001912 LayerVerifierBaseWithDescriptor<armnn::NormalizationDescriptor> verifier(layerName, {info}, {info}, desc);
1913 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001914}
1915
Sadik Armagan1625efc2021-06-10 18:24:34 +01001916TEST_CASE("SerializePad")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001917{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001918 const std::string layerName("pad");
1919 const armnn::TensorInfo inputTensorInfo = armnn::TensorInfo({1, 2, 3, 4}, armnn::DataType::Float32);
1920 const armnn::TensorInfo outputTensorInfo = armnn::TensorInfo({1, 3, 5, 7}, armnn::DataType::Float32);
1921
1922 armnn::PadDescriptor desc({{0, 0}, {1, 0}, {1, 1}, {1, 2}});
1923
1924 armnn::INetworkPtr network = armnn::INetwork::Create();
1925 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1926 armnn::IConnectableLayer* const padLayer = network->AddPadLayer(desc, layerName.c_str());
1927 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1928
1929 inputLayer->GetOutputSlot(0).Connect(padLayer->GetInputSlot(0));
1930 padLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1931
1932 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
1933 padLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
1934
1935 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001936 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001937
Finn Williamsb454c5c2021-02-09 15:56:23 +00001938 LayerVerifierBaseWithDescriptor<armnn::PadDescriptor> verifier(layerName,
1939 {inputTensorInfo},
1940 {outputTensorInfo},
1941 desc);
1942 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001943}
1944
Matthew Sloyan2e5d0b22021-10-21 14:05:31 +01001945TEST_CASE("SerializePadReflect")
1946{
1947 const std::string layerName("padReflect");
1948 const armnn::TensorInfo inputTensorInfo = armnn::TensorInfo({1, 2, 3, 4}, armnn::DataType::Float32);
1949 const armnn::TensorInfo outputTensorInfo = armnn::TensorInfo({1, 3, 5, 7}, armnn::DataType::Float32);
1950
1951 armnn::PadDescriptor desc({{0, 0}, {1, 0}, {1, 1}, {1, 2}});
1952 desc.m_PaddingMode = armnn::PaddingMode::Reflect;
1953
1954 armnn::INetworkPtr network = armnn::INetwork::Create();
1955 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1956 armnn::IConnectableLayer* const padLayer = network->AddPadLayer(desc, layerName.c_str());
1957 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1958
1959 inputLayer->GetOutputSlot(0).Connect(padLayer->GetInputSlot(0));
1960 padLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1961
1962 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
1963 padLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
1964
1965 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
1966 CHECK(deserializedNetwork);
1967
1968 LayerVerifierBaseWithDescriptor<armnn::PadDescriptor> verifier(layerName,
1969 {inputTensorInfo},
1970 {outputTensorInfo},
1971 desc);
1972 deserializedNetwork->ExecuteStrategy(verifier);
1973}
1974
Sadik Armagan1625efc2021-06-10 18:24:34 +01001975TEST_CASE("EnsurePadBackwardCompatibility")
Jim Flynn965c7c62019-06-24 14:32:41 +01001976{
1977 // The PadDescriptor is being extended with a float PadValue (so a value other than 0
1978 // can be used to pad the tensor.
1979 //
1980 // This test contains a binary representation of a simple input->pad->output network
1981 // prior to this change to test that the descriptor has been updated in a backward
1982 // compatible way with respect to Deserialization of older binary dumps
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001983 const std::vector<uint8_t> padModel =
Jim Flynn965c7c62019-06-24 14:32:41 +01001984 {
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001985 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x0A, 0x00,
1986 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
1987 0x54, 0x01, 0x00, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
1988 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xD0, 0xFE, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x0B,
1989 0x04, 0x00, 0x00, 0x00, 0x96, 0xFF, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x9E, 0xFF, 0xFF, 0xFF, 0x04, 0x00,
1990 0x00, 0x00, 0x72, 0xFF, 0xFF, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
1991 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
1992 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00,
1993 0x00, 0x00, 0x00, 0x00, 0x24, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x16, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00,
1994 0x0E, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00,
1995 0x00, 0x00, 0x06, 0x00, 0x08, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00,
1996 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1997 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
1998 0x0E, 0x00, 0x18, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x14, 0x00, 0x0E, 0x00, 0x00, 0x00,
1999 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00,
2000 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x70, 0x61, 0x64, 0x00, 0x01, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00,
2001 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00,
2002 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x52, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00,
2003 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00,
2004 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00,
2005 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x07, 0x00, 0x08, 0x00, 0x08, 0x00,
2006 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xF6, 0xFF, 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x00,
2007 0x00, 0x00, 0x06, 0x00, 0x0A, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00,
2008 0x0E, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x0E, 0x00, 0x00, 0x00,
2009 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
2010 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00,
2011 0x08, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
2012 0x0A, 0x00, 0x10, 0x00, 0x08, 0x00, 0x07, 0x00, 0x0C, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
2013 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00,
2014 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00
2015 };
2016
2017 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(std::string(padModel.begin(), padModel.end()));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002018 CHECK(deserializedNetwork);
Jim Flynn965c7c62019-06-24 14:32:41 +01002019
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01002020 const armnn::TensorInfo inputInfo = armnn::TensorInfo({ 1, 2, 3, 4 }, armnn::DataType::Float32);
2021 const armnn::TensorInfo outputInfo = armnn::TensorInfo({ 1, 3, 5, 7 }, armnn::DataType::Float32);
Jim Flynn965c7c62019-06-24 14:32:41 +01002022
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01002023 armnn::PadDescriptor descriptor({{ 0, 0 }, { 1, 0 }, { 1, 1 }, { 1, 2 }});
Jim Flynn965c7c62019-06-24 14:32:41 +01002024
Finn Williamsb454c5c2021-02-09 15:56:23 +00002025 LayerVerifierBaseWithDescriptor<armnn::PadDescriptor> verifier("pad", { inputInfo }, { outputInfo }, descriptor);
2026 deserializedNetwork->ExecuteStrategy(verifier);
Jim Flynn965c7c62019-06-24 14:32:41 +01002027}
2028
Sadik Armagan1625efc2021-06-10 18:24:34 +01002029TEST_CASE("SerializePermute")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002030{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002031 const std::string layerName("permute");
2032 const armnn::TensorInfo inputTensorInfo({4, 3, 2, 1}, armnn::DataType::Float32);
2033 const armnn::TensorInfo outputTensorInfo({1, 2, 3, 4}, armnn::DataType::Float32);
2034
2035 armnn::PermuteDescriptor descriptor(armnn::PermutationVector({3, 2, 1, 0}));
2036
2037 armnn::INetworkPtr network = armnn::INetwork::Create();
2038 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2039 armnn::IConnectableLayer* const permuteLayer = network->AddPermuteLayer(descriptor, layerName.c_str());
2040 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2041
2042 inputLayer->GetOutputSlot(0).Connect(permuteLayer->GetInputSlot(0));
2043 permuteLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2044
2045 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
2046 permuteLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
2047
2048 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002049 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002050
Finn Williamsb454c5c2021-02-09 15:56:23 +00002051 LayerVerifierBaseWithDescriptor<armnn::PermuteDescriptor> verifier(
2052 layerName, {inputTensorInfo}, {outputTensorInfo}, descriptor);
2053 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002054}
2055
Sadik Armagan1625efc2021-06-10 18:24:34 +01002056TEST_CASE("SerializePooling2d")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002057{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002058 const std::string layerName("pooling2d");
2059 const armnn::TensorInfo inputInfo({1, 2, 2, 1}, armnn::DataType::Float32);
2060 const armnn::TensorInfo outputInfo({1, 1, 1, 1}, armnn::DataType::Float32);
2061
2062 armnn::Pooling2dDescriptor desc;
2063 desc.m_DataLayout = armnn::DataLayout::NHWC;
2064 desc.m_PadTop = 0;
2065 desc.m_PadBottom = 0;
2066 desc.m_PadLeft = 0;
2067 desc.m_PadRight = 0;
2068 desc.m_PoolType = armnn::PoolingAlgorithm::Average;
2069 desc.m_OutputShapeRounding = armnn::OutputShapeRounding::Floor;
2070 desc.m_PaddingMethod = armnn::PaddingMethod::Exclude;
2071 desc.m_PoolHeight = 2;
2072 desc.m_PoolWidth = 2;
2073 desc.m_StrideX = 2;
2074 desc.m_StrideY = 2;
2075
2076 armnn::INetworkPtr network = armnn::INetwork::Create();
2077 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2078 armnn::IConnectableLayer* const pooling2dLayer = network->AddPooling2dLayer(desc, layerName.c_str());
2079 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2080
2081 inputLayer->GetOutputSlot(0).Connect(pooling2dLayer->GetInputSlot(0));
2082 pooling2dLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2083
2084 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2085 pooling2dLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2086
2087 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002088 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002089
Finn Williamsb454c5c2021-02-09 15:56:23 +00002090 LayerVerifierBaseWithDescriptor<armnn::Pooling2dDescriptor> verifier(
2091 layerName, {inputInfo}, {outputInfo}, desc);
2092 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002093}
2094
Tamas Nyirid998a1c2021-11-05 14:55:33 +00002095TEST_CASE("SerializePooling3d")
2096{
2097 const std::string layerName("pooling3d");
2098 const armnn::TensorInfo inputInfo({1, 1, 2, 2, 2}, armnn::DataType::Float32);
2099 const armnn::TensorInfo outputInfo({1, 1, 1, 1, 1}, armnn::DataType::Float32);
2100
2101 armnn::Pooling3dDescriptor desc;
2102 desc.m_DataLayout = armnn::DataLayout::NDHWC;
2103 desc.m_PadFront = 0;
2104 desc.m_PadBack = 0;
2105 desc.m_PadTop = 0;
2106 desc.m_PadBottom = 0;
2107 desc.m_PadLeft = 0;
2108 desc.m_PadRight = 0;
2109 desc.m_PoolType = armnn::PoolingAlgorithm::Average;
2110 desc.m_OutputShapeRounding = armnn::OutputShapeRounding::Floor;
2111 desc.m_PaddingMethod = armnn::PaddingMethod::Exclude;
2112 desc.m_PoolHeight = 2;
2113 desc.m_PoolWidth = 2;
2114 desc.m_PoolDepth = 2;
2115 desc.m_StrideX = 2;
2116 desc.m_StrideY = 2;
2117 desc.m_StrideZ = 2;
2118
2119 armnn::INetworkPtr network = armnn::INetwork::Create();
2120 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2121 armnn::IConnectableLayer* const pooling3dLayer = network->AddPooling3dLayer(desc, layerName.c_str());
2122 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2123
2124 inputLayer->GetOutputSlot(0).Connect(pooling3dLayer->GetInputSlot(0));
2125 pooling3dLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2126
2127 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2128 pooling3dLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2129
2130 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
2131 CHECK(deserializedNetwork);
2132
2133 LayerVerifierBaseWithDescriptor<armnn::Pooling3dDescriptor> verifier(
2134 layerName, {inputInfo}, {outputInfo}, desc);
2135 deserializedNetwork->ExecuteStrategy(verifier);
2136}
2137
Sadik Armagan1625efc2021-06-10 18:24:34 +01002138TEST_CASE("SerializeQuantize")
Derek Lamberti87acb272019-03-27 16:51:31 +00002139{
Derek Lamberti87acb272019-03-27 16:51:31 +00002140 const std::string layerName("quantize");
2141 const armnn::TensorInfo info({ 1, 2, 2, 3 }, armnn::DataType::Float32);
2142
2143 armnn::INetworkPtr network = armnn::INetwork::Create();
2144 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2145 armnn::IConnectableLayer* const quantizeLayer = network->AddQuantizeLayer(layerName.c_str());
2146 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2147
2148 inputLayer->GetOutputSlot(0).Connect(quantizeLayer->GetInputSlot(0));
2149 quantizeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2150
2151 inputLayer->GetOutputSlot(0).SetTensorInfo(info);
2152 quantizeLayer->GetOutputSlot(0).SetTensorInfo(info);
2153
2154 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002155 CHECK(deserializedNetwork);
Derek Lamberti87acb272019-03-27 16:51:31 +00002156
Finn Williamsb454c5c2021-02-09 15:56:23 +00002157 LayerVerifierBase verifier(layerName, {info}, {info});
2158 deserializedNetwork->ExecuteStrategy(verifier);
Derek Lamberti87acb272019-03-27 16:51:31 +00002159}
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01002160
Sadik Armagan1625efc2021-06-10 18:24:34 +01002161TEST_CASE("SerializeRank")
Finn Williams2605b232020-06-10 15:53:46 +01002162{
Finn Williams2605b232020-06-10 15:53:46 +01002163 const std::string layerName("rank");
2164 const armnn::TensorInfo inputInfo({1, 9}, armnn::DataType::Float32);
2165 const armnn::TensorInfo outputInfo({1}, armnn::DataType::Signed32);
2166
2167 armnn::INetworkPtr network = armnn::INetwork::Create();
2168 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2169 armnn::IConnectableLayer* const rankLayer = network->AddRankLayer(layerName.c_str());
2170 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2171
2172 inputLayer->GetOutputSlot(0).Connect(rankLayer->GetInputSlot(0));
2173 rankLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2174
2175 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2176 rankLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2177
2178 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002179 CHECK(deserializedNetwork);
Finn Williams2605b232020-06-10 15:53:46 +01002180
Finn Williamsb454c5c2021-02-09 15:56:23 +00002181 LayerVerifierBase verifier(layerName, {inputInfo}, {outputInfo});
2182 deserializedNetwork->ExecuteStrategy(verifier);
Finn Williams2605b232020-06-10 15:53:46 +01002183}
2184
Sadik Armagan1625efc2021-06-10 18:24:34 +01002185TEST_CASE("SerializeReduceSum")
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +00002186{
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +00002187 const std::string layerName("Reduce_Sum");
2188 const armnn::TensorInfo inputInfo({1, 1, 3, 2}, armnn::DataType::Float32);
2189 const armnn::TensorInfo outputInfo({1, 1, 1, 2}, armnn::DataType::Float32);
2190
2191 armnn::ReduceDescriptor descriptor;
2192 descriptor.m_vAxis = { 2 };
2193 descriptor.m_ReduceOperation = armnn::ReduceOperation::Sum;
2194
2195 armnn::INetworkPtr network = armnn::INetwork::Create();
2196 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2197 armnn::IConnectableLayer* const reduceSumLayer = network->AddReduceLayer(descriptor, layerName.c_str());
2198 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2199
2200 inputLayer->GetOutputSlot(0).Connect(reduceSumLayer->GetInputSlot(0));
2201 reduceSumLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2202
2203 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2204 reduceSumLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2205
2206 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002207 CHECK(deserializedNetwork);
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +00002208
Finn Williamsb454c5c2021-02-09 15:56:23 +00002209 LayerVerifierBaseWithDescriptor<armnn::ReduceDescriptor> verifier(layerName, {inputInfo}, {outputInfo}, descriptor);
2210 deserializedNetwork->ExecuteStrategy(verifier);
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +00002211}
2212
Sadik Armagan1625efc2021-06-10 18:24:34 +01002213TEST_CASE("SerializeReshape")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002214{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002215 const std::string layerName("reshape");
2216 const armnn::TensorInfo inputInfo({1, 9}, armnn::DataType::Float32);
2217 const armnn::TensorInfo outputInfo({3, 3}, armnn::DataType::Float32);
2218
2219 armnn::ReshapeDescriptor descriptor({3, 3});
2220
2221 armnn::INetworkPtr network = armnn::INetwork::Create();
2222 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2223 armnn::IConnectableLayer* const reshapeLayer = network->AddReshapeLayer(descriptor, layerName.c_str());
2224 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2225
2226 inputLayer->GetOutputSlot(0).Connect(reshapeLayer->GetInputSlot(0));
2227 reshapeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2228
2229 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2230 reshapeLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2231
2232 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002233 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002234
Finn Williamsb454c5c2021-02-09 15:56:23 +00002235 LayerVerifierBaseWithDescriptor<armnn::ReshapeDescriptor> verifier(
2236 layerName, {inputInfo}, {outputInfo}, descriptor);
2237 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002238}
2239
Sadik Armagan1625efc2021-06-10 18:24:34 +01002240TEST_CASE("SerializeResize")
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01002241{
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01002242 const std::string layerName("resize");
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002243 const armnn::TensorInfo inputInfo = armnn::TensorInfo({1, 3, 5, 5}, armnn::DataType::Float32);
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01002244 const armnn::TensorInfo outputInfo = armnn::TensorInfo({1, 3, 2, 4}, armnn::DataType::Float32);
2245
2246 armnn::ResizeDescriptor desc;
Aron Virginas-Tar169d2f12019-07-01 19:01:44 +01002247 desc.m_TargetWidth = 4;
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01002248 desc.m_TargetHeight = 2;
Aron Virginas-Tar169d2f12019-07-01 19:01:44 +01002249 desc.m_Method = armnn::ResizeMethod::NearestNeighbor;
David Monahan4a0c9b92020-05-30 09:48:39 +01002250 desc.m_AlignCorners = true;
2251 desc.m_HalfPixelCenters = true;
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01002252
2253 armnn::INetworkPtr network = armnn::INetwork::Create();
2254 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2255 armnn::IConnectableLayer* const resizeLayer = network->AddResizeLayer(desc, layerName.c_str());
2256 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2257
2258 inputLayer->GetOutputSlot(0).Connect(resizeLayer->GetInputSlot(0));
2259 resizeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2260
2261 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2262 resizeLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2263
2264 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002265 CHECK(deserializedNetwork);
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01002266
Finn Williamsb454c5c2021-02-09 15:56:23 +00002267 LayerVerifierBaseWithDescriptor<armnn::ResizeDescriptor> verifier(layerName, {inputInfo}, {outputInfo}, desc);
2268 deserializedNetwork->ExecuteStrategy(verifier);
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01002269}
2270
Jan Eilers1b2654f2021-09-24 15:45:46 +01002271class ResizeBilinearLayerVerifier : public LayerVerifierBaseWithDescriptor<armnn::ResizeDescriptor>
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002272{
2273public:
2274 ResizeBilinearLayerVerifier(const std::string& layerName,
2275 const std::vector<armnn::TensorInfo>& inputInfos,
2276 const std::vector<armnn::TensorInfo>& outputInfos,
Jan Eilers1b2654f2021-09-24 15:45:46 +01002277 const armnn::ResizeDescriptor& descriptor)
2278 : LayerVerifierBaseWithDescriptor<armnn::ResizeDescriptor>(
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002279 layerName, inputInfos, outputInfos, descriptor) {}
2280
Finn Williamsb454c5c2021-02-09 15:56:23 +00002281 void ExecuteStrategy(const armnn::IConnectableLayer* layer,
2282 const armnn::BaseDescriptor& descriptor,
2283 const std::vector<armnn::ConstTensor>& constants,
2284 const char* name,
2285 const armnn::LayerBindingId id = 0) override
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002286 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00002287 armnn::IgnoreUnused(descriptor, constants, id);
2288 switch (layer->GetType())
2289 {
2290 case armnn::LayerType::Input: break;
2291 case armnn::LayerType::Output: break;
2292 case armnn::LayerType::Resize:
2293 {
2294 VerifyNameAndConnections(layer, name);
2295 const armnn::ResizeDescriptor& layerDescriptor =
2296 static_cast<const armnn::ResizeDescriptor&>(descriptor);
Sadik Armagan1625efc2021-06-10 18:24:34 +01002297 CHECK(layerDescriptor.m_Method == armnn::ResizeMethod::Bilinear);
2298 CHECK(layerDescriptor.m_TargetWidth == m_Descriptor.m_TargetWidth);
2299 CHECK(layerDescriptor.m_TargetHeight == m_Descriptor.m_TargetHeight);
2300 CHECK(layerDescriptor.m_DataLayout == m_Descriptor.m_DataLayout);
2301 CHECK(layerDescriptor.m_AlignCorners == m_Descriptor.m_AlignCorners);
2302 CHECK(layerDescriptor.m_HalfPixelCenters == m_Descriptor.m_HalfPixelCenters);
Finn Williamsb454c5c2021-02-09 15:56:23 +00002303 break;
2304 }
2305 default:
2306 {
2307 throw armnn::Exception("Unexpected layer type in test model. ResizeBiliniar "
2308 "should have translated to Resize");
2309 }
2310 }
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002311 }
2312};
2313
Sadik Armagan1625efc2021-06-10 18:24:34 +01002314TEST_CASE("SerializeResizeBilinear")
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002315{
2316 const std::string layerName("resizeBilinear");
2317 const armnn::TensorInfo inputInfo = armnn::TensorInfo({1, 3, 5, 5}, armnn::DataType::Float32);
2318 const armnn::TensorInfo outputInfo = armnn::TensorInfo({1, 3, 2, 4}, armnn::DataType::Float32);
2319
Jan Eilers1b2654f2021-09-24 15:45:46 +01002320 armnn::ResizeDescriptor desc;
2321 desc.m_Method = armnn::ResizeMethod::Bilinear;
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002322 desc.m_TargetWidth = 4u;
2323 desc.m_TargetHeight = 2u;
David Monahan4a0c9b92020-05-30 09:48:39 +01002324 desc.m_AlignCorners = true;
2325 desc.m_HalfPixelCenters = true;
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002326
2327 armnn::INetworkPtr network = armnn::INetwork::Create();
2328 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
Jan Eilers1b2654f2021-09-24 15:45:46 +01002329 armnn::IConnectableLayer* const resizeLayer = network->AddResizeLayer(desc, layerName.c_str());
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002330 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2331
2332 inputLayer->GetOutputSlot(0).Connect(resizeLayer->GetInputSlot(0));
2333 resizeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2334
2335 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2336 resizeLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2337
2338 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002339 CHECK(deserializedNetwork);
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002340
2341 ResizeBilinearLayerVerifier verifier(layerName, {inputInfo}, {outputInfo}, desc);
Finn Williamsb454c5c2021-02-09 15:56:23 +00002342 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002343}
2344
Sadik Armagan1625efc2021-06-10 18:24:34 +01002345TEST_CASE("EnsureResizeBilinearBackwardCompatibility")
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002346{
2347 // The hex data below is a flat buffer containing a simple network with an input,
Jan Eilers1b2654f2021-09-24 15:45:46 +01002348 // a ResizeBilinearLayer (now deprecated and removed) and an output
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002349 //
2350 // This test verifies that we can still deserialize this old-style model by replacing
2351 // the ResizeBilinearLayer with an equivalent ResizeLayer
2352 const std::vector<uint8_t> resizeBilinearModel =
2353 {
2354 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x0A, 0x00,
2355 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
2356 0x50, 0x01, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
2357 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xD4, 0xFE, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x0B,
2358 0x04, 0x00, 0x00, 0x00, 0xC2, 0xFE, 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x08, 0x00,
2359 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x8A, 0xFF, 0xFF, 0xFF, 0x02, 0x00, 0x00, 0x00,
2360 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00,
2361 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2362 0x38, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
2363 0x00, 0x1A, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00,
2364 0x34, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x12, 0x00, 0x08, 0x00, 0x0C, 0x00,
2365 0x07, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
2366 0x00, 0x00, 0x0E, 0x00, 0x18, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x14, 0x00, 0x0E, 0x00,
2367 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00,
2368 0x20, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x72, 0x65, 0x73, 0x69, 0x7A, 0x65, 0x42, 0x69, 0x6C, 0x69,
2369 0x6E, 0x65, 0x61, 0x72, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
2370 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00,
2371 0x00, 0x00, 0x52, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2372 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00,
2373 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2374 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x07, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
2375 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xF6, 0xFF, 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00,
2376 0x0A, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x14, 0x00,
2377 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
2378 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2379 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0A, 0x00,
2380 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x10, 0x00,
2381 0x08, 0x00, 0x07, 0x00, 0x0C, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00,
2382 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00,
2383 0x00, 0x00, 0x05, 0x00, 0x00, 0x00
2384 };
2385
2386 armnn::INetworkPtr deserializedNetwork =
2387 DeserializeNetwork(std::string(resizeBilinearModel.begin(), resizeBilinearModel.end()));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002388 CHECK(deserializedNetwork);
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002389
2390 const armnn::TensorInfo inputInfo = armnn::TensorInfo({1, 3, 5, 5}, armnn::DataType::Float32);
2391 const armnn::TensorInfo outputInfo = armnn::TensorInfo({1, 3, 2, 4}, armnn::DataType::Float32);
2392
Jan Eilers1b2654f2021-09-24 15:45:46 +01002393 armnn::ResizeDescriptor descriptor;
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002394 descriptor.m_TargetWidth = 4u;
2395 descriptor.m_TargetHeight = 2u;
2396
2397 ResizeBilinearLayerVerifier verifier("resizeBilinear", { inputInfo }, { outputInfo }, descriptor);
Finn Williamsb454c5c2021-02-09 15:56:23 +00002398 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002399}
2400
Keith Davis3ae3f972021-05-21 16:33:48 +01002401TEST_CASE("SerializeShape")
2402{
2403 const std::string layerName("shape");
2404 const armnn::TensorInfo inputInfo({1, 3, 3, 1}, armnn::DataType::Signed32);
2405 const armnn::TensorInfo outputInfo({ 4 }, armnn::DataType::Signed32);
2406
2407 armnn::INetworkPtr network = armnn::INetwork::Create();
2408 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2409 armnn::IConnectableLayer* const shapeLayer = network->AddShapeLayer(layerName.c_str());
2410 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2411
2412 inputLayer->GetOutputSlot(0).Connect(shapeLayer->GetInputSlot(0));
2413 shapeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2414
2415 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2416 shapeLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2417
2418 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
2419 CHECK(deserializedNetwork);
2420
2421 LayerVerifierBase verifier(layerName, {inputInfo}, {outputInfo});
2422
2423 deserializedNetwork->ExecuteStrategy(verifier);
2424}
2425
Sadik Armagan1625efc2021-06-10 18:24:34 +01002426TEST_CASE("SerializeSlice")
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +01002427{
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +01002428 const std::string layerName{"slice"};
2429
2430 const armnn::TensorInfo inputInfo = armnn::TensorInfo({3, 2, 3, 1}, armnn::DataType::Float32);
2431 const armnn::TensorInfo outputInfo = armnn::TensorInfo({2, 2, 2, 1}, armnn::DataType::Float32);
2432
2433 armnn::SliceDescriptor descriptor({ 0, 0, 1, 0}, {2, 2, 2, 1});
2434
2435 armnn::INetworkPtr network = armnn::INetwork::Create();
2436
2437 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2438 armnn::IConnectableLayer* const sliceLayer = network->AddSliceLayer(descriptor, layerName.c_str());
2439 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2440
2441 inputLayer->GetOutputSlot(0).Connect(sliceLayer->GetInputSlot(0));
2442 sliceLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2443
2444 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2445 sliceLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2446
2447 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002448 CHECK(deserializedNetwork);
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +01002449
Finn Williamsb454c5c2021-02-09 15:56:23 +00002450 LayerVerifierBaseWithDescriptor<armnn::SliceDescriptor> verifier(layerName, {inputInfo}, {outputInfo}, descriptor);
2451 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +01002452}
2453
Sadik Armagan1625efc2021-06-10 18:24:34 +01002454TEST_CASE("SerializeSoftmax")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002455{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002456 const std::string layerName("softmax");
2457 const armnn::TensorInfo info({1, 10}, armnn::DataType::Float32);
2458
2459 armnn::SoftmaxDescriptor descriptor;
2460 descriptor.m_Beta = 1.0f;
2461
2462 armnn::INetworkPtr network = armnn::INetwork::Create();
2463 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2464 armnn::IConnectableLayer* const softmaxLayer = network->AddSoftmaxLayer(descriptor, layerName.c_str());
2465 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2466
2467 inputLayer->GetOutputSlot(0).Connect(softmaxLayer->GetInputSlot(0));
2468 softmaxLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2469
2470 inputLayer->GetOutputSlot(0).SetTensorInfo(info);
2471 softmaxLayer->GetOutputSlot(0).SetTensorInfo(info);
2472
2473 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002474 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002475
Finn Williamsb454c5c2021-02-09 15:56:23 +00002476 LayerVerifierBaseWithDescriptor<armnn::SoftmaxDescriptor> verifier(layerName, {info}, {info}, descriptor);
2477 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002478}
2479
Sadik Armagan1625efc2021-06-10 18:24:34 +01002480TEST_CASE("SerializeSpaceToBatchNd")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002481{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002482 const std::string layerName("spaceToBatchNd");
2483 const armnn::TensorInfo inputInfo({2, 1, 2, 4}, armnn::DataType::Float32);
2484 const armnn::TensorInfo outputInfo({8, 1, 1, 3}, armnn::DataType::Float32);
2485
2486 armnn::SpaceToBatchNdDescriptor desc;
2487 desc.m_DataLayout = armnn::DataLayout::NCHW;
2488 desc.m_BlockShape = {2, 2};
2489 desc.m_PadList = {{0, 0}, {2, 0}};
2490
2491 armnn::INetworkPtr network = armnn::INetwork::Create();
2492 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2493 armnn::IConnectableLayer* const spaceToBatchNdLayer = network->AddSpaceToBatchNdLayer(desc, layerName.c_str());
2494 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2495
2496 inputLayer->GetOutputSlot(0).Connect(spaceToBatchNdLayer->GetInputSlot(0));
2497 spaceToBatchNdLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2498
2499 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2500 spaceToBatchNdLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2501
2502 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002503 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002504
Finn Williamsb454c5c2021-02-09 15:56:23 +00002505 LayerVerifierBaseWithDescriptor<armnn::SpaceToBatchNdDescriptor> verifier(
2506 layerName, {inputInfo}, {outputInfo}, desc);
2507 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002508}
2509
Sadik Armagan1625efc2021-06-10 18:24:34 +01002510TEST_CASE("SerializeSpaceToDepth")
Aron Virginas-Taraa067142019-06-11 16:01:44 +01002511{
Aron Virginas-Taraa067142019-06-11 16:01:44 +01002512 const std::string layerName("spaceToDepth");
2513
2514 const armnn::TensorInfo inputInfo ({ 1, 16, 8, 3 }, armnn::DataType::Float32);
2515 const armnn::TensorInfo outputInfo({ 1, 8, 4, 12 }, armnn::DataType::Float32);
2516
2517 armnn::SpaceToDepthDescriptor desc;
2518 desc.m_BlockSize = 2;
2519 desc.m_DataLayout = armnn::DataLayout::NHWC;
2520
2521 armnn::INetworkPtr network = armnn::INetwork::Create();
2522 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2523 armnn::IConnectableLayer* const spaceToDepthLayer = network->AddSpaceToDepthLayer(desc, layerName.c_str());
2524 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2525
2526 inputLayer->GetOutputSlot(0).Connect(spaceToDepthLayer->GetInputSlot(0));
2527 spaceToDepthLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2528
2529 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2530 spaceToDepthLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2531
2532 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002533 CHECK(deserializedNetwork);
Aron Virginas-Taraa067142019-06-11 16:01:44 +01002534
Finn Williamsb454c5c2021-02-09 15:56:23 +00002535 LayerVerifierBaseWithDescriptor<armnn::SpaceToDepthDescriptor> verifier(
2536 layerName, {inputInfo}, {outputInfo}, desc);
2537 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Taraa067142019-06-11 16:01:44 +01002538}
2539
Sadik Armagan1625efc2021-06-10 18:24:34 +01002540TEST_CASE("SerializeSplitter")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002541{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002542 const unsigned int numViews = 3;
2543 const unsigned int numDimensions = 4;
2544 const unsigned int inputShape[] = {1, 18, 4, 4};
2545 const unsigned int outputShape[] = {1, 6, 4, 4};
2546
2547 // This is modelled on how the caffe parser sets up a splitter layer to partition an input along dimension one.
2548 unsigned int splitterDimSizes[4] = {static_cast<unsigned int>(inputShape[0]),
2549 static_cast<unsigned int>(inputShape[1]),
2550 static_cast<unsigned int>(inputShape[2]),
2551 static_cast<unsigned int>(inputShape[3])};
2552 splitterDimSizes[1] /= numViews;
2553 armnn::ViewsDescriptor desc(numViews, numDimensions);
2554
2555 for (unsigned int g = 0; g < numViews; ++g)
2556 {
2557 desc.SetViewOriginCoord(g, 1, splitterDimSizes[1] * g);
2558
2559 for (unsigned int dimIdx=0; dimIdx < 4; dimIdx++)
2560 {
2561 desc.SetViewSize(g, dimIdx, splitterDimSizes[dimIdx]);
2562 }
2563 }
2564
2565 const std::string layerName("splitter");
2566 const armnn::TensorInfo inputInfo(numDimensions, inputShape, armnn::DataType::Float32);
2567 const armnn::TensorInfo outputInfo(numDimensions, outputShape, armnn::DataType::Float32);
2568
2569 armnn::INetworkPtr network = armnn::INetwork::Create();
2570 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2571 armnn::IConnectableLayer* const splitterLayer = network->AddSplitterLayer(desc, layerName.c_str());
2572 armnn::IConnectableLayer* const outputLayer0 = network->AddOutputLayer(0);
2573 armnn::IConnectableLayer* const outputLayer1 = network->AddOutputLayer(1);
2574 armnn::IConnectableLayer* const outputLayer2 = network->AddOutputLayer(2);
2575
2576 inputLayer->GetOutputSlot(0).Connect(splitterLayer->GetInputSlot(0));
2577 splitterLayer->GetOutputSlot(0).Connect(outputLayer0->GetInputSlot(0));
2578 splitterLayer->GetOutputSlot(1).Connect(outputLayer1->GetInputSlot(0));
2579 splitterLayer->GetOutputSlot(2).Connect(outputLayer2->GetInputSlot(0));
2580
2581 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2582 splitterLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2583 splitterLayer->GetOutputSlot(1).SetTensorInfo(outputInfo);
2584 splitterLayer->GetOutputSlot(2).SetTensorInfo(outputInfo);
2585
2586 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002587 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002588
Finn Williamsb454c5c2021-02-09 15:56:23 +00002589 LayerVerifierBaseWithDescriptor<armnn::ViewsDescriptor> verifier(
2590 layerName, {inputInfo}, {outputInfo, outputInfo, outputInfo}, desc);
2591 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002592}
2593
Sadik Armagan1625efc2021-06-10 18:24:34 +01002594TEST_CASE("SerializeStack")
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01002595{
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01002596 const std::string layerName("stack");
2597
2598 armnn::TensorInfo inputTensorInfo ({4, 3, 5}, armnn::DataType::Float32);
2599 armnn::TensorInfo outputTensorInfo({4, 3, 2, 5}, armnn::DataType::Float32);
2600
2601 armnn::StackDescriptor descriptor(2, 2, {4, 3, 5});
2602
2603 armnn::INetworkPtr network = armnn::INetwork::Create();
2604 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(0);
2605 armnn::IConnectableLayer* const inputLayer2 = network->AddInputLayer(1);
2606 armnn::IConnectableLayer* const stackLayer = network->AddStackLayer(descriptor, layerName.c_str());
2607 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2608
2609 inputLayer1->GetOutputSlot(0).Connect(stackLayer->GetInputSlot(0));
2610 inputLayer2->GetOutputSlot(0).Connect(stackLayer->GetInputSlot(1));
2611 stackLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2612
2613 inputLayer1->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
2614 inputLayer2->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
2615 stackLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
2616
2617 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002618 CHECK(deserializedNetwork);
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01002619
Finn Williamsb454c5c2021-02-09 15:56:23 +00002620 LayerVerifierBaseWithDescriptor<armnn::StackDescriptor> verifier(
2621 layerName, {inputTensorInfo, inputTensorInfo}, {outputTensorInfo}, descriptor);
2622 deserializedNetwork->ExecuteStrategy(verifier);
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01002623}
2624
Sadik Armagan1625efc2021-06-10 18:24:34 +01002625TEST_CASE("SerializeStandIn")
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01002626{
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01002627 const std::string layerName("standIn");
2628
2629 armnn::TensorInfo tensorInfo({ 1u }, armnn::DataType::Float32);
2630 armnn::StandInDescriptor descriptor(2u, 2u);
2631
2632 armnn::INetworkPtr network = armnn::INetwork::Create();
2633 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
2634 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
2635 armnn::IConnectableLayer* const standInLayer = network->AddStandInLayer(descriptor, layerName.c_str());
2636 armnn::IConnectableLayer* const outputLayer0 = network->AddOutputLayer(0);
2637 armnn::IConnectableLayer* const outputLayer1 = network->AddOutputLayer(1);
2638
2639 inputLayer0->GetOutputSlot(0).Connect(standInLayer->GetInputSlot(0));
2640 inputLayer0->GetOutputSlot(0).SetTensorInfo(tensorInfo);
2641
2642 inputLayer1->GetOutputSlot(0).Connect(standInLayer->GetInputSlot(1));
2643 inputLayer1->GetOutputSlot(0).SetTensorInfo(tensorInfo);
2644
2645 standInLayer->GetOutputSlot(0).Connect(outputLayer0->GetInputSlot(0));
2646 standInLayer->GetOutputSlot(0).SetTensorInfo(tensorInfo);
2647
2648 standInLayer->GetOutputSlot(1).Connect(outputLayer1->GetInputSlot(0));
2649 standInLayer->GetOutputSlot(1).SetTensorInfo(tensorInfo);
2650
2651 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002652 CHECK(deserializedNetwork);
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01002653
Finn Williamsb454c5c2021-02-09 15:56:23 +00002654 LayerVerifierBaseWithDescriptor<armnn::StandInDescriptor> verifier(
2655 layerName, { tensorInfo, tensorInfo }, { tensorInfo, tensorInfo }, descriptor);
2656 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01002657}
2658
Sadik Armagan1625efc2021-06-10 18:24:34 +01002659TEST_CASE("SerializeStridedSlice")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002660{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002661 const std::string layerName("stridedSlice");
2662 const armnn::TensorInfo inputInfo = armnn::TensorInfo({3, 2, 3, 1}, armnn::DataType::Float32);
2663 const armnn::TensorInfo outputInfo = armnn::TensorInfo({3, 1}, armnn::DataType::Float32);
2664
2665 armnn::StridedSliceDescriptor desc({0, 0, 1, 0}, {1, 1, 1, 1}, {1, 1, 1, 1});
2666 desc.m_EndMask = (1 << 4) - 1;
2667 desc.m_ShrinkAxisMask = (1 << 1) | (1 << 2);
2668 desc.m_DataLayout = armnn::DataLayout::NCHW;
2669
2670 armnn::INetworkPtr network = armnn::INetwork::Create();
2671 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2672 armnn::IConnectableLayer* const stridedSliceLayer = network->AddStridedSliceLayer(desc, layerName.c_str());
2673 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2674
2675 inputLayer->GetOutputSlot(0).Connect(stridedSliceLayer->GetInputSlot(0));
2676 stridedSliceLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2677
2678 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2679 stridedSliceLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2680
2681 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002682 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002683
Finn Williamsb454c5c2021-02-09 15:56:23 +00002684 LayerVerifierBaseWithDescriptor<armnn::StridedSliceDescriptor> verifier(
2685 layerName, {inputInfo}, {outputInfo}, desc);
2686 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002687}
2688
Sadik Armagan1625efc2021-06-10 18:24:34 +01002689TEST_CASE("SerializeSubtraction")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002690{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002691 const std::string layerName("subtraction");
2692 const armnn::TensorInfo info({ 1, 4 }, armnn::DataType::Float32);
2693
2694 armnn::INetworkPtr network = armnn::INetwork::Create();
2695 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
2696 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
2697 armnn::IConnectableLayer* const subtractionLayer = network->AddSubtractionLayer(layerName.c_str());
2698 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2699
2700 inputLayer0->GetOutputSlot(0).Connect(subtractionLayer->GetInputSlot(0));
2701 inputLayer1->GetOutputSlot(0).Connect(subtractionLayer->GetInputSlot(1));
2702 subtractionLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2703
2704 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
2705 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
2706 subtractionLayer->GetOutputSlot(0).SetTensorInfo(info);
2707
2708 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002709 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002710
Finn Williamsb454c5c2021-02-09 15:56:23 +00002711 LayerVerifierBase verifier(layerName, {info, info}, {info});
2712 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +00002713}
2714
Sadik Armagan1625efc2021-06-10 18:24:34 +01002715TEST_CASE("SerializeSwitch")
Sadik Armaganeff363d2019-04-05 15:25:46 +01002716{
2717 class SwitchLayerVerifier : public LayerVerifierBase
2718 {
2719 public:
2720 SwitchLayerVerifier(const std::string& layerName,
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01002721 const std::vector<armnn::TensorInfo>& inputInfos,
2722 const std::vector<armnn::TensorInfo>& outputInfos)
Finn Williamsb454c5c2021-02-09 15:56:23 +00002723 : LayerVerifierBase(layerName, inputInfos, outputInfos) {}
Sadik Armaganeff363d2019-04-05 15:25:46 +01002724
Finn Williamsb454c5c2021-02-09 15:56:23 +00002725 void ExecuteStrategy(const armnn::IConnectableLayer* layer,
2726 const armnn::BaseDescriptor& descriptor,
2727 const std::vector<armnn::ConstTensor>& constants,
2728 const char* name,
2729 const armnn::LayerBindingId id = 0) override
Sadik Armaganeff363d2019-04-05 15:25:46 +01002730 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00002731 armnn::IgnoreUnused(descriptor, constants, id);
2732 switch (layer->GetType())
2733 {
2734 case armnn::LayerType::Input: break;
2735 case armnn::LayerType::Output: break;
2736 case armnn::LayerType::Constant: break;
2737 case armnn::LayerType::Switch:
2738 {
2739 VerifyNameAndConnections(layer, name);
2740 break;
2741 }
2742 default:
2743 {
2744 throw armnn::Exception("Unexpected layer type in Switch test model");
2745 }
2746 }
Sadik Armaganeff363d2019-04-05 15:25:46 +01002747 }
Sadik Armaganeff363d2019-04-05 15:25:46 +01002748 };
2749
2750 const std::string layerName("switch");
Cathal Corbett5b8093c2021-10-22 11:12:07 +01002751 const armnn::TensorInfo info({ 1, 4 }, armnn::DataType::Float32, 0.0f, 0, true);
Sadik Armaganeff363d2019-04-05 15:25:46 +01002752
2753 std::vector<float> constantData = GenerateRandomData<float>(info.GetNumElements());
2754 armnn::ConstTensor constTensor(info, constantData);
2755
2756 armnn::INetworkPtr network = armnn::INetwork::Create();
2757 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2758 armnn::IConnectableLayer* const constantLayer = network->AddConstantLayer(constTensor, "constant");
2759 armnn::IConnectableLayer* const switchLayer = network->AddSwitchLayer(layerName.c_str());
2760 armnn::IConnectableLayer* const trueOutputLayer = network->AddOutputLayer(0);
2761 armnn::IConnectableLayer* const falseOutputLayer = network->AddOutputLayer(1);
2762
2763 inputLayer->GetOutputSlot(0).Connect(switchLayer->GetInputSlot(0));
2764 constantLayer->GetOutputSlot(0).Connect(switchLayer->GetInputSlot(1));
2765 switchLayer->GetOutputSlot(0).Connect(trueOutputLayer->GetInputSlot(0));
2766 switchLayer->GetOutputSlot(1).Connect(falseOutputLayer->GetInputSlot(0));
2767
2768 inputLayer->GetOutputSlot(0).SetTensorInfo(info);
2769 constantLayer->GetOutputSlot(0).SetTensorInfo(info);
2770 switchLayer->GetOutputSlot(0).SetTensorInfo(info);
2771 switchLayer->GetOutputSlot(1).SetTensorInfo(info);
2772
2773 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002774 CHECK(deserializedNetwork);
Sadik Armaganeff363d2019-04-05 15:25:46 +01002775
2776 SwitchLayerVerifier verifier(layerName, {info, info}, {info, info});
Finn Williamsb454c5c2021-02-09 15:56:23 +00002777 deserializedNetwork->ExecuteStrategy(verifier);
Sadik Armaganeff363d2019-04-05 15:25:46 +01002778}
2779
Sadik Armagan1625efc2021-06-10 18:24:34 +01002780TEST_CASE("SerializeTranspose")
Mike Kellyc9ea45a2020-02-28 18:11:58 +00002781{
Mike Kellyc9ea45a2020-02-28 18:11:58 +00002782 const std::string layerName("transpose");
2783 const armnn::TensorInfo inputTensorInfo({4, 3, 2, 1}, armnn::DataType::Float32);
2784 const armnn::TensorInfo outputTensorInfo({1, 2, 3, 4}, armnn::DataType::Float32);
2785
2786 armnn::TransposeDescriptor descriptor(armnn::PermutationVector({3, 2, 1, 0}));
2787
2788 armnn::INetworkPtr network = armnn::INetwork::Create();
2789 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2790 armnn::IConnectableLayer* const transposeLayer = network->AddTransposeLayer(descriptor, layerName.c_str());
2791 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2792
2793 inputLayer->GetOutputSlot(0).Connect(transposeLayer->GetInputSlot(0));
2794 transposeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2795
2796 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
2797 transposeLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
2798
2799 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002800 CHECK(deserializedNetwork);
Mike Kellyc9ea45a2020-02-28 18:11:58 +00002801
Finn Williamsb454c5c2021-02-09 15:56:23 +00002802 LayerVerifierBaseWithDescriptor<armnn::TransposeDescriptor> verifier(
2803 layerName, {inputTensorInfo}, {outputTensorInfo}, descriptor);
2804 deserializedNetwork->ExecuteStrategy(verifier);
Mike Kellyc9ea45a2020-02-28 18:11:58 +00002805}
2806
Sadik Armagan1625efc2021-06-10 18:24:34 +01002807TEST_CASE("SerializeTransposeConvolution2d")
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01002808{
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01002809 const std::string layerName("transposeConvolution2d");
2810 const armnn::TensorInfo inputInfo ({ 1, 7, 7, 1 }, armnn::DataType::Float32);
2811 const armnn::TensorInfo outputInfo({ 1, 9, 9, 1 }, armnn::DataType::Float32);
2812
Cathal Corbett5b8093c2021-10-22 11:12:07 +01002813 const armnn::TensorInfo weightsInfo({ 1, 3, 3, 1 }, armnn::DataType::Float32, 0.0f, 0, true);
2814 const armnn::TensorInfo biasesInfo ({ 1 }, armnn::DataType::Float32, 0.0f, 0, true);
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01002815
2816 std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements());
2817 armnn::ConstTensor weights(weightsInfo, weightsData);
2818
2819 std::vector<float> biasesData = GenerateRandomData<float>(biasesInfo.GetNumElements());
2820 armnn::ConstTensor biases(biasesInfo, biasesData);
2821
2822 armnn::TransposeConvolution2dDescriptor descriptor;
2823 descriptor.m_PadLeft = 1;
2824 descriptor.m_PadRight = 1;
2825 descriptor.m_PadTop = 1;
2826 descriptor.m_PadBottom = 1;
2827 descriptor.m_StrideX = 1;
2828 descriptor.m_StrideY = 1;
2829 descriptor.m_BiasEnabled = true;
2830 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
2831
2832 armnn::INetworkPtr network = armnn::INetwork::Create();
2833 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2834 armnn::IConnectableLayer* const convLayer =
2835 network->AddTransposeConvolution2dLayer(descriptor,
2836 weights,
2837 armnn::Optional<armnn::ConstTensor>(biases),
2838 layerName.c_str());
2839 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2840
2841 inputLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(0));
2842 convLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2843
2844 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2845 convLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2846
2847 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002848 CHECK(deserializedNetwork);
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01002849
Finn Williamsb454c5c2021-02-09 15:56:23 +00002850 const std::vector<armnn::ConstTensor> constants {weights, biases};
2851 LayerVerifierBaseWithDescriptorAndConstants<armnn::TransposeConvolution2dDescriptor> verifier(
2852 layerName, {inputInfo}, {outputInfo}, descriptor, constants);
2853 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01002854}
2855
Sadik Armagan1625efc2021-06-10 18:24:34 +01002856TEST_CASE("SerializeDeserializeNonLinearNetwork")
Sadik Armagandb059fd2019-03-20 12:28:32 +00002857{
2858 class ConstantLayerVerifier : public LayerVerifierBase
2859 {
2860 public:
2861 ConstantLayerVerifier(const std::string& layerName,
2862 const std::vector<armnn::TensorInfo>& inputInfos,
2863 const std::vector<armnn::TensorInfo>& outputInfos,
2864 const armnn::ConstTensor& layerInput)
2865 : LayerVerifierBase(layerName, inputInfos, outputInfos)
2866 , m_LayerInput(layerInput) {}
2867
Finn Williamsb454c5c2021-02-09 15:56:23 +00002868 void ExecuteStrategy(const armnn::IConnectableLayer* layer,
2869 const armnn::BaseDescriptor& descriptor,
2870 const std::vector<armnn::ConstTensor>& constants,
2871 const char* name,
2872 const armnn::LayerBindingId id = 0) override
Sadik Armagandb059fd2019-03-20 12:28:32 +00002873 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00002874 armnn::IgnoreUnused(descriptor, constants, id);
2875 switch (layer->GetType())
2876 {
2877 case armnn::LayerType::Input: break;
2878 case armnn::LayerType::Output: break;
2879 case armnn::LayerType::Addition: break;
2880 case armnn::LayerType::Constant:
2881 {
2882 VerifyNameAndConnections(layer, name);
2883 CompareConstTensor(constants.at(0), m_LayerInput);
2884 break;
2885 }
2886 default:
2887 {
2888 throw armnn::Exception("Unexpected layer type in test model");
2889 }
2890 }
Sadik Armagandb059fd2019-03-20 12:28:32 +00002891 }
2892
Sadik Armagandb059fd2019-03-20 12:28:32 +00002893 private:
2894 armnn::ConstTensor m_LayerInput;
2895 };
2896
2897 const std::string layerName("constant");
Cathal Corbett5b8093c2021-10-22 11:12:07 +01002898 const armnn::TensorInfo info({ 2, 3 }, armnn::DataType::Float32, 0.0f, 0, true);
Sadik Armagandb059fd2019-03-20 12:28:32 +00002899
2900 std::vector<float> constantData = GenerateRandomData<float>(info.GetNumElements());
2901 armnn::ConstTensor constTensor(info, constantData);
2902
2903 armnn::INetworkPtr network(armnn::INetwork::Create());
2904 armnn::IConnectableLayer* input = network->AddInputLayer(0);
2905 armnn::IConnectableLayer* add = network->AddAdditionLayer();
2906 armnn::IConnectableLayer* constant = network->AddConstantLayer(constTensor, layerName.c_str());
2907 armnn::IConnectableLayer* output = network->AddOutputLayer(0);
2908
2909 input->GetOutputSlot(0).Connect(add->GetInputSlot(0));
2910 constant->GetOutputSlot(0).Connect(add->GetInputSlot(1));
2911 add->GetOutputSlot(0).Connect(output->GetInputSlot(0));
2912
2913 input->GetOutputSlot(0).SetTensorInfo(info);
2914 constant->GetOutputSlot(0).SetTensorInfo(info);
2915 add->GetOutputSlot(0).SetTensorInfo(info);
2916
2917 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002918 CHECK(deserializedNetwork);
Sadik Armagandb059fd2019-03-20 12:28:32 +00002919
2920 ConstantLayerVerifier verifier(layerName, {}, {info}, constTensor);
Finn Williamsb454c5c2021-02-09 15:56:23 +00002921 deserializedNetwork->ExecuteStrategy(verifier);
James Conroy8d333182020-05-13 10:27:58 +01002922}
2923
Teresa Charlin50de4fa2021-05-31 18:47:33 +01002924}