blob: d0586c988c5aa5bebba2f760f2f9a32f95c127c6 [file] [log] [blame]
Mike Kelly8c1701a2019-02-11 17:01:27 +00001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#include <armnn/ArmNN.hpp>
7#include <armnn/INetwork.hpp>
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00008
Mike Kelly8c1701a2019-02-11 17:01:27 +00009#include "../Serializer.hpp"
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +000010
Derek Lamberti0028d1b2019-02-20 13:57:42 +000011#include <armnnDeserializer/IDeserializer.hpp>
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +000012
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +000013#include <random>
Mike Kelly8c1701a2019-02-11 17:01:27 +000014#include <sstream>
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +000015#include <vector>
16
Mike Kelly8c1701a2019-02-11 17:01:27 +000017#include <boost/test/unit_test.hpp>
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +000018#include <flatbuffers/idl.h>
19
Derek Lamberti0028d1b2019-02-20 13:57:42 +000020using armnnDeserializer::IDeserializer;
Mike Kelly8c1701a2019-02-11 17:01:27 +000021
Saoirse Stewart3166c3e2019-02-18 15:24:53 +000022namespace
23{
24
25armnn::INetworkPtr DeserializeNetwork(const std::string& serializerString)
26{
27 std::vector<std::uint8_t> const serializerVector{serializerString.begin(), serializerString.end()};
Derek Lamberti0028d1b2019-02-20 13:57:42 +000028 return IDeserializer::Create()->CreateNetworkFromBinary(serializerVector);
Saoirse Stewart3166c3e2019-02-18 15:24:53 +000029}
30
31std::string SerializeNetwork(const armnn::INetwork& network)
32{
33 armnnSerializer::Serializer serializer;
34 serializer.Serialize(network);
35
36 std::stringstream stream;
37 serializer.SaveSerializedToStream(stream);
38
39 std::string serializerString{stream.str()};
40 return serializerString;
41}
42
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +000043template<typename DataType>
44static std::vector<DataType> GenerateRandomData(size_t size)
45{
46 constexpr bool isIntegerType = std::is_integral<DataType>::value;
47 using Distribution =
48 typename std::conditional<isIntegerType,
49 std::uniform_int_distribution<DataType>,
50 std::uniform_real_distribution<DataType>>::type;
51
52 static constexpr DataType lowerLimit = std::numeric_limits<DataType>::min();
53 static constexpr DataType upperLimit = std::numeric_limits<DataType>::max();
54
55 static Distribution distribution(lowerLimit, upperLimit);
56 static std::default_random_engine generator;
57
58 std::vector<DataType> randomData(size);
59 std::generate(randomData.begin(), randomData.end(), []() { return distribution(generator); });
60
61 return randomData;
62}
63
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +000064template<typename T>
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +000065void CheckDeserializedNetworkAgainstOriginal(const armnn::INetwork& deserializedNetwork,
66 const armnn::INetwork& originalNetwork,
Nattapat Chaimanowong8d69bbc2019-02-27 16:52:29 +000067 const std::vector<armnn::TensorShape>& inputShapes,
68 const std::vector<armnn::TensorShape>& outputShapes,
Matteo Martincighf81edaa2019-03-04 14:34:30 +000069 const std::vector<armnn::LayerBindingId>& inputBindingIds = {0},
70 const std::vector<armnn::LayerBindingId>& outputBindingIds = {0})
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +000071{
Nattapat Chaimanowong8d69bbc2019-02-27 16:52:29 +000072 BOOST_CHECK(inputShapes.size() == inputBindingIds.size());
73 BOOST_CHECK(outputShapes.size() == outputBindingIds.size());
74
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +000075 armnn::IRuntime::CreationOptions options;
76 armnn::IRuntimePtr runtime = armnn::IRuntime::Create(options);
77
78 std::vector<armnn::BackendId> preferredBackends = { armnn::BackendId("CpuRef") };
79
80 // Optimize original network
81 armnn::IOptimizedNetworkPtr optimizedOriginalNetwork =
82 armnn::Optimize(originalNetwork, preferredBackends, runtime->GetDeviceSpec());
83 BOOST_CHECK(optimizedOriginalNetwork);
84
85 // Optimize deserialized network
86 armnn::IOptimizedNetworkPtr optimizedDeserializedNetwork =
87 armnn::Optimize(deserializedNetwork, preferredBackends, runtime->GetDeviceSpec());
88 BOOST_CHECK(optimizedDeserializedNetwork);
89
90 armnn::NetworkId networkId1;
91 armnn::NetworkId networkId2;
92
93 // Load original and deserialized network
94 armnn::Status status1 = runtime->LoadNetwork(networkId1, std::move(optimizedOriginalNetwork));
95 BOOST_CHECK(status1 == armnn::Status::Success);
96
97 armnn::Status status2 = runtime->LoadNetwork(networkId2, std::move(optimizedDeserializedNetwork));
98 BOOST_CHECK(status2 == armnn::Status::Success);
99
100 // Generate some input data
Nattapat Chaimanowong8d69bbc2019-02-27 16:52:29 +0000101 armnn::InputTensors inputTensors1;
102 armnn::InputTensors inputTensors2;
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000103 std::vector<std::vector<T>> inputData;
Nattapat Chaimanowong8d69bbc2019-02-27 16:52:29 +0000104 inputData.reserve(inputShapes.size());
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000105
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000106 for (unsigned int i = 0; i < inputShapes.size(); i++) {
107 inputData.push_back(GenerateRandomData<T>(inputShapes[i].GetNumElements()));
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000108
Nattapat Chaimanowong8d69bbc2019-02-27 16:52:29 +0000109 inputTensors1.emplace_back(
110 i, armnn::ConstTensor(runtime->GetInputTensorInfo(networkId1, inputBindingIds[i]), inputData[i].data()));
111
112 inputTensors2.emplace_back(
113 i, armnn::ConstTensor(runtime->GetInputTensorInfo(networkId2, inputBindingIds[i]), inputData[i].data()));
114 }
115
116 armnn::OutputTensors outputTensors1;
117 armnn::OutputTensors outputTensors2;
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000118 std::vector<std::vector<T>> outputData1;
119 std::vector<std::vector<T>> outputData2;
Nattapat Chaimanowong8d69bbc2019-02-27 16:52:29 +0000120 outputData1.reserve(outputShapes.size());
121 outputData2.reserve(outputShapes.size());
122
123 for (unsigned int i = 0; i < outputShapes.size(); i++)
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000124 {
Nattapat Chaimanowong8d69bbc2019-02-27 16:52:29 +0000125 outputData1.emplace_back(outputShapes[i].GetNumElements());
126 outputData2.emplace_back(outputShapes[i].GetNumElements());
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000127
Nattapat Chaimanowong8d69bbc2019-02-27 16:52:29 +0000128 outputTensors1.emplace_back(
129 i, armnn::Tensor(runtime->GetOutputTensorInfo(networkId1, outputBindingIds[i]), outputData1[i].data()));
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000130
Nattapat Chaimanowong8d69bbc2019-02-27 16:52:29 +0000131 outputTensors2.emplace_back(
132 i, armnn::Tensor(runtime->GetOutputTensorInfo(networkId2, outputBindingIds[i]), outputData2[i].data()));
133 }
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000134
135 // Run original and deserialized network
136 runtime->EnqueueWorkload(networkId1, inputTensors1, outputTensors1);
137 runtime->EnqueueWorkload(networkId2, inputTensors2, outputTensors2);
138
139 // Compare output data
Nattapat Chaimanowong8d69bbc2019-02-27 16:52:29 +0000140 for (unsigned int i = 0; i < outputShapes.size(); i++)
141 {
142 BOOST_CHECK_EQUAL_COLLECTIONS(
143 outputData1[i].begin(), outputData1[i].end(), outputData2[i].begin(), outputData2[i].end());
144 }
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000145}
146
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000147} // anonymous namespace
148
149BOOST_AUTO_TEST_SUITE(SerializerTests)
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000150
Jim Flynnac25a1b2019-02-28 10:40:49 +0000151BOOST_AUTO_TEST_CASE(SerializeDeserializeAddition)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000152{
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000153 class VerifyAdditionName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
154 {
155 public:
156 void VisitAdditionLayer(const armnn::IConnectableLayer*, const char* name) override
157 {
158 BOOST_TEST(name == "addition");
159 }
160 };
161
Mike Kelly8c1701a2019-02-11 17:01:27 +0000162 armnn::INetworkPtr network = armnn::INetwork::Create();
163 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
164 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
165
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000166 armnn::IConnectableLayer* const additionLayer = network->AddAdditionLayer("addition");
167 inputLayer0->GetOutputSlot(0).Connect(additionLayer->GetInputSlot(0));
168 inputLayer1->GetOutputSlot(0).Connect(additionLayer->GetInputSlot(1));
Mike Kelly8c1701a2019-02-11 17:01:27 +0000169
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000170 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
171 additionLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
Mike Kelly8c1701a2019-02-11 17:01:27 +0000172
Jim Flynn3091b062019-02-15 14:45:04 +0000173 armnn::TensorShape shape{1U};
174 armnn::TensorInfo info(shape, armnn::DataType::Float32);
175 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
176 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000177 additionLayer->GetOutputSlot(0).SetTensorInfo(info);
Jim Flynn3091b062019-02-15 14:45:04 +0000178
Mike Kelly8c1701a2019-02-11 17:01:27 +0000179 armnnSerializer::Serializer serializer;
180 serializer.Serialize(*network);
181
182 std::stringstream stream;
183 serializer.SaveSerializedToStream(stream);
184 BOOST_TEST(stream.str().length() > 0);
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000185
186 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(stream.str());
187 BOOST_CHECK(deserializedNetwork);
188
189 VerifyAdditionName nameChecker;
190 deserializedNetwork->Accept(nameChecker);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000191
192 CheckDeserializedNetworkAgainstOriginal<float>(*deserializedNetwork,
193 *network,
194 {info.GetShape(), info.GetShape()},
195 {info.GetShape()},
196 {0, 1});
Mike Kelly8c1701a2019-02-11 17:01:27 +0000197}
198
Conor Kennedy76277882019-02-26 08:29:54 +0000199BOOST_AUTO_TEST_CASE(SerializeConstant)
200{
201 armnn::INetworkPtr network = armnn::INetwork::Create();
202
203 armnn::ConstTensor inputTensor;
204
205 armnn::IConnectableLayer* const inputLayer0 = network->AddConstantLayer(inputTensor, "constant");
206 armnn::IConnectableLayer* const outputLayer0 = network->AddOutputLayer(0);
207
208 inputLayer0->GetOutputSlot(0).Connect(outputLayer0->GetInputSlot(0));
209
210 armnnSerializer::Serializer serializer;
211 serializer.Serialize(*network);
212
213 std::stringstream stream;
214 serializer.SaveSerializedToStream(stream);
215 BOOST_TEST(stream.str().length() > 0);
216 BOOST_TEST(stream.str().find("constant") != stream.str().npos);
217}
218
219BOOST_AUTO_TEST_CASE(SerializeDeserializeConstant)
220{
221 class VerifyConstantName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
222 {
223 public:
224 void VisitConstantLayer(const armnn::IConnectableLayer*, const armnn::ConstTensor&, const char* name) override
225 {
226 BOOST_TEST(name == "constant");
227 }
228 };
229
230 armnn::TensorInfo commonTensorInfo({ 2, 3 }, armnn::DataType::Float32);
231
232 std::vector<float> constantData = GenerateRandomData<float>(commonTensorInfo.GetNumElements());
233 armnn::ConstTensor constTensor(commonTensorInfo, constantData);
234
235 // Builds up the structure of the network.
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000236 armnn::INetworkPtr network(armnn::INetwork::Create());
Conor Kennedy76277882019-02-26 08:29:54 +0000237
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000238 armnn::IConnectableLayer* input = network->AddInputLayer(0);
239 armnn::IConnectableLayer* constant = network->AddConstantLayer(constTensor, "constant");
240 armnn::IConnectableLayer* add = network->AddAdditionLayer();
241 armnn::IConnectableLayer* output = network->AddOutputLayer(0);
Conor Kennedy76277882019-02-26 08:29:54 +0000242
243 input->GetOutputSlot(0).Connect(add->GetInputSlot(0));
244 constant->GetOutputSlot(0).Connect(add->GetInputSlot(1));
245 add->GetOutputSlot(0).Connect(output->GetInputSlot(0));
246
247 // Sets the tensors in the network.
248 input->GetOutputSlot(0).SetTensorInfo(commonTensorInfo);
249 constant->GetOutputSlot(0).SetTensorInfo(commonTensorInfo);
250 add->GetOutputSlot(0).SetTensorInfo(commonTensorInfo);
251
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000252 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Conor Kennedy76277882019-02-26 08:29:54 +0000253 BOOST_CHECK(deserializedNetwork);
254
255 VerifyConstantName nameChecker;
256 deserializedNetwork->Accept(nameChecker);
257
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000258 CheckDeserializedNetworkAgainstOriginal<float>(*deserializedNetwork,
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000259 *network,
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000260 {commonTensorInfo.GetShape()},
261 {commonTensorInfo.GetShape()});
Conor Kennedy76277882019-02-26 08:29:54 +0000262}
263
Jim Flynnac25a1b2019-02-28 10:40:49 +0000264BOOST_AUTO_TEST_CASE(SerializeDeserializeFloor)
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000265{
266 class VerifyFloorName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
267 {
268 public:
269 void VisitMultiplicationLayer(const armnn::IConnectableLayer*, const char* name) override
270 {
271 BOOST_TEST(name == "floor");
272 }
273 };
274
275 const armnn::TensorInfo info({4,4}, armnn::DataType::Float32);
276
277 armnn::INetworkPtr network = armnn::INetwork::Create();
Jim Flynnac25a1b2019-02-28 10:40:49 +0000278 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000279
280 const char* floorLayerName = "floor";
281
282 armnn::IConnectableLayer* const floorLayer = network->AddFloorLayer(floorLayerName);
283 inputLayer->GetOutputSlot(0).Connect(floorLayer->GetInputSlot(0));
284
285 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
286 floorLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
287
288 inputLayer->GetOutputSlot(0).SetTensorInfo(info);
289 floorLayer->GetOutputSlot(0).SetTensorInfo(info);
290
291 armnnSerializer::Serializer serializer;
292 serializer.Serialize(*network);
293
294 std::stringstream stream;
295 serializer.SaveSerializedToStream(stream);
296 BOOST_TEST(stream.str().length() > 0);
297 BOOST_TEST(stream.str().find(floorLayerName) != stream.str().npos);
298
299 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(stream.str());
300 BOOST_CHECK(deserializedNetwork);
301
302 VerifyFloorName nameChecker;
303 deserializedNetwork->Accept(nameChecker);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000304
305 CheckDeserializedNetworkAgainstOriginal<float>(*deserializedNetwork,
306 *network,
307 {info.GetShape()},
308 {info.GetShape()});
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000309}
310
Jim Flynnac25a1b2019-02-28 10:40:49 +0000311BOOST_AUTO_TEST_CASE(SerializeDeserializeMinimum)
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000312{
313 class VerifyMinimumName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
314 {
315 public:
316 explicit VerifyMinimumName(const std::string& expectedMinimumLayerName)
317 : m_ExpectedMinimumLayerName(expectedMinimumLayerName) {}
318
319 void VisitMinimumLayer(const armnn::IConnectableLayer*, const char* name) override
320 {
321 BOOST_TEST(name == m_ExpectedMinimumLayerName.c_str());
322 }
323
324 private:
325 std::string m_ExpectedMinimumLayerName;
326 };
327
328 const armnn::TensorInfo info({ 1, 2, 2, 3 }, armnn::DataType::Float32);
329
330 armnn::INetworkPtr network = armnn::INetwork::Create();
331 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
332 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
333
334 const std::string minimumLayerName("minimum");
335
336 armnn::IConnectableLayer* const minimumLayer = network->AddMinimumLayer(minimumLayerName.c_str());
337 inputLayer0->GetOutputSlot(0).Connect(minimumLayer->GetInputSlot(0));
338 inputLayer1->GetOutputSlot(0).Connect(minimumLayer->GetInputSlot(1));
339
340 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
341 minimumLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
342
343 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
344 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
345 minimumLayer->GetOutputSlot(0).SetTensorInfo(info);
346
347 armnnSerializer::Serializer serializer;
348 serializer.Serialize(*network);
349
350 std::stringstream stream;
351 serializer.SaveSerializedToStream(stream);
352 BOOST_TEST(stream.str().length() > 0);
353 BOOST_TEST(stream.str().find(minimumLayerName) != stream.str().npos);
354
355 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(stream.str());
356 BOOST_CHECK(deserializedNetwork);
357
358 VerifyMinimumName nameChecker(minimumLayerName);
359 deserializedNetwork->Accept(nameChecker);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000360
361 CheckDeserializedNetworkAgainstOriginal<float>(*deserializedNetwork,
362 *network,
363 {info.GetShape(), info.GetShape()},
364 {info.GetShape()},
365 {0, 1});
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000366}
367
Jim Flynnac25a1b2019-02-28 10:40:49 +0000368BOOST_AUTO_TEST_CASE(SerializeDeserializeMaximum)
Aron Virginas-Tar377351e2019-02-27 14:42:31 +0000369{
370 class VerifyMaximumName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
371 {
372 public:
373 explicit VerifyMaximumName(const std::string& expectedMaximumLayerName)
374 : m_ExpectedMaximumLayerName(expectedMaximumLayerName) {}
375
376 void VisitMaximumLayer(const armnn::IConnectableLayer*, const char* name) override
377 {
378 BOOST_TEST(name == m_ExpectedMaximumLayerName.c_str());
379 }
380
381 private:
382 std::string m_ExpectedMaximumLayerName;
383 };
384
385 const armnn::TensorInfo info({ 1, 2, 2, 3 }, armnn::DataType::Float32);
386
387 armnn::INetworkPtr network = armnn::INetwork::Create();
388 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
389 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
390
391 const std::string maximumLayerName("maximum");
392
393 armnn::IConnectableLayer* const maximumLayer = network->AddMaximumLayer(maximumLayerName.c_str());
394 inputLayer0->GetOutputSlot(0).Connect(maximumLayer->GetInputSlot(0));
395 inputLayer1->GetOutputSlot(0).Connect(maximumLayer->GetInputSlot(1));
396
397 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
398 maximumLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
399
400 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
401 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
402 maximumLayer->GetOutputSlot(0).SetTensorInfo(info);
403
404 armnnSerializer::Serializer serializer;
405 serializer.Serialize(*network);
406
407 std::stringstream stream;
408 serializer.SaveSerializedToStream(stream);
409 BOOST_TEST(stream.str().length() > 0);
410 BOOST_TEST(stream.str().find(maximumLayerName) != stream.str().npos);
411
412 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(stream.str());
413 BOOST_CHECK(deserializedNetwork);
414
415 VerifyMaximumName nameChecker(maximumLayerName);
416 deserializedNetwork->Accept(nameChecker);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000417
418 CheckDeserializedNetworkAgainstOriginal<float>(*deserializedNetwork,
419 *network,
420 {info.GetShape(), info.GetShape()},
421 {info.GetShape()},
422 {0, 1});
Aron Virginas-Tar377351e2019-02-27 14:42:31 +0000423}
424
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000425BOOST_AUTO_TEST_CASE(SerializeDeserializeL2Normalization)
426{
427 class VerifyL2NormalizationName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
428 {
429 public:
430 explicit VerifyL2NormalizationName(const std::string& expectedL2NormalizationLayerName)
431 : m_ExpectedL2NormalizationLayerName(expectedL2NormalizationLayerName) {}
432
433 void VisitL2NormalizationLayer(const armnn::IConnectableLayer*,
434 const armnn::L2NormalizationDescriptor&,
435 const char* name) override
436 {
437 BOOST_TEST(name == m_ExpectedL2NormalizationLayerName.c_str());
438 }
439 private:
440 std::string m_ExpectedL2NormalizationLayerName;
441 };
442
443 const armnn::TensorInfo info({ 1, 2, 1, 5 }, armnn::DataType::Float32);
444
445 armnn::L2NormalizationDescriptor desc;
446 desc.m_DataLayout = armnn::DataLayout::NCHW;
447
448 armnn::INetworkPtr network = armnn::INetwork::Create();
449 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
450
451 const char* l2NormLayerName = "l2Normalization";
452
453 armnn::IConnectableLayer* const l2NormLayer = network->AddL2NormalizationLayer(desc, l2NormLayerName);
454 inputLayer0->GetOutputSlot(0).Connect(l2NormLayer->GetInputSlot(0));
455
456 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
457 l2NormLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
458
459 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
460 l2NormLayer->GetOutputSlot(0).SetTensorInfo(info);
461
462 armnnSerializer::Serializer serializer;
463 serializer.Serialize(*network);
464
465 std::stringstream stream;
466 serializer.SaveSerializedToStream(stream);
467 BOOST_TEST(stream.str().length() > 0);
468 BOOST_TEST(stream.str().find(l2NormLayerName) != stream.str().npos);
469
470 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(stream.str());
471 BOOST_CHECK(deserializedNetwork);
472
473 VerifyL2NormalizationName nameChecker(l2NormLayerName);
474 deserializedNetwork->Accept(nameChecker);
475
Jim Flynn18ce3382019-03-08 11:08:30 +0000476 CheckDeserializedNetworkAgainstOriginal<float>(*deserializedNetwork,
477 *network,
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000478 { info.GetShape() },
479 { info.GetShape() });
480}
481
Jim Flynnac25a1b2019-02-28 10:40:49 +0000482BOOST_AUTO_TEST_CASE(SerializeDeserializeMultiplication)
Sadik Armagan5f450272019-02-12 14:31:45 +0000483{
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000484 class VerifyMultiplicationName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
485 {
486 public:
487 void VisitMultiplicationLayer(const armnn::IConnectableLayer*, const char* name) override
488 {
489 BOOST_TEST(name == "multiplication");
490 }
491 };
492
Sadik Armagan5f450272019-02-12 14:31:45 +0000493 const armnn::TensorInfo info({ 1, 5, 2, 3 }, armnn::DataType::Float32);
494
495 armnn::INetworkPtr network = armnn::INetwork::Create();
496 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
497 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
498
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000499 const char* multLayerName = "multiplication";
Sadik Armagan5f450272019-02-12 14:31:45 +0000500
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000501 armnn::IConnectableLayer* const multiplicationLayer = network->AddMultiplicationLayer(multLayerName);
502 inputLayer0->GetOutputSlot(0).Connect(multiplicationLayer->GetInputSlot(0));
503 inputLayer1->GetOutputSlot(0).Connect(multiplicationLayer->GetInputSlot(1));
Sadik Armagan5f450272019-02-12 14:31:45 +0000504
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000505 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
506 multiplicationLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
Sadik Armagan5f450272019-02-12 14:31:45 +0000507
Jim Flynn3091b062019-02-15 14:45:04 +0000508 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
509 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000510 multiplicationLayer->GetOutputSlot(0).SetTensorInfo(info);
Jim Flynn3091b062019-02-15 14:45:04 +0000511
Sadik Armagan5f450272019-02-12 14:31:45 +0000512 armnnSerializer::Serializer serializer;
513 serializer.Serialize(*network);
514
515 std::stringstream stream;
516 serializer.SaveSerializedToStream(stream);
517 BOOST_TEST(stream.str().length() > 0);
518 BOOST_TEST(stream.str().find(multLayerName) != stream.str().npos);
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000519
520 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(stream.str());
521 BOOST_CHECK(deserializedNetwork);
522
523 VerifyMultiplicationName nameChecker;
524 deserializedNetwork->Accept(nameChecker);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000525
526 CheckDeserializedNetworkAgainstOriginal<float>(*deserializedNetwork,
527 *network,
528 {info.GetShape(), info.GetShape()},
529 {info.GetShape()},
530 {0, 1});
Sadik Armagan5f450272019-02-12 14:31:45 +0000531}
532
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000533BOOST_AUTO_TEST_CASE(SerializeDeserializeConvolution2d)
Saoirse Stewart263829c2019-02-19 15:54:14 +0000534{
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000535
536 class VerifyConvolution2dName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
537 {
538 public:
539 void VisitConvolution2dLayer(const armnn::IConnectableLayer*,
540 const armnn::Convolution2dDescriptor&,
541 const armnn::ConstTensor&,
542 const armnn::Optional<armnn::ConstTensor>&,
543 const char* name) override
544 {
545 BOOST_TEST(name == "convolution");
546 }
547 };
548
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000549 armnn::TensorInfo inputInfo ({ 1, 5, 5, 1 }, armnn::DataType::Float32);
550 armnn::TensorInfo outputInfo({ 1, 3, 3, 1 }, armnn::DataType::Float32);
Saoirse Stewart263829c2019-02-19 15:54:14 +0000551
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000552 armnn::TensorInfo weightsInfo({ 1, 3, 3, 1 }, armnn::DataType::Float32);
553 armnn::TensorInfo biasesInfo ({ 1 }, armnn::DataType::Float32);
554
555 // Construct network
556 armnn::INetworkPtr network = armnn::INetwork::Create();
557
558 armnn::Convolution2dDescriptor descriptor;
559 descriptor.m_PadLeft = 1;
560 descriptor.m_PadRight = 1;
561 descriptor.m_PadTop = 1;
562 descriptor.m_PadBottom = 1;
563 descriptor.m_StrideX = 2;
564 descriptor.m_StrideY = 2;
565 descriptor.m_BiasEnabled = true;
566 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
567
568 std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements());
569 armnn::ConstTensor weights(weightsInfo, weightsData);
570
571 std::vector<float> biasesData = GenerateRandomData<float>(biasesInfo.GetNumElements());
572 armnn::ConstTensor biases(biasesInfo, biasesData);
573
574 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0, "input");
575 armnn::IConnectableLayer* const convLayer =
576 network->AddConvolution2dLayer(descriptor, weights, biases, "convolution");
577 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0, "output");
578
579 inputLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(0));
580 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
581
582 convLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
583 convLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
584
585 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
586 BOOST_CHECK(deserializedNetwork);
587
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000588 VerifyConvolution2dName nameChecker;
589 deserializedNetwork->Accept(nameChecker);
590
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000591 CheckDeserializedNetworkAgainstOriginal<float>(*deserializedNetwork,
592 *network,
593 {inputInfo.GetShape()},
594 {outputInfo.GetShape()});
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000595}
596
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000597BOOST_AUTO_TEST_CASE(SerializeDeserializeGreater)
598{
599 class VerifyGreaterName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
600 {
601 public:
602 void VisitGreaterLayer(const armnn::IConnectableLayer*, const char* name) override
603 {
604 BOOST_TEST(name == "greater");
605 }
606 };
607
608 const armnn::TensorInfo inputTensorInfo1({ 1, 2, 2, 2 }, armnn::DataType::Float32);
609 const armnn::TensorInfo inputTensorInfo2({ 1, 2, 2, 2 }, armnn::DataType::Float32);
610 const armnn::TensorInfo outputTensorInfo({ 1, 2, 2, 2 }, armnn::DataType::Boolean);
611
612 armnn::INetworkPtr network = armnn::INetwork::Create();
613 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(0);
614 armnn::IConnectableLayer* const inputLayer2 = network->AddInputLayer(1);
615 armnn::IConnectableLayer* const greaterLayer = network->AddGreaterLayer("greater");
616 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
617
618 inputLayer1->GetOutputSlot(0).Connect(greaterLayer->GetInputSlot(0));
619 inputLayer1->GetOutputSlot(0).SetTensorInfo(inputTensorInfo1);
620 inputLayer2->GetOutputSlot(0).Connect(greaterLayer->GetInputSlot(1));
621 inputLayer2->GetOutputSlot(0).SetTensorInfo(inputTensorInfo2);
622 greaterLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
623 greaterLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
624
625 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
626 BOOST_CHECK(deserializedNetwork);
627
628 VerifyGreaterName nameChecker;
629 deserializedNetwork->Accept(nameChecker);
630
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000631 CheckDeserializedNetworkAgainstOriginal<float>(*deserializedNetwork,
632 *network,
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000633 {inputTensorInfo1.GetShape(), inputTensorInfo2.GetShape()},
634 {outputTensorInfo.GetShape()},
635 {0, 1});
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000636}
637
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000638BOOST_AUTO_TEST_CASE(SerializeDeserializeReshape)
639{
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000640 class VerifyReshapeName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
641 {
642 public:
643 void VisitReshapeLayer(const armnn::IConnectableLayer*, const armnn::ReshapeDescriptor&, const char* name)
644 {
645 BOOST_TEST(name == "reshape");
646 }
647 };
648
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000649 unsigned int inputShape[] = { 1, 9 };
650 unsigned int outputShape[] = { 3, 3 };
Saoirse Stewart263829c2019-02-19 15:54:14 +0000651
652 auto inputTensorInfo = armnn::TensorInfo(2, inputShape, armnn::DataType::Float32);
653 auto outputTensorInfo = armnn::TensorInfo(2, outputShape, armnn::DataType::Float32);
654 auto reshapeOutputTensorInfo = armnn::TensorInfo(2, outputShape, armnn::DataType::Float32);
655
656 armnn::ReshapeDescriptor reshapeDescriptor;
657 reshapeDescriptor.m_TargetShape = reshapeOutputTensorInfo.GetShape();
658
659 armnn::INetworkPtr network = armnn::INetwork::Create();
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000660 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
661 armnn::IConnectableLayer* const reshapeLayer = network->AddReshapeLayer(reshapeDescriptor, "reshape");
662 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
Saoirse Stewart263829c2019-02-19 15:54:14 +0000663
664 inputLayer->GetOutputSlot(0).Connect(reshapeLayer->GetInputSlot(0));
665 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
666 reshapeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
667 reshapeLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
668
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000669 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
670 BOOST_CHECK(deserializedNetwork);
Saoirse Stewart263829c2019-02-19 15:54:14 +0000671
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000672 VerifyReshapeName nameChecker;
673 deserializedNetwork->Accept(nameChecker);
674
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000675 CheckDeserializedNetworkAgainstOriginal<float>(*deserializedNetwork,
676 *network,
677 {inputTensorInfo.GetShape()},
678 {outputTensorInfo.GetShape()});
Saoirse Stewart263829c2019-02-19 15:54:14 +0000679}
680
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000681BOOST_AUTO_TEST_CASE(SerializeDeserializeDepthwiseConvolution2d)
682{
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000683 class VerifyDepthwiseConvolution2dName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
684 {
685 public:
686 void VisitDepthwiseConvolution2dLayer(const armnn::IConnectableLayer*,
687 const armnn::DepthwiseConvolution2dDescriptor&,
688 const armnn::ConstTensor&,
689 const armnn::Optional<armnn::ConstTensor>&,
690 const char* name) override
691 {
692 BOOST_TEST(name == "depthwise_convolution");
693 }
694 };
695
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000696 armnn::TensorInfo inputInfo ({ 1, 5, 5, 3 }, armnn::DataType::Float32);
697 armnn::TensorInfo outputInfo({ 1, 3, 3, 3 }, armnn::DataType::Float32);
698
699 armnn::TensorInfo weightsInfo({ 1, 3, 3, 3 }, armnn::DataType::Float32);
700 armnn::TensorInfo biasesInfo ({ 3 }, armnn::DataType::Float32);
701
702 armnn::DepthwiseConvolution2dDescriptor descriptor;
703 descriptor.m_StrideX = 1;
704 descriptor.m_StrideY = 1;
705 descriptor.m_BiasEnabled = true;
706 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
707
708 std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements());
709 armnn::ConstTensor weights(weightsInfo, weightsData);
710
711 std::vector<int32_t> biasesData = GenerateRandomData<int32_t>(biasesInfo.GetNumElements());
712 armnn::ConstTensor biases(biasesInfo, biasesData);
713
714 armnn::INetworkPtr network = armnn::INetwork::Create();
715 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
716 armnn::IConnectableLayer* const depthwiseConvLayer =
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000717 network->AddDepthwiseConvolution2dLayer(descriptor, weights, biases, "depthwise_convolution");
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000718 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
719
720 inputLayer->GetOutputSlot(0).Connect(depthwiseConvLayer->GetInputSlot(0));
721 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
722 depthwiseConvLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
723 depthwiseConvLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
724
725 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
726 BOOST_CHECK(deserializedNetwork);
727
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000728 VerifyDepthwiseConvolution2dName nameChecker;
729 deserializedNetwork->Accept(nameChecker);
730
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000731 CheckDeserializedNetworkAgainstOriginal<float>(*deserializedNetwork,
732 *network,
733 {inputInfo.GetShape()},
734 {outputInfo.GetShape()});
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000735}
736
737BOOST_AUTO_TEST_CASE(SerializeDeserializeSoftmax)
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000738{
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000739 class VerifySoftmaxName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
740 {
741 public:
742 void VisitSoftmaxLayer(const armnn::IConnectableLayer*, const armnn::SoftmaxDescriptor&, const char* name)
743 {
744 BOOST_TEST(name == "softmax");
745 }
746 };
747
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000748 armnn::TensorInfo tensorInfo({1, 10}, armnn::DataType::Float32);
749
750 armnn::SoftmaxDescriptor descriptor;
751 descriptor.m_Beta = 1.0f;
752
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000753 armnn::INetworkPtr network = armnn::INetwork::Create();
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000754 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
755 armnn::IConnectableLayer* const softmaxLayer = network->AddSoftmaxLayer(descriptor, "softmax");
756 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000757
758 inputLayer->GetOutputSlot(0).Connect(softmaxLayer->GetInputSlot(0));
759 inputLayer->GetOutputSlot(0).SetTensorInfo(tensorInfo);
760 softmaxLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
761 softmaxLayer->GetOutputSlot(0).SetTensorInfo(tensorInfo);
762
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000763 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000764 BOOST_CHECK(deserializedNetwork);
765
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000766 VerifySoftmaxName nameChecker;
767 deserializedNetwork->Accept(nameChecker);
768
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000769 CheckDeserializedNetworkAgainstOriginal<float>(*deserializedNetwork,
770 *network,
771 {tensorInfo.GetShape()},
772 {tensorInfo.GetShape()});
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000773}
774
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000775BOOST_AUTO_TEST_CASE(SerializeDeserializePooling2d)
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000776{
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000777 class VerifyPooling2dName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
778 {
779 void VisitPooling2dLayer(const armnn::IConnectableLayer*, const armnn::Pooling2dDescriptor&, const char* name)
780 {
781 BOOST_TEST(name == "pooling2d");
782 }
783 };
784
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000785 unsigned int inputShape[] = {1, 2, 2, 1};
786 unsigned int outputShape[] = {1, 1, 1, 1};
787
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000788 auto inputInfo = armnn::TensorInfo(4, inputShape, armnn::DataType::Float32);
789 auto outputInfo = armnn::TensorInfo(4, outputShape, armnn::DataType::Float32);
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000790
791 armnn::Pooling2dDescriptor desc;
792 desc.m_DataLayout = armnn::DataLayout::NHWC;
793 desc.m_PadTop = 0;
794 desc.m_PadBottom = 0;
795 desc.m_PadLeft = 0;
796 desc.m_PadRight = 0;
797 desc.m_PoolType = armnn::PoolingAlgorithm::Average;
798 desc.m_OutputShapeRounding = armnn::OutputShapeRounding::Floor;
799 desc.m_PaddingMethod = armnn::PaddingMethod::Exclude;
800 desc.m_PoolHeight = 2;
801 desc.m_PoolWidth = 2;
802 desc.m_StrideX = 2;
803 desc.m_StrideY = 2;
804
805 armnn::INetworkPtr network = armnn::INetwork::Create();
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000806 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
807 armnn::IConnectableLayer* const pooling2dLayer = network->AddPooling2dLayer(desc, "pooling2d");
808 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000809
810 inputLayer->GetOutputSlot(0).Connect(pooling2dLayer->GetInputSlot(0));
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000811 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000812 pooling2dLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000813 pooling2dLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000814
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000815 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
816 BOOST_CHECK(deserializedNetwork);
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000817
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000818 VerifyPooling2dName nameChecker;
819 deserializedNetwork->Accept(nameChecker);
820
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000821 CheckDeserializedNetworkAgainstOriginal<float>(*deserializedNetwork,
822 *network,
823 {inputInfo.GetShape()},
824 {outputInfo.GetShape()});
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000825}
826
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000827BOOST_AUTO_TEST_CASE(SerializeDeserializePermute)
828{
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000829 class VerifyPermuteName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
830 {
831 public:
832 void VisitPermuteLayer(const armnn::IConnectableLayer*, const armnn::PermuteDescriptor&, const char* name)
833 {
834 BOOST_TEST(name == "permute");
835 }
836 };
837
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000838 unsigned int inputShape[] = { 4, 3, 2, 1 };
839 unsigned int outputShape[] = { 1, 2, 3, 4 };
840 unsigned int dimsMapping[] = { 3, 2, 1, 0 };
841
842 auto inputTensorInfo = armnn::TensorInfo(4, inputShape, armnn::DataType::Float32);
843 auto outputTensorInfo = armnn::TensorInfo(4, outputShape, armnn::DataType::Float32);
844
845 armnn::PermuteDescriptor permuteDescriptor(armnn::PermutationVector(dimsMapping, 4));
846
847 armnn::INetworkPtr network = armnn::INetwork::Create();
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000848 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
849 armnn::IConnectableLayer* const permuteLayer = network->AddPermuteLayer(permuteDescriptor, "permute");
850 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000851
852 inputLayer->GetOutputSlot(0).Connect(permuteLayer->GetInputSlot(0));
853 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
854 permuteLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
855 permuteLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
856
857 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
858 BOOST_CHECK(deserializedNetwork);
859
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000860 VerifyPermuteName nameChecker;
861 deserializedNetwork->Accept(nameChecker);
862
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000863 CheckDeserializedNetworkAgainstOriginal<float>(*deserializedNetwork,
864 *network,
865 {inputTensorInfo.GetShape()},
866 {outputTensorInfo.GetShape()});
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000867}
868
Sadik Armagandbb0c0c2019-02-21 09:01:41 +0000869BOOST_AUTO_TEST_CASE(SerializeDeserializeFullyConnected)
870{
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000871 class VerifyFullyConnectedName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
872 {
873 public:
874 void VisitFullyConnectedLayer(const armnn::IConnectableLayer*,
875 const armnn::FullyConnectedDescriptor&,
876 const armnn::ConstTensor&,
877 const armnn::Optional<armnn::ConstTensor>&,
878 const char* name) override
879 {
880 BOOST_TEST(name == "fully_connected");
881 }
882 };
883
Sadik Armagandbb0c0c2019-02-21 09:01:41 +0000884 armnn::TensorInfo inputInfo ({ 2, 5, 1, 1 }, armnn::DataType::Float32);
885 armnn::TensorInfo outputInfo({ 2, 3 }, armnn::DataType::Float32);
886
887 armnn::TensorInfo weightsInfo({ 5, 3 }, armnn::DataType::Float32);
888 armnn::TensorInfo biasesInfo ({ 3 }, armnn::DataType::Float32);
889
890 armnn::FullyConnectedDescriptor descriptor;
891 descriptor.m_BiasEnabled = true;
892 descriptor.m_TransposeWeightMatrix = false;
893
894 std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements());
895 std::vector<float> biasesData = GenerateRandomData<float>(biasesInfo.GetNumElements());
896
897 armnn::ConstTensor weights(weightsInfo, weightsData);
898 armnn::ConstTensor biases(biasesInfo, biasesData);
899
900 armnn::INetworkPtr network = armnn::INetwork::Create();
901 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0, "input");
902 armnn::IConnectableLayer* const fullyConnectedLayer = network->AddFullyConnectedLayer(descriptor,
903 weights,
904 biases,
905 "fully_connected");
906 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0, "output");
907
908 inputLayer->GetOutputSlot(0).Connect(fullyConnectedLayer->GetInputSlot(0));
909 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
910
911 fullyConnectedLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
912 fullyConnectedLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
913
914 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
915 BOOST_CHECK(deserializedNetwork);
916
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000917 VerifyFullyConnectedName nameChecker;
918 deserializedNetwork->Accept(nameChecker);
919
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000920 CheckDeserializedNetworkAgainstOriginal<float>(*deserializedNetwork,
921 *network,
922 {inputInfo.GetShape()},
923 {outputInfo.GetShape()});
Sadik Armagandbb0c0c2019-02-21 09:01:41 +0000924}
925
Nattapat Chaimanowong45286992019-02-26 15:53:02 +0000926BOOST_AUTO_TEST_CASE(SerializeDeserializeSpaceToBatchNd)
927{
928 class VerifySpaceToBatchNdName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
929 {
930 public:
931 void VisitSpaceToBatchNdLayer(const armnn::IConnectableLayer*,
932 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
933 const char* name) override
934 {
935 BOOST_TEST(name == "SpaceToBatchNdLayer");
936 }
937 };
938
939 unsigned int inputShape[] = {2, 1, 2, 4};
940 unsigned int outputShape[] = {8, 1, 1, 3};
941
942 armnn::SpaceToBatchNdDescriptor desc;
943 desc.m_DataLayout = armnn::DataLayout::NCHW;
944 desc.m_BlockShape = {2, 2};
945 desc.m_PadList = {{0, 0}, {2, 0}};
946
947 auto inputTensorInfo = armnn::TensorInfo(4, inputShape, armnn::DataType::Float32);
948 auto outputTensorInfo = armnn::TensorInfo(4, outputShape, armnn::DataType::Float32);
949
950 armnn::INetworkPtr network = armnn::INetwork::Create();
951 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
952 armnn::IConnectableLayer* const spaceToBatchNdLayer = network->AddSpaceToBatchNdLayer(desc, "SpaceToBatchNdLayer");
953 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
954
955 inputLayer->GetOutputSlot(0).Connect(spaceToBatchNdLayer->GetInputSlot(0));
956 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
957 spaceToBatchNdLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
958 spaceToBatchNdLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
959
960 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
961 BOOST_CHECK(deserializedNetwork);
962
963 VerifySpaceToBatchNdName nameChecker;
964 deserializedNetwork->Accept(nameChecker);
965
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000966 CheckDeserializedNetworkAgainstOriginal<float>(*deserializedNetwork,
967 *network,
968 {inputTensorInfo.GetShape()},
969 {outputTensorInfo.GetShape()});
Nattapat Chaimanowong45286992019-02-26 15:53:02 +0000970}
971
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000972BOOST_AUTO_TEST_CASE(SerializeDeserializeGather)
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000973{
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000974 class VerifyGatherName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000975 {
976 public:
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000977 void VerifyGatherLayer(const armnn::IConnectableLayer *, const char *name)
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000978 {
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000979 BOOST_TEST(name == "gatherLayer");
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000980 }
981 };
982
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000983 armnn::TensorInfo paramsInfo({ 8 }, armnn::DataType::QuantisedAsymm8);
984 armnn::TensorInfo indicesInfo({ 3 }, armnn::DataType::Signed32);
985 armnn::TensorInfo outputInfo({ 3 }, armnn::DataType::QuantisedAsymm8);
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000986
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000987 paramsInfo.SetQuantizationScale(1.0f);
988 paramsInfo.SetQuantizationOffset(0);
989 outputInfo.SetQuantizationScale(1.0f);
990 outputInfo.SetQuantizationOffset(0);
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000991
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000992 const std::vector<int32_t>& indicesData = {7, 6, 5};
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000993 armnn::INetworkPtr network = armnn::INetwork::Create();
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000994 armnn::IConnectableLayer *const inputLayer = network->AddInputLayer(0);
995 armnn::IConnectableLayer *const constantLayer =
996 network->AddConstantLayer(armnn::ConstTensor(indicesInfo, indicesData));
997 armnn::IConnectableLayer *const gatherLayer = network->AddGatherLayer("gatherLayer");
998 armnn::IConnectableLayer *const outputLayer = network->AddOutputLayer(0);
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000999
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +00001000 inputLayer->GetOutputSlot(0).Connect(gatherLayer->GetInputSlot(0));
1001 inputLayer->GetOutputSlot(0).SetTensorInfo(paramsInfo);
1002 constantLayer->GetOutputSlot(0).Connect(gatherLayer->GetInputSlot(1));
1003 constantLayer->GetOutputSlot(0).SetTensorInfo(indicesInfo);
1004 gatherLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1005 gatherLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +00001006
1007 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
1008 BOOST_CHECK(deserializedNetwork);
1009
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +00001010 VerifyGatherName nameChecker;
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +00001011 deserializedNetwork->Accept(nameChecker);
1012
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +00001013 CheckDeserializedNetworkAgainstOriginal<uint8_t>(*deserializedNetwork,
1014 *network,
1015 {paramsInfo.GetShape()},
1016 {outputInfo.GetShape()});
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +00001017}
1018
ruoyan018e7fa232019-02-28 15:09:07 +00001019BOOST_AUTO_TEST_CASE(SerializeDeserializeBatchNormalization)
1020{
1021 class VerifyBatchNormalizationName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
1022 {
1023 public:
1024 void VisitBatchNormalizationLayer(const armnn::IConnectableLayer*,
1025 const armnn::BatchNormalizationDescriptor&,
1026 const armnn::ConstTensor&,
1027 const armnn::ConstTensor&,
1028 const armnn::ConstTensor&,
1029 const armnn::ConstTensor&,
1030 const char* name) override
1031 {
ruoyan015c7ab052019-03-04 14:48:02 +00001032 BOOST_TEST(name == "BatchNormalizationLayer");
ruoyan018e7fa232019-02-28 15:09:07 +00001033 }
1034 };
1035
1036 armnn::TensorInfo inputInfo ({ 1, 3, 3, 1 }, armnn::DataType::Float32);
1037 armnn::TensorInfo outputInfo({ 1, 3, 3, 1 }, armnn::DataType::Float32);
1038
1039 armnn::TensorInfo meanInfo({1}, armnn::DataType::Float32);
1040 armnn::TensorInfo varianceInfo({1}, armnn::DataType::Float32);
1041 armnn::TensorInfo scaleInfo({1}, armnn::DataType::Float32);
1042 armnn::TensorInfo offsetInfo({1}, armnn::DataType::Float32);
1043
1044 armnn::BatchNormalizationDescriptor descriptor;
1045 descriptor.m_Eps = 0.0010000000475f;
1046 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
1047
1048 std::vector<float> meanData({5.0});
1049 std::vector<float> varianceData({2.0});
1050 std::vector<float> scaleData({1.0});
1051 std::vector<float> offsetData({0.0});
1052
1053 armnn::ConstTensor mean(meanInfo, meanData);
1054 armnn::ConstTensor variance(varianceInfo, varianceData);
1055 armnn::ConstTensor scale(scaleInfo, scaleData);
1056 armnn::ConstTensor offset(offsetInfo, offsetData);
1057
1058 armnn::INetworkPtr network = armnn::INetwork::Create();
1059 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1060 armnn::IConnectableLayer* const batchNormalizationLayer = network->AddBatchNormalizationLayer(
1061 descriptor,
1062 mean,
1063 variance,
1064 scale,
1065 offset,
1066 "BatchNormalizationLayer");
1067 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1068
1069 inputLayer->GetOutputSlot(0).Connect(batchNormalizationLayer->GetInputSlot(0));
1070 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
1071
1072 batchNormalizationLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1073 batchNormalizationLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1074
1075 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
1076 BOOST_CHECK(deserializedNetwork);
1077
1078 VerifyBatchNormalizationName nameChecker;
1079 deserializedNetwork->Accept(nameChecker);
1080
Matteo Martincighf81edaa2019-03-04 14:34:30 +00001081 CheckDeserializedNetworkAgainstOriginal<float>(*deserializedNetwork,
1082 *network,
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +00001083 {inputInfo.GetShape()},
1084 {outputInfo.GetShape()});
ruoyan018e7fa232019-02-28 15:09:07 +00001085}
1086
Jim Flynnac25a1b2019-02-28 10:40:49 +00001087BOOST_AUTO_TEST_CASE(SerializeDeserializeDivision)
Éanna Ó Catháin58885892019-02-27 16:16:39 +00001088{
1089 class VerifyDivisionName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
1090 {
1091 public:
1092 void VisitDivisionLayer(const armnn::IConnectableLayer*, const char* name) override
1093 {
1094 BOOST_TEST(name == "division");
1095 }
1096 };
1097
1098 const armnn::TensorInfo info({ 1, 5, 2, 3 }, armnn::DataType::Float32);
1099
1100 armnn::INetworkPtr network = armnn::INetwork::Create();
1101 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
1102 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
1103
1104 const char* divLayerName = "division";
1105
1106 armnn::IConnectableLayer* const divisionLayer = network->AddDivisionLayer(divLayerName);
1107 inputLayer0->GetOutputSlot(0).Connect(divisionLayer->GetInputSlot(0));
1108 inputLayer1->GetOutputSlot(0).Connect(divisionLayer->GetInputSlot(1));
1109
1110 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1111 divisionLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1112
1113 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
1114 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
1115 divisionLayer->GetOutputSlot(0).SetTensorInfo(info);
1116
1117 armnnSerializer::Serializer serializer;
1118 serializer.Serialize(*network);
1119
1120 std::stringstream stream;
1121 serializer.SaveSerializedToStream(stream);
1122 BOOST_TEST(stream.str().length() > 0);
1123 BOOST_TEST(stream.str().find(divLayerName) != stream.str().npos);
1124
1125 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(stream.str());
1126 BOOST_CHECK(deserializedNetwork);
1127
1128 VerifyDivisionName nameChecker;
1129 deserializedNetwork->Accept(nameChecker);
Jim Flynnac25a1b2019-02-28 10:40:49 +00001130
1131 CheckDeserializedNetworkAgainstOriginal<float>(*deserializedNetwork,
1132 *network,
1133 {info.GetShape(), info.GetShape()},
1134 {info.GetShape()},
1135 {0, 1});
Éanna Ó Catháin58885892019-02-27 16:16:39 +00001136}
1137
Nina Drozd57728782019-02-27 10:53:27 +00001138BOOST_AUTO_TEST_CASE(SerializeDeserializeNormalization)
1139{
1140 class VerifyNormalizationName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
1141 {
1142 public:
1143 void VisitNormalizationLayer(const armnn::IConnectableLayer*,
1144 const armnn::NormalizationDescriptor& normalizationDescriptor,
1145 const char* name) override
1146 {
1147 BOOST_TEST(name == "NormalizationLayer");
1148 }
1149 };
1150
1151 unsigned int inputShape[] = {2, 1, 2, 2};
1152 unsigned int outputShape[] = {2, 1, 2, 2};
1153
1154 armnn::NormalizationDescriptor desc;
1155 desc.m_DataLayout = armnn::DataLayout::NCHW;
1156 desc.m_NormSize = 3;
1157 desc.m_Alpha = 1;
1158 desc.m_Beta = 1;
1159 desc.m_K = 1;
1160
1161 auto inputTensorInfo = armnn::TensorInfo(4, inputShape, armnn::DataType::Float32);
1162 auto outputTensorInfo = armnn::TensorInfo(4, outputShape, armnn::DataType::Float32);
1163
1164 armnn::INetworkPtr network = armnn::INetwork::Create();
1165 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1166 armnn::IConnectableLayer* const normalizationLayer = network->AddNormalizationLayer(desc, "NormalizationLayer");
1167 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1168
1169 inputLayer->GetOutputSlot(0).Connect(normalizationLayer->GetInputSlot(0));
1170 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
1171 normalizationLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1172 normalizationLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
1173
1174 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
1175 BOOST_CHECK(deserializedNetwork);
1176
1177 VerifyNormalizationName nameChecker;
1178 deserializedNetwork->Accept(nameChecker);
1179
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +00001180 CheckDeserializedNetworkAgainstOriginal<float>(*deserializedNetwork,
1181 *network,
1182 {inputTensorInfo.GetShape()},
1183 {outputTensorInfo.GetShape()});
Nina Drozd57728782019-02-27 10:53:27 +00001184}
1185
Nattapat Chaimanowong235cea52019-02-28 16:27:30 +00001186BOOST_AUTO_TEST_CASE(SerializeDeserializeEqual)
1187{
1188 class VerifyEqualName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
1189 {
1190 public:
1191 void VisitEqualLayer(const armnn::IConnectableLayer*,
1192 const char* name) override
1193 {
1194 BOOST_TEST(name == "EqualLayer");
1195 }
1196 };
1197
1198 const armnn::TensorInfo inputTensorInfo1 = armnn::TensorInfo({2, 1, 2, 4}, armnn::DataType::Float32);
1199 const armnn::TensorInfo inputTensorInfo2 = armnn::TensorInfo({2, 1, 2, 4}, armnn::DataType::Float32);
1200 const armnn::TensorInfo outputTensorInfo = armnn::TensorInfo({2, 1, 2, 4}, armnn::DataType::Boolean);
1201
1202 armnn::INetworkPtr network = armnn::INetwork::Create();
1203 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(0);
1204 armnn::IConnectableLayer* const inputLayer2 = network->AddInputLayer(1);
1205 armnn::IConnectableLayer* const equalLayer = network->AddEqualLayer("EqualLayer");
1206 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1207
1208 inputLayer1->GetOutputSlot(0).Connect(equalLayer->GetInputSlot(0));
1209 inputLayer1->GetOutputSlot(0).SetTensorInfo(inputTensorInfo1);
1210 inputLayer2->GetOutputSlot(0).Connect(equalLayer->GetInputSlot(1));
1211 inputLayer2->GetOutputSlot(0).SetTensorInfo(inputTensorInfo2);
1212 equalLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1213 equalLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
1214
1215 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
1216 BOOST_CHECK(deserializedNetwork);
1217
1218 VerifyEqualName nameChecker;
1219 deserializedNetwork->Accept(nameChecker);
1220
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +00001221 CheckDeserializedNetworkAgainstOriginal<float>(*deserializedNetwork,
Matteo Martincighf81edaa2019-03-04 14:34:30 +00001222 *network,
1223 {inputTensorInfo1.GetShape(), inputTensorInfo2.GetShape()},
1224 {outputTensorInfo.GetShape()},
1225 {0, 1});
Nattapat Chaimanowong235cea52019-02-28 16:27:30 +00001226}
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +00001227
1228BOOST_AUTO_TEST_CASE(SerializeDeserializePad)
1229{
1230 class VerifyPadName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
1231 {
1232 public:
1233 void VisitPadLayer(const armnn::IConnectableLayer*,
1234 const armnn::PadDescriptor& descriptor,
1235 const char* name) override
1236 {
1237 BOOST_TEST(name == "PadLayer");
1238 }
1239 };
1240
1241 armnn::PadDescriptor desc({{0, 0}, {1, 0}, {1, 1}, {1, 2}});
1242
1243 const armnn::TensorInfo inputTensorInfo = armnn::TensorInfo({1, 2, 3, 4}, armnn::DataType::Float32);
1244 const armnn::TensorInfo outputTensorInfo = armnn::TensorInfo({1, 3, 5, 7}, armnn::DataType::Float32);
1245
1246 armnn::INetworkPtr network = armnn::INetwork::Create();
1247 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1248 armnn::IConnectableLayer* const padLayer = network->AddPadLayer(desc, "PadLayer");
1249 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1250
1251 inputLayer->GetOutputSlot(0).Connect(padLayer->GetInputSlot(0));
1252 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
1253 padLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1254 padLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
1255
1256 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
1257 BOOST_CHECK(deserializedNetwork);
1258
1259 VerifyPadName nameChecker;
1260 deserializedNetwork->Accept(nameChecker);
1261
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +00001262 CheckDeserializedNetworkAgainstOriginal<float>(*deserializedNetwork,
Matteo Martincighf81edaa2019-03-04 14:34:30 +00001263 *network,
1264 {inputTensorInfo.GetShape()},
1265 {outputTensorInfo.GetShape()});
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +00001266}
1267
Jim Flynnac25a1b2019-02-28 10:40:49 +00001268BOOST_AUTO_TEST_CASE(SerializeDeserializeRsqrt)
Sadik Armagan8b42a382019-03-01 14:24:49 +00001269{
1270 class VerifyRsqrtName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
1271 {
1272 public:
1273 void VisitRsqrtLayer(const armnn::IConnectableLayer*, const char* name) override
1274 {
1275 BOOST_TEST(name == "rsqrt");
1276 }
1277 };
1278
1279 const armnn::TensorInfo tensorInfo({ 3, 1, 2 }, armnn::DataType::Float32);
1280
1281 armnn::INetworkPtr network = armnn::INetwork::Create();
1282 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1283 armnn::IConnectableLayer* const rsqrtLayer = network->AddRsqrtLayer("rsqrt");
1284 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1285
1286 inputLayer->GetOutputSlot(0).Connect(rsqrtLayer->GetInputSlot(0));
1287 rsqrtLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1288
1289 inputLayer->GetOutputSlot(0).SetTensorInfo(tensorInfo);
1290 rsqrtLayer->GetOutputSlot(0).SetTensorInfo(tensorInfo);
1291
1292 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
1293 BOOST_CHECK(deserializedNetwork);
1294
1295 VerifyRsqrtName nameChecker;
1296 deserializedNetwork->Accept(nameChecker);
1297
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +00001298 CheckDeserializedNetworkAgainstOriginal<float>(*deserializedNetwork,
1299 *network,
1300 {tensorInfo.GetShape()},
1301 {tensorInfo.GetShape()});
Sadik Armagan8b42a382019-03-01 14:24:49 +00001302}
1303
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +00001304BOOST_AUTO_TEST_CASE(SerializeDeserializeResizeBilinear)
1305{
1306 class VerifyResizeBilinearName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
1307 {
1308 public:
1309 void VisitResizeBilinearLayer(const armnn::IConnectableLayer*,
1310 const armnn::ResizeBilinearDescriptor& descriptor,
1311 const char* name) override
1312 {
1313 BOOST_TEST(name == "ResizeBilinearLayer");
1314 }
1315 };
1316
1317 armnn::ResizeBilinearDescriptor desc;
1318 desc.m_TargetWidth = 4;
1319 desc.m_TargetHeight = 2;
1320
1321 const armnn::TensorInfo inputTensorInfo = armnn::TensorInfo({1, 3, 5, 5}, armnn::DataType::Float32);
1322 const armnn::TensorInfo outputTensorInfo = armnn::TensorInfo({1, 3, 2, 4}, armnn::DataType::Float32);
1323
1324 armnn::INetworkPtr network = armnn::INetwork::Create();
1325 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1326 armnn::IConnectableLayer* const resizeLayer = network->AddResizeBilinearLayer(desc, "ResizeBilinearLayer");
1327 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1328
1329 inputLayer->GetOutputSlot(0).Connect(resizeLayer->GetInputSlot(0));
1330 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
1331 resizeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1332 resizeLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
1333
1334 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
1335 BOOST_CHECK(deserializedNetwork);
1336
1337 VerifyResizeBilinearName nameChecker;
1338 deserializedNetwork->Accept(nameChecker);
1339
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +00001340 CheckDeserializedNetworkAgainstOriginal<float>(*deserializedNetwork,
1341 *network,
1342 {inputTensorInfo.GetShape()},
1343 {outputTensorInfo.GetShape()});
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +00001344}
1345
Conor Kennedyda1f9752019-03-01 14:37:12 +00001346BOOST_AUTO_TEST_CASE(SerializeDeserializeSubtraction)
1347{
1348 class VerifySubtractionName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
1349 {
1350 public:
1351 void VisitSubtractionLayer(const armnn::IConnectableLayer*, const char* name) override
1352 {
1353 BOOST_TEST(name == "subtraction");
1354 }
1355 };
1356
1357 const armnn::TensorInfo info = armnn::TensorInfo({ 1, 4 }, armnn::DataType::Float32);
1358
1359 armnn::INetworkPtr network = armnn::INetwork::Create();
1360 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
1361 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
1362 armnn::IConnectableLayer* const subtractionLayer = network->AddSubtractionLayer("subtraction");
1363 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1364
1365 inputLayer0->GetOutputSlot(0).Connect(subtractionLayer->GetInputSlot(0));
1366 inputLayer1->GetOutputSlot(0).Connect(subtractionLayer->GetInputSlot(1));
1367 subtractionLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1368
1369 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
1370 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
1371 subtractionLayer->GetOutputSlot(0).SetTensorInfo(info);
1372
1373 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
1374 BOOST_CHECK(deserializedNetwork);
1375
1376 VerifySubtractionName nameChecker;
1377 deserializedNetwork->Accept(nameChecker);
1378
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +00001379 CheckDeserializedNetworkAgainstOriginal<float>(*deserializedNetwork,
1380 *network,
1381 {info.GetShape(), info.GetShape()},
1382 {info.GetShape()},
1383 {0, 1});
Conor Kennedyda1f9752019-03-01 14:37:12 +00001384}
1385
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001386BOOST_AUTO_TEST_CASE(SerializeDeserializeStridedSlice)
1387{
1388 class VerifyStridedSliceName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
1389 {
1390 public:
1391 void VisitStridedSliceLayer(const armnn::IConnectableLayer*,
1392 const armnn::StridedSliceDescriptor& descriptor,
1393 const char* name) override
1394 {
1395 BOOST_TEST(name == "StridedSliceLayer");
1396 }
1397 };
1398
1399 armnn::StridedSliceDescriptor desc({0, 0, 1, 0}, {1, 1, 1, 1}, {1, 1, 1, 1});
1400 desc.m_EndMask = (1 << 4) - 1;
1401 desc.m_ShrinkAxisMask = (1 << 1) | (1 << 2);
1402 desc.m_DataLayout = armnn::DataLayout::NCHW;
1403
1404 const armnn::TensorInfo inputTensorInfo = armnn::TensorInfo({3, 2, 3, 1}, armnn::DataType::Float32);
1405 const armnn::TensorInfo outputTensorInfo = armnn::TensorInfo({3, 1}, armnn::DataType::Float32);
1406
1407 armnn::INetworkPtr network = armnn::INetwork::Create();
1408 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1409 armnn::IConnectableLayer* const stridedSliceLayer = network->AddStridedSliceLayer(desc, "StridedSliceLayer");
1410 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1411
1412 inputLayer->GetOutputSlot(0).Connect(stridedSliceLayer->GetInputSlot(0));
1413 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
1414 stridedSliceLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1415 stridedSliceLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
1416
1417 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
1418 BOOST_CHECK(deserializedNetwork);
1419
1420 VerifyStridedSliceName nameChecker;
1421 deserializedNetwork->Accept(nameChecker);
1422
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +00001423 CheckDeserializedNetworkAgainstOriginal<float>(*deserializedNetwork,
1424 *network,
1425 {inputTensorInfo.GetShape()},
1426 {outputTensorInfo.GetShape()});
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001427}
1428
Sadik Armaganac97c8c2019-03-04 17:44:21 +00001429BOOST_AUTO_TEST_CASE(SerializeDeserializeMean)
1430{
1431 class VerifyMeanName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
1432 {
1433 public:
1434 void VisitMeanLayer(const armnn::IConnectableLayer*, const armnn::MeanDescriptor&, const char* name)
1435 {
1436 BOOST_TEST(name == "mean");
1437 }
1438 };
1439
1440 armnn::TensorInfo inputTensorInfo({1, 1, 3, 2}, armnn::DataType::Float32);
1441 armnn::TensorInfo outputTensorInfo({1, 1, 1, 2}, armnn::DataType::Float32);
1442
1443 armnn::MeanDescriptor descriptor;
1444 descriptor.m_Axis = { 2 };
1445 descriptor.m_KeepDims = true;
1446
1447 armnn::INetworkPtr network = armnn::INetwork::Create();
1448 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1449 armnn::IConnectableLayer* const meanLayer = network->AddMeanLayer(descriptor, "mean");
1450 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1451
1452 inputLayer->GetOutputSlot(0).Connect(meanLayer->GetInputSlot(0));
1453 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
1454 meanLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1455 meanLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
1456
1457 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
1458 BOOST_CHECK(deserializedNetwork);
1459
1460 VerifyMeanName nameChecker;
1461 deserializedNetwork->Accept(nameChecker);
1462
1463 CheckDeserializedNetworkAgainstOriginal<float>(*deserializedNetwork,
1464 *network,
1465 {inputTensorInfo.GetShape()},
1466 {outputTensorInfo.GetShape()});
1467}
1468
Jim Flynnac25a1b2019-02-28 10:40:49 +00001469BOOST_AUTO_TEST_CASE(SerializeDeserializeMerger)
1470{
1471 class VerifyMergerName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
1472 {
1473 public:
1474 void VisitMergerLayer(const armnn::IConnectableLayer* layer,
1475 const armnn::OriginsDescriptor& mergerDescriptor,
1476 const char* name = nullptr) override
1477 {
1478 BOOST_TEST(name == "MergerLayer");
1479 }
1480 };
1481
1482 unsigned int inputShapeOne[] = {2, 3, 2, 2};
1483 unsigned int inputShapeTwo[] = {2, 3, 2, 2};
1484 unsigned int outputShape[] = {4, 3, 2, 2};
1485
1486 const armnn::TensorInfo inputOneTensorInfo = armnn::TensorInfo(4, inputShapeOne, armnn::DataType::Float32);
1487 const armnn::TensorInfo inputTwoTensorInfo = armnn::TensorInfo(4, inputShapeTwo, armnn::DataType::Float32);
1488 const armnn::TensorInfo outputTensorInfo = armnn::TensorInfo(4, outputShape, armnn::DataType::Float32);
1489
1490 std::vector<armnn::TensorShape> shapes;
1491 shapes.push_back(inputOneTensorInfo.GetShape());
1492 shapes.push_back(inputTwoTensorInfo.GetShape());
1493
1494 armnn::MergerDescriptor descriptor =
1495 armnn::CreateMergerDescriptorForConcatenation(shapes.begin(), shapes.end(), 0);
1496
1497 armnn::INetworkPtr network = armnn::INetwork::Create();
1498 armnn::IConnectableLayer* const inputLayerOne = network->AddInputLayer(0);
1499 inputLayerOne->GetOutputSlot(0).SetTensorInfo(inputOneTensorInfo);
1500 armnn::IConnectableLayer* const inputLayerTwo = network->AddInputLayer(1);
1501 inputLayerTwo->GetOutputSlot(0).SetTensorInfo(inputTwoTensorInfo);
1502 armnn::IConnectableLayer* const mergerLayer = network->AddMergerLayer(descriptor, "MergerLayer");
1503 mergerLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
1504 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1505
1506 inputLayerOne->GetOutputSlot(0).Connect(mergerLayer->GetInputSlot(0));
1507 inputLayerTwo->GetOutputSlot(0).Connect(mergerLayer->GetInputSlot(1));
1508 mergerLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1509
1510 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
1511 BOOST_CHECK(deserializedNetwork);
1512
1513 VerifyMergerName nameChecker;
1514 deserializedNetwork->Accept(nameChecker);
1515
1516 CheckDeserializedNetworkAgainstOriginal<float>(*deserializedNetwork,
1517 *network,
1518 {inputOneTensorInfo.GetShape(), inputTwoTensorInfo.GetShape()},
1519 {outputTensorInfo.GetShape()},
1520 {0, 1});
1521}
1522
Jim Flynn18ce3382019-03-08 11:08:30 +00001523BOOST_AUTO_TEST_CASE(SerializeDeserializeSplitter)
1524{
1525 class VerifySplitterName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
1526 {
1527 public:
1528 void VisitSplitterLayer(const armnn::IConnectableLayer*,
1529 const armnn::ViewsDescriptor& viewsDescriptor,
1530 const char* name) override
1531 {
1532 BOOST_TEST(name == "splitter");
1533 }
1534 };
1535
1536 unsigned int numViews = 3;
1537 unsigned int numDimensions = 4;
1538 unsigned int inputShape[] = {1,18, 4, 4};
1539 unsigned int outputShape[] = {1, 6, 4, 4};
1540
1541 auto inputTensorInfo = armnn::TensorInfo(numDimensions, inputShape, armnn::DataType::Float32);
1542 auto outputTensorInfo = armnn::TensorInfo(numDimensions, outputShape, armnn::DataType::Float32);
1543
1544 // This is modelled on how the caffe parser sets up a splitter layer to partition an input
1545 // along dimension one.
1546 unsigned int splitterDimSizes[4] = {static_cast<unsigned int>(inputShape[0]),
1547 static_cast<unsigned int>(inputShape[1]),
1548 static_cast<unsigned int>(inputShape[2]),
1549 static_cast<unsigned int>(inputShape[3])};
1550 splitterDimSizes[1] /= numViews;
1551 armnn::ViewsDescriptor desc(numViews, numDimensions);
1552
1553 for (unsigned int g = 0; g < numViews; ++g)
1554 {
1555 desc.SetViewOriginCoord(g, 1, splitterDimSizes[1] * g);
1556
1557 // Set the size of the views.
1558 for (unsigned int dimIdx=0; dimIdx < 4; dimIdx++)
1559 {
1560 desc.SetViewSize(g, dimIdx, splitterDimSizes[dimIdx]);
1561 }
1562 }
1563
1564 const char* splitterLayerName = "splitter";
1565
1566 armnn::INetworkPtr network = armnn::INetwork::Create();
1567 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1568 armnn::IConnectableLayer* const splitterLayer = network->AddSplitterLayer(desc, splitterLayerName);
1569 armnn::IConnectableLayer* const outputLayer0 = network->AddOutputLayer(0);
1570 armnn::IConnectableLayer* const outputLayer1 = network->AddOutputLayer(1);
1571 armnn::IConnectableLayer* const outputLayer2 = network->AddOutputLayer(2);
1572
1573 inputLayer->GetOutputSlot(0).Connect(splitterLayer->GetInputSlot(0));
1574 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
1575 splitterLayer->GetOutputSlot(0).Connect(outputLayer0->GetInputSlot(0));
1576 splitterLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
1577 splitterLayer->GetOutputSlot(1).Connect(outputLayer1->GetInputSlot(0));
1578 splitterLayer->GetOutputSlot(1).SetTensorInfo(outputTensorInfo);
1579 splitterLayer->GetOutputSlot(2).Connect(outputLayer2->GetInputSlot(0));
1580 splitterLayer->GetOutputSlot(2).SetTensorInfo(outputTensorInfo);
1581
1582 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
1583 BOOST_CHECK(deserializedNetwork);
1584
1585 VerifySplitterName nameChecker;
1586 deserializedNetwork->Accept(nameChecker);
1587
1588 CheckDeserializedNetworkAgainstOriginal<float>(*deserializedNetwork,
1589 *network,
1590 {inputTensorInfo.GetShape()},
1591 {outputTensorInfo.GetShape(),
1592 outputTensorInfo.GetShape(),
1593 outputTensorInfo.GetShape()},
1594 {0},
1595 {0, 1, 2});
1596}
1597
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +00001598BOOST_AUTO_TEST_CASE(SerializeDeserializeDetectionPostProcess)
1599{
1600 class VerifyDetectionPostProcessName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
1601 {
1602 public:
1603 void VisitDetectionPostProcessLayer(const armnn::IConnectableLayer* layer,
1604 const armnn::DetectionPostProcessDescriptor& descriptor,
1605 const armnn::ConstTensor& anchors,
1606 const char* name) override
1607 {
1608 BOOST_TEST(name == "DetectionPostProcessLayer");
1609 }
1610 };
1611
1612 const armnn::TensorInfo inputInfos[] = {
1613 armnn::TensorInfo({ 1, 6, 4 }, armnn::DataType::Float32),
1614 armnn::TensorInfo({ 1, 6, 3}, armnn::DataType::Float32)
1615 };
1616
1617 const armnn::TensorInfo outputInfos[] = {
1618 armnn::TensorInfo({ 1, 3, 4 }, armnn::DataType::Float32),
1619 armnn::TensorInfo({ 1, 3 }, armnn::DataType::Float32),
1620 armnn::TensorInfo({ 1, 3 }, armnn::DataType::Float32),
1621 armnn::TensorInfo({ 1 }, armnn::DataType::Float32)
1622 };
1623
1624 armnn::DetectionPostProcessDescriptor desc;
1625 desc.m_UseRegularNms = true;
1626 desc.m_MaxDetections = 3;
1627 desc.m_MaxClassesPerDetection = 1;
1628 desc.m_DetectionsPerClass =1;
1629 desc.m_NmsScoreThreshold = 0.0;
1630 desc.m_NmsIouThreshold = 0.5;
1631 desc.m_NumClasses = 2;
1632 desc.m_ScaleY = 10.0;
1633 desc.m_ScaleX = 10.0;
1634 desc.m_ScaleH = 5.0;
1635 desc.m_ScaleW = 5.0;
1636
1637 const armnn::TensorInfo anchorsInfo({ 6, 4 }, armnn::DataType::Float32);
1638 const std::vector<float> anchorsData({
1639 0.5f, 0.5f, 1.0f, 1.0f,
1640 0.5f, 0.5f, 1.0f, 1.0f,
1641 0.5f, 0.5f, 1.0f, 1.0f,
1642 0.5f, 10.5f, 1.0f, 1.0f,
1643 0.5f, 10.5f, 1.0f, 1.0f,
1644 0.5f, 100.5f, 1.0f, 1.0f
1645 });
1646 armnn::ConstTensor anchors(anchorsInfo, anchorsData);
1647
1648 armnn::INetworkPtr network = armnn::INetwork::Create();
1649
1650 armnn::IConnectableLayer* const detectionLayer =
1651 network->AddDetectionPostProcessLayer(desc, anchors, "DetectionPostProcessLayer");
1652
1653 for (unsigned int i = 0; i < 2; i++)
1654 {
1655 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(static_cast<int>(i));
1656 inputLayer->GetOutputSlot(0).Connect(detectionLayer->GetInputSlot(i));
1657 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfos[i]);
1658 }
1659
1660 for (unsigned int i = 0; i < 4; i++)
1661 {
1662 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(static_cast<int>(i));
1663 detectionLayer->GetOutputSlot(i).Connect(outputLayer->GetInputSlot(0));
1664 detectionLayer->GetOutputSlot(i).SetTensorInfo(outputInfos[i]);
1665 }
1666
1667 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
1668 BOOST_CHECK(deserializedNetwork);
1669
1670 VerifyDetectionPostProcessName nameChecker;
1671 deserializedNetwork->Accept(nameChecker);
1672
1673 CheckDeserializedNetworkAgainstOriginal<float>(
1674 *network,
1675 *deserializedNetwork,
1676 {inputInfos[0].GetShape(), inputInfos[1].GetShape()},
1677 {outputInfos[0].GetShape(), outputInfos[1].GetShape(), outputInfos[2].GetShape(), outputInfos[3].GetShape()},
1678 {0, 1},
1679 {0, 1, 2, 3});
1680}
1681
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +00001682BOOST_AUTO_TEST_SUITE_END()