blob: 271b3e71bdc68fddc9bf31a4bb8700698650c8c7 [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
64void CheckDeserializedNetworkAgainstOriginal(const armnn::INetwork& deserializedNetwork,
65 const armnn::INetwork& originalNetwork,
Nattapat Chaimanowong8d69bbc2019-02-27 16:52:29 +000066 const std::vector<armnn::TensorShape>& inputShapes,
67 const std::vector<armnn::TensorShape>& outputShapes,
68 const std::vector<armnn::LayerBindingId>& inputBindingIds = {0},
69 const std::vector<armnn::LayerBindingId>& outputBindingIds = {0})
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +000070{
Nattapat Chaimanowong8d69bbc2019-02-27 16:52:29 +000071 BOOST_CHECK(inputShapes.size() == inputBindingIds.size());
72 BOOST_CHECK(outputShapes.size() == outputBindingIds.size());
73
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +000074 armnn::IRuntime::CreationOptions options;
75 armnn::IRuntimePtr runtime = armnn::IRuntime::Create(options);
76
77 std::vector<armnn::BackendId> preferredBackends = { armnn::BackendId("CpuRef") };
78
79 // Optimize original network
80 armnn::IOptimizedNetworkPtr optimizedOriginalNetwork =
81 armnn::Optimize(originalNetwork, preferredBackends, runtime->GetDeviceSpec());
82 BOOST_CHECK(optimizedOriginalNetwork);
83
84 // Optimize deserialized network
85 armnn::IOptimizedNetworkPtr optimizedDeserializedNetwork =
86 armnn::Optimize(deserializedNetwork, preferredBackends, runtime->GetDeviceSpec());
87 BOOST_CHECK(optimizedDeserializedNetwork);
88
89 armnn::NetworkId networkId1;
90 armnn::NetworkId networkId2;
91
92 // Load original and deserialized network
93 armnn::Status status1 = runtime->LoadNetwork(networkId1, std::move(optimizedOriginalNetwork));
94 BOOST_CHECK(status1 == armnn::Status::Success);
95
96 armnn::Status status2 = runtime->LoadNetwork(networkId2, std::move(optimizedDeserializedNetwork));
97 BOOST_CHECK(status2 == armnn::Status::Success);
98
99 // Generate some input data
Nattapat Chaimanowong8d69bbc2019-02-27 16:52:29 +0000100 armnn::InputTensors inputTensors1;
101 armnn::InputTensors inputTensors2;
102 std::vector<std::vector<float>> inputData;
103 inputData.reserve(inputShapes.size());
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000104
Nattapat Chaimanowong8d69bbc2019-02-27 16:52:29 +0000105 for (unsigned int i = 0; i < inputShapes.size(); i++)
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000106 {
Nattapat Chaimanowong8d69bbc2019-02-27 16:52:29 +0000107 inputData.push_back(GenerateRandomData<float>(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;
118 std::vector<std::vector<float>> outputData1;
119 std::vector<std::vector<float>> outputData2;
120 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
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000151BOOST_AUTO_TEST_CASE(SerializeAddition)
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);
Mike Kelly8c1701a2019-02-11 17:01:27 +0000191}
192
Conor Kennedy76277882019-02-26 08:29:54 +0000193BOOST_AUTO_TEST_CASE(SerializeConstant)
194{
195 armnn::INetworkPtr network = armnn::INetwork::Create();
196
197 armnn::ConstTensor inputTensor;
198
199 armnn::IConnectableLayer* const inputLayer0 = network->AddConstantLayer(inputTensor, "constant");
200 armnn::IConnectableLayer* const outputLayer0 = network->AddOutputLayer(0);
201
202 inputLayer0->GetOutputSlot(0).Connect(outputLayer0->GetInputSlot(0));
203
204 armnnSerializer::Serializer serializer;
205 serializer.Serialize(*network);
206
207 std::stringstream stream;
208 serializer.SaveSerializedToStream(stream);
209 BOOST_TEST(stream.str().length() > 0);
210 BOOST_TEST(stream.str().find("constant") != stream.str().npos);
211}
212
213BOOST_AUTO_TEST_CASE(SerializeDeserializeConstant)
214{
215 class VerifyConstantName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
216 {
217 public:
218 void VisitConstantLayer(const armnn::IConnectableLayer*, const armnn::ConstTensor&, const char* name) override
219 {
220 BOOST_TEST(name == "constant");
221 }
222 };
223
224 armnn::TensorInfo commonTensorInfo({ 2, 3 }, armnn::DataType::Float32);
225
226 std::vector<float> constantData = GenerateRandomData<float>(commonTensorInfo.GetNumElements());
227 armnn::ConstTensor constTensor(commonTensorInfo, constantData);
228
229 // Builds up the structure of the network.
230 armnn::INetworkPtr net(armnn::INetwork::Create());
231
232 armnn::IConnectableLayer* input = net->AddInputLayer(0);
233 armnn::IConnectableLayer* constant = net->AddConstantLayer(constTensor, "constant");
234 armnn::IConnectableLayer* add = net->AddAdditionLayer();
235 armnn::IConnectableLayer* output = net->AddOutputLayer(0);
236
237 input->GetOutputSlot(0).Connect(add->GetInputSlot(0));
238 constant->GetOutputSlot(0).Connect(add->GetInputSlot(1));
239 add->GetOutputSlot(0).Connect(output->GetInputSlot(0));
240
241 // Sets the tensors in the network.
242 input->GetOutputSlot(0).SetTensorInfo(commonTensorInfo);
243 constant->GetOutputSlot(0).SetTensorInfo(commonTensorInfo);
244 add->GetOutputSlot(0).SetTensorInfo(commonTensorInfo);
245
246 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*net));
247 BOOST_CHECK(deserializedNetwork);
248
249 VerifyConstantName nameChecker;
250 deserializedNetwork->Accept(nameChecker);
251
252 CheckDeserializedNetworkAgainstOriginal(*net,
253 *deserializedNetwork,
Nattapat Chaimanowong8d69bbc2019-02-27 16:52:29 +0000254 {commonTensorInfo.GetShape()},
255 {commonTensorInfo.GetShape()});
Conor Kennedy76277882019-02-26 08:29:54 +0000256}
257
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000258BOOST_AUTO_TEST_CASE(SerializeMinimum)
259{
260 class VerifyMinimumName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
261 {
262 public:
263 explicit VerifyMinimumName(const std::string& expectedMinimumLayerName)
264 : m_ExpectedMinimumLayerName(expectedMinimumLayerName) {}
265
266 void VisitMinimumLayer(const armnn::IConnectableLayer*, const char* name) override
267 {
268 BOOST_TEST(name == m_ExpectedMinimumLayerName.c_str());
269 }
270
271 private:
272 std::string m_ExpectedMinimumLayerName;
273 };
274
275 const armnn::TensorInfo info({ 1, 2, 2, 3 }, armnn::DataType::Float32);
276
277 armnn::INetworkPtr network = armnn::INetwork::Create();
278 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
279 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
280
281 const std::string minimumLayerName("minimum");
282
283 armnn::IConnectableLayer* const minimumLayer = network->AddMinimumLayer(minimumLayerName.c_str());
284 inputLayer0->GetOutputSlot(0).Connect(minimumLayer->GetInputSlot(0));
285 inputLayer1->GetOutputSlot(0).Connect(minimumLayer->GetInputSlot(1));
286
287 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
288 minimumLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
289
290 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
291 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
292 minimumLayer->GetOutputSlot(0).SetTensorInfo(info);
293
294 armnnSerializer::Serializer serializer;
295 serializer.Serialize(*network);
296
297 std::stringstream stream;
298 serializer.SaveSerializedToStream(stream);
299 BOOST_TEST(stream.str().length() > 0);
300 BOOST_TEST(stream.str().find(minimumLayerName) != stream.str().npos);
301
302 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(stream.str());
303 BOOST_CHECK(deserializedNetwork);
304
305 VerifyMinimumName nameChecker(minimumLayerName);
306 deserializedNetwork->Accept(nameChecker);
307}
308
Aron Virginas-Tar377351e2019-02-27 14:42:31 +0000309BOOST_AUTO_TEST_CASE(SerializeMaximum)
310{
311 class VerifyMaximumName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
312 {
313 public:
314 explicit VerifyMaximumName(const std::string& expectedMaximumLayerName)
315 : m_ExpectedMaximumLayerName(expectedMaximumLayerName) {}
316
317 void VisitMaximumLayer(const armnn::IConnectableLayer*, const char* name) override
318 {
319 BOOST_TEST(name == m_ExpectedMaximumLayerName.c_str());
320 }
321
322 private:
323 std::string m_ExpectedMaximumLayerName;
324 };
325
326 const armnn::TensorInfo info({ 1, 2, 2, 3 }, armnn::DataType::Float32);
327
328 armnn::INetworkPtr network = armnn::INetwork::Create();
329 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
330 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
331
332 const std::string maximumLayerName("maximum");
333
334 armnn::IConnectableLayer* const maximumLayer = network->AddMaximumLayer(maximumLayerName.c_str());
335 inputLayer0->GetOutputSlot(0).Connect(maximumLayer->GetInputSlot(0));
336 inputLayer1->GetOutputSlot(0).Connect(maximumLayer->GetInputSlot(1));
337
338 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
339 maximumLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
340
341 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
342 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
343 maximumLayer->GetOutputSlot(0).SetTensorInfo(info);
344
345 armnnSerializer::Serializer serializer;
346 serializer.Serialize(*network);
347
348 std::stringstream stream;
349 serializer.SaveSerializedToStream(stream);
350 BOOST_TEST(stream.str().length() > 0);
351 BOOST_TEST(stream.str().find(maximumLayerName) != stream.str().npos);
352
353 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(stream.str());
354 BOOST_CHECK(deserializedNetwork);
355
356 VerifyMaximumName nameChecker(maximumLayerName);
357 deserializedNetwork->Accept(nameChecker);
358}
359
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000360BOOST_AUTO_TEST_CASE(SerializeMultiplication)
Sadik Armagan5f450272019-02-12 14:31:45 +0000361{
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000362 class VerifyMultiplicationName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
363 {
364 public:
365 void VisitMultiplicationLayer(const armnn::IConnectableLayer*, const char* name) override
366 {
367 BOOST_TEST(name == "multiplication");
368 }
369 };
370
Sadik Armagan5f450272019-02-12 14:31:45 +0000371 const armnn::TensorInfo info({ 1, 5, 2, 3 }, armnn::DataType::Float32);
372
373 armnn::INetworkPtr network = armnn::INetwork::Create();
374 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
375 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
376
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000377 const char* multLayerName = "multiplication";
Sadik Armagan5f450272019-02-12 14:31:45 +0000378
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000379 armnn::IConnectableLayer* const multiplicationLayer = network->AddMultiplicationLayer(multLayerName);
380 inputLayer0->GetOutputSlot(0).Connect(multiplicationLayer->GetInputSlot(0));
381 inputLayer1->GetOutputSlot(0).Connect(multiplicationLayer->GetInputSlot(1));
Sadik Armagan5f450272019-02-12 14:31:45 +0000382
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000383 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
384 multiplicationLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
Sadik Armagan5f450272019-02-12 14:31:45 +0000385
Jim Flynn3091b062019-02-15 14:45:04 +0000386 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
387 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000388 multiplicationLayer->GetOutputSlot(0).SetTensorInfo(info);
Jim Flynn3091b062019-02-15 14:45:04 +0000389
Sadik Armagan5f450272019-02-12 14:31:45 +0000390 armnnSerializer::Serializer serializer;
391 serializer.Serialize(*network);
392
393 std::stringstream stream;
394 serializer.SaveSerializedToStream(stream);
395 BOOST_TEST(stream.str().length() > 0);
396 BOOST_TEST(stream.str().find(multLayerName) != stream.str().npos);
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000397
398 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(stream.str());
399 BOOST_CHECK(deserializedNetwork);
400
401 VerifyMultiplicationName nameChecker;
402 deserializedNetwork->Accept(nameChecker);
Sadik Armagan5f450272019-02-12 14:31:45 +0000403}
404
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000405BOOST_AUTO_TEST_CASE(SerializeDeserializeConvolution2d)
Saoirse Stewart263829c2019-02-19 15:54:14 +0000406{
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000407
408 class VerifyConvolution2dName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
409 {
410 public:
411 void VisitConvolution2dLayer(const armnn::IConnectableLayer*,
412 const armnn::Convolution2dDescriptor&,
413 const armnn::ConstTensor&,
414 const armnn::Optional<armnn::ConstTensor>&,
415 const char* name) override
416 {
417 BOOST_TEST(name == "convolution");
418 }
419 };
420
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000421 armnn::TensorInfo inputInfo ({ 1, 5, 5, 1 }, armnn::DataType::Float32);
422 armnn::TensorInfo outputInfo({ 1, 3, 3, 1 }, armnn::DataType::Float32);
Saoirse Stewart263829c2019-02-19 15:54:14 +0000423
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000424 armnn::TensorInfo weightsInfo({ 1, 3, 3, 1 }, armnn::DataType::Float32);
425 armnn::TensorInfo biasesInfo ({ 1 }, armnn::DataType::Float32);
426
427 // Construct network
428 armnn::INetworkPtr network = armnn::INetwork::Create();
429
430 armnn::Convolution2dDescriptor descriptor;
431 descriptor.m_PadLeft = 1;
432 descriptor.m_PadRight = 1;
433 descriptor.m_PadTop = 1;
434 descriptor.m_PadBottom = 1;
435 descriptor.m_StrideX = 2;
436 descriptor.m_StrideY = 2;
437 descriptor.m_BiasEnabled = true;
438 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
439
440 std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements());
441 armnn::ConstTensor weights(weightsInfo, weightsData);
442
443 std::vector<float> biasesData = GenerateRandomData<float>(biasesInfo.GetNumElements());
444 armnn::ConstTensor biases(biasesInfo, biasesData);
445
446 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0, "input");
447 armnn::IConnectableLayer* const convLayer =
448 network->AddConvolution2dLayer(descriptor, weights, biases, "convolution");
449 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0, "output");
450
451 inputLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(0));
452 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
453
454 convLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
455 convLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
456
457 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
458 BOOST_CHECK(deserializedNetwork);
459
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000460 VerifyConvolution2dName nameChecker;
461 deserializedNetwork->Accept(nameChecker);
462
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000463 CheckDeserializedNetworkAgainstOriginal(*network,
464 *deserializedNetwork,
Nattapat Chaimanowong8d69bbc2019-02-27 16:52:29 +0000465 {inputInfo.GetShape()},
466 {outputInfo.GetShape()});
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000467}
468
469BOOST_AUTO_TEST_CASE(SerializeDeserializeReshape)
470{
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000471 class VerifyReshapeName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
472 {
473 public:
474 void VisitReshapeLayer(const armnn::IConnectableLayer*, const armnn::ReshapeDescriptor&, const char* name)
475 {
476 BOOST_TEST(name == "reshape");
477 }
478 };
479
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000480 unsigned int inputShape[] = { 1, 9 };
481 unsigned int outputShape[] = { 3, 3 };
Saoirse Stewart263829c2019-02-19 15:54:14 +0000482
483 auto inputTensorInfo = armnn::TensorInfo(2, inputShape, armnn::DataType::Float32);
484 auto outputTensorInfo = armnn::TensorInfo(2, outputShape, armnn::DataType::Float32);
485 auto reshapeOutputTensorInfo = armnn::TensorInfo(2, outputShape, armnn::DataType::Float32);
486
487 armnn::ReshapeDescriptor reshapeDescriptor;
488 reshapeDescriptor.m_TargetShape = reshapeOutputTensorInfo.GetShape();
489
490 armnn::INetworkPtr network = armnn::INetwork::Create();
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000491 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
492 armnn::IConnectableLayer* const reshapeLayer = network->AddReshapeLayer(reshapeDescriptor, "reshape");
493 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
Saoirse Stewart263829c2019-02-19 15:54:14 +0000494
495 inputLayer->GetOutputSlot(0).Connect(reshapeLayer->GetInputSlot(0));
496 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
497 reshapeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
498 reshapeLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
499
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000500 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
501 BOOST_CHECK(deserializedNetwork);
Saoirse Stewart263829c2019-02-19 15:54:14 +0000502
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000503 VerifyReshapeName nameChecker;
504 deserializedNetwork->Accept(nameChecker);
505
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000506 CheckDeserializedNetworkAgainstOriginal(*network,
507 *deserializedNetwork,
Nattapat Chaimanowong8d69bbc2019-02-27 16:52:29 +0000508 {inputTensorInfo.GetShape()},
509 {outputTensorInfo.GetShape()});
Saoirse Stewart263829c2019-02-19 15:54:14 +0000510}
511
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000512BOOST_AUTO_TEST_CASE(SerializeDeserializeDepthwiseConvolution2d)
513{
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000514 class VerifyDepthwiseConvolution2dName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
515 {
516 public:
517 void VisitDepthwiseConvolution2dLayer(const armnn::IConnectableLayer*,
518 const armnn::DepthwiseConvolution2dDescriptor&,
519 const armnn::ConstTensor&,
520 const armnn::Optional<armnn::ConstTensor>&,
521 const char* name) override
522 {
523 BOOST_TEST(name == "depthwise_convolution");
524 }
525 };
526
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000527 armnn::TensorInfo inputInfo ({ 1, 5, 5, 3 }, armnn::DataType::Float32);
528 armnn::TensorInfo outputInfo({ 1, 3, 3, 3 }, armnn::DataType::Float32);
529
530 armnn::TensorInfo weightsInfo({ 1, 3, 3, 3 }, armnn::DataType::Float32);
531 armnn::TensorInfo biasesInfo ({ 3 }, armnn::DataType::Float32);
532
533 armnn::DepthwiseConvolution2dDescriptor descriptor;
534 descriptor.m_StrideX = 1;
535 descriptor.m_StrideY = 1;
536 descriptor.m_BiasEnabled = true;
537 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
538
539 std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements());
540 armnn::ConstTensor weights(weightsInfo, weightsData);
541
542 std::vector<int32_t> biasesData = GenerateRandomData<int32_t>(biasesInfo.GetNumElements());
543 armnn::ConstTensor biases(biasesInfo, biasesData);
544
545 armnn::INetworkPtr network = armnn::INetwork::Create();
546 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
547 armnn::IConnectableLayer* const depthwiseConvLayer =
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000548 network->AddDepthwiseConvolution2dLayer(descriptor, weights, biases, "depthwise_convolution");
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000549 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
550
551 inputLayer->GetOutputSlot(0).Connect(depthwiseConvLayer->GetInputSlot(0));
552 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
553 depthwiseConvLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
554 depthwiseConvLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
555
556 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
557 BOOST_CHECK(deserializedNetwork);
558
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000559 VerifyDepthwiseConvolution2dName nameChecker;
560 deserializedNetwork->Accept(nameChecker);
561
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000562 CheckDeserializedNetworkAgainstOriginal(*network,
563 *deserializedNetwork,
Nattapat Chaimanowong8d69bbc2019-02-27 16:52:29 +0000564 {inputInfo.GetShape()},
565 {outputInfo.GetShape()});
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000566}
567
568BOOST_AUTO_TEST_CASE(SerializeDeserializeSoftmax)
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000569{
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000570 class VerifySoftmaxName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
571 {
572 public:
573 void VisitSoftmaxLayer(const armnn::IConnectableLayer*, const armnn::SoftmaxDescriptor&, const char* name)
574 {
575 BOOST_TEST(name == "softmax");
576 }
577 };
578
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000579 armnn::TensorInfo tensorInfo({1, 10}, armnn::DataType::Float32);
580
581 armnn::SoftmaxDescriptor descriptor;
582 descriptor.m_Beta = 1.0f;
583
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000584 armnn::INetworkPtr network = armnn::INetwork::Create();
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000585 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
586 armnn::IConnectableLayer* const softmaxLayer = network->AddSoftmaxLayer(descriptor, "softmax");
587 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000588
589 inputLayer->GetOutputSlot(0).Connect(softmaxLayer->GetInputSlot(0));
590 inputLayer->GetOutputSlot(0).SetTensorInfo(tensorInfo);
591 softmaxLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
592 softmaxLayer->GetOutputSlot(0).SetTensorInfo(tensorInfo);
593
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000594 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000595 BOOST_CHECK(deserializedNetwork);
596
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000597 VerifySoftmaxName nameChecker;
598 deserializedNetwork->Accept(nameChecker);
599
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000600 CheckDeserializedNetworkAgainstOriginal(*network,
601 *deserializedNetwork,
Nattapat Chaimanowong8d69bbc2019-02-27 16:52:29 +0000602 {tensorInfo.GetShape()},
603 {tensorInfo.GetShape()});
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000604}
605
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000606BOOST_AUTO_TEST_CASE(SerializeDeserializePooling2d)
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000607{
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000608 class VerifyPooling2dName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
609 {
610 void VisitPooling2dLayer(const armnn::IConnectableLayer*, const armnn::Pooling2dDescriptor&, const char* name)
611 {
612 BOOST_TEST(name == "pooling2d");
613 }
614 };
615
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000616 unsigned int inputShape[] = {1, 2, 2, 1};
617 unsigned int outputShape[] = {1, 1, 1, 1};
618
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000619 auto inputInfo = armnn::TensorInfo(4, inputShape, armnn::DataType::Float32);
620 auto outputInfo = armnn::TensorInfo(4, outputShape, armnn::DataType::Float32);
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000621
622 armnn::Pooling2dDescriptor desc;
623 desc.m_DataLayout = armnn::DataLayout::NHWC;
624 desc.m_PadTop = 0;
625 desc.m_PadBottom = 0;
626 desc.m_PadLeft = 0;
627 desc.m_PadRight = 0;
628 desc.m_PoolType = armnn::PoolingAlgorithm::Average;
629 desc.m_OutputShapeRounding = armnn::OutputShapeRounding::Floor;
630 desc.m_PaddingMethod = armnn::PaddingMethod::Exclude;
631 desc.m_PoolHeight = 2;
632 desc.m_PoolWidth = 2;
633 desc.m_StrideX = 2;
634 desc.m_StrideY = 2;
635
636 armnn::INetworkPtr network = armnn::INetwork::Create();
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000637 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
638 armnn::IConnectableLayer* const pooling2dLayer = network->AddPooling2dLayer(desc, "pooling2d");
639 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000640
641 inputLayer->GetOutputSlot(0).Connect(pooling2dLayer->GetInputSlot(0));
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000642 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000643 pooling2dLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000644 pooling2dLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000645
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000646 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
647 BOOST_CHECK(deserializedNetwork);
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000648
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000649 VerifyPooling2dName nameChecker;
650 deserializedNetwork->Accept(nameChecker);
651
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000652 CheckDeserializedNetworkAgainstOriginal(*network,
653 *deserializedNetwork,
Nattapat Chaimanowong8d69bbc2019-02-27 16:52:29 +0000654 {inputInfo.GetShape()},
655 {outputInfo.GetShape()});
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000656}
657
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000658BOOST_AUTO_TEST_CASE(SerializeDeserializePermute)
659{
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000660 class VerifyPermuteName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
661 {
662 public:
663 void VisitPermuteLayer(const armnn::IConnectableLayer*, const armnn::PermuteDescriptor&, const char* name)
664 {
665 BOOST_TEST(name == "permute");
666 }
667 };
668
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000669 unsigned int inputShape[] = { 4, 3, 2, 1 };
670 unsigned int outputShape[] = { 1, 2, 3, 4 };
671 unsigned int dimsMapping[] = { 3, 2, 1, 0 };
672
673 auto inputTensorInfo = armnn::TensorInfo(4, inputShape, armnn::DataType::Float32);
674 auto outputTensorInfo = armnn::TensorInfo(4, outputShape, armnn::DataType::Float32);
675
676 armnn::PermuteDescriptor permuteDescriptor(armnn::PermutationVector(dimsMapping, 4));
677
678 armnn::INetworkPtr network = armnn::INetwork::Create();
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000679 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
680 armnn::IConnectableLayer* const permuteLayer = network->AddPermuteLayer(permuteDescriptor, "permute");
681 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000682
683 inputLayer->GetOutputSlot(0).Connect(permuteLayer->GetInputSlot(0));
684 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
685 permuteLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
686 permuteLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
687
688 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
689 BOOST_CHECK(deserializedNetwork);
690
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000691 VerifyPermuteName nameChecker;
692 deserializedNetwork->Accept(nameChecker);
693
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000694 CheckDeserializedNetworkAgainstOriginal(*network,
695 *deserializedNetwork,
Nattapat Chaimanowong8d69bbc2019-02-27 16:52:29 +0000696 {inputTensorInfo.GetShape()},
697 {outputTensorInfo.GetShape()});
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000698}
699
Sadik Armagandbb0c0c2019-02-21 09:01:41 +0000700BOOST_AUTO_TEST_CASE(SerializeDeserializeFullyConnected)
701{
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000702 class VerifyFullyConnectedName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
703 {
704 public:
705 void VisitFullyConnectedLayer(const armnn::IConnectableLayer*,
706 const armnn::FullyConnectedDescriptor&,
707 const armnn::ConstTensor&,
708 const armnn::Optional<armnn::ConstTensor>&,
709 const char* name) override
710 {
711 BOOST_TEST(name == "fully_connected");
712 }
713 };
714
Sadik Armagandbb0c0c2019-02-21 09:01:41 +0000715 armnn::TensorInfo inputInfo ({ 2, 5, 1, 1 }, armnn::DataType::Float32);
716 armnn::TensorInfo outputInfo({ 2, 3 }, armnn::DataType::Float32);
717
718 armnn::TensorInfo weightsInfo({ 5, 3 }, armnn::DataType::Float32);
719 armnn::TensorInfo biasesInfo ({ 3 }, armnn::DataType::Float32);
720
721 armnn::FullyConnectedDescriptor descriptor;
722 descriptor.m_BiasEnabled = true;
723 descriptor.m_TransposeWeightMatrix = false;
724
725 std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements());
726 std::vector<float> biasesData = GenerateRandomData<float>(biasesInfo.GetNumElements());
727
728 armnn::ConstTensor weights(weightsInfo, weightsData);
729 armnn::ConstTensor biases(biasesInfo, biasesData);
730
731 armnn::INetworkPtr network = armnn::INetwork::Create();
732 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0, "input");
733 armnn::IConnectableLayer* const fullyConnectedLayer = network->AddFullyConnectedLayer(descriptor,
734 weights,
735 biases,
736 "fully_connected");
737 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0, "output");
738
739 inputLayer->GetOutputSlot(0).Connect(fullyConnectedLayer->GetInputSlot(0));
740 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
741
742 fullyConnectedLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
743 fullyConnectedLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
744
745 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
746 BOOST_CHECK(deserializedNetwork);
747
Éanna Ó Catháin633f8592019-02-25 16:26:29 +0000748 VerifyFullyConnectedName nameChecker;
749 deserializedNetwork->Accept(nameChecker);
750
Sadik Armagandbb0c0c2019-02-21 09:01:41 +0000751 CheckDeserializedNetworkAgainstOriginal(*network,
752 *deserializedNetwork,
Nattapat Chaimanowong8d69bbc2019-02-27 16:52:29 +0000753 {inputInfo.GetShape()},
754 {outputInfo.GetShape()});
Sadik Armagandbb0c0c2019-02-21 09:01:41 +0000755}
756
Nattapat Chaimanowong45286992019-02-26 15:53:02 +0000757BOOST_AUTO_TEST_CASE(SerializeDeserializeSpaceToBatchNd)
758{
759 class VerifySpaceToBatchNdName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
760 {
761 public:
762 void VisitSpaceToBatchNdLayer(const armnn::IConnectableLayer*,
763 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
764 const char* name) override
765 {
766 BOOST_TEST(name == "SpaceToBatchNdLayer");
767 }
768 };
769
770 unsigned int inputShape[] = {2, 1, 2, 4};
771 unsigned int outputShape[] = {8, 1, 1, 3};
772
773 armnn::SpaceToBatchNdDescriptor desc;
774 desc.m_DataLayout = armnn::DataLayout::NCHW;
775 desc.m_BlockShape = {2, 2};
776 desc.m_PadList = {{0, 0}, {2, 0}};
777
778 auto inputTensorInfo = armnn::TensorInfo(4, inputShape, armnn::DataType::Float32);
779 auto outputTensorInfo = armnn::TensorInfo(4, outputShape, armnn::DataType::Float32);
780
781 armnn::INetworkPtr network = armnn::INetwork::Create();
782 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
783 armnn::IConnectableLayer* const spaceToBatchNdLayer = network->AddSpaceToBatchNdLayer(desc, "SpaceToBatchNdLayer");
784 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
785
786 inputLayer->GetOutputSlot(0).Connect(spaceToBatchNdLayer->GetInputSlot(0));
787 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
788 spaceToBatchNdLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
789 spaceToBatchNdLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
790
791 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
792 BOOST_CHECK(deserializedNetwork);
793
794 VerifySpaceToBatchNdName nameChecker;
795 deserializedNetwork->Accept(nameChecker);
796
797 CheckDeserializedNetworkAgainstOriginal(*network,
798 *deserializedNetwork,
Nattapat Chaimanowong8d69bbc2019-02-27 16:52:29 +0000799 {inputTensorInfo.GetShape()},
800 {outputTensorInfo.GetShape()});
Nattapat Chaimanowong45286992019-02-26 15:53:02 +0000801}
802
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000803BOOST_AUTO_TEST_CASE(SerializeDeserializeBatchToSpaceNd)
804{
805 class VerifyBatchToSpaceNdName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
806 {
807 public:
808 void VisitBatchToSpaceNdLayer(const armnn::IConnectableLayer*,
809 const armnn::BatchToSpaceNdDescriptor& descriptor,
810 const char* name) override
811 {
812 BOOST_TEST(name == "BatchToSpaceNdLayer");
813 }
814 };
815
816 unsigned int inputShape[] = {4, 1, 2, 2};
817 unsigned int outputShape[] = {1, 1, 4, 4};
818
819 armnn::BatchToSpaceNdDescriptor desc;
820 desc.m_DataLayout = armnn::DataLayout::NCHW;
821 desc.m_BlockShape = {2, 2};
822 desc.m_Crops = {{0, 0}, {0, 0}};
823
824 auto inputTensorInfo = armnn::TensorInfo(4, inputShape, armnn::DataType::Float32);
825 auto outputTensorInfo = armnn::TensorInfo(4, outputShape, armnn::DataType::Float32);
826
827 armnn::INetworkPtr network = armnn::INetwork::Create();
828 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
829 armnn::IConnectableLayer* const batchToSpaceNdLayer = network->AddBatchToSpaceNdLayer(desc, "BatchToSpaceNdLayer");
830 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
831
832 inputLayer->GetOutputSlot(0).Connect(batchToSpaceNdLayer->GetInputSlot(0));
833 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
834 batchToSpaceNdLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
835 batchToSpaceNdLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
836
837 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
838 BOOST_CHECK(deserializedNetwork);
839
840 VerifyBatchToSpaceNdName nameChecker;
841 deserializedNetwork->Accept(nameChecker);
842
843 CheckDeserializedNetworkAgainstOriginal(*network,
844 *deserializedNetwork,
Nattapat Chaimanowong8d69bbc2019-02-27 16:52:29 +0000845 {inputTensorInfo.GetShape()},
846 {outputTensorInfo.GetShape()});
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000847}
848
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000849BOOST_AUTO_TEST_CASE(SerializeDivision)
850{
851 class VerifyDivisionName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
852 {
853 public:
854 void VisitDivisionLayer(const armnn::IConnectableLayer*, const char* name) override
855 {
856 BOOST_TEST(name == "division");
857 }
858 };
859
860 const armnn::TensorInfo info({ 1, 5, 2, 3 }, armnn::DataType::Float32);
861
862 armnn::INetworkPtr network = armnn::INetwork::Create();
863 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
864 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
865
866 const char* divLayerName = "division";
867
868 armnn::IConnectableLayer* const divisionLayer = network->AddDivisionLayer(divLayerName);
869 inputLayer0->GetOutputSlot(0).Connect(divisionLayer->GetInputSlot(0));
870 inputLayer1->GetOutputSlot(0).Connect(divisionLayer->GetInputSlot(1));
871
872 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
873 divisionLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
874
875 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
876 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
877 divisionLayer->GetOutputSlot(0).SetTensorInfo(info);
878
879 armnnSerializer::Serializer serializer;
880 serializer.Serialize(*network);
881
882 std::stringstream stream;
883 serializer.SaveSerializedToStream(stream);
884 BOOST_TEST(stream.str().length() > 0);
885 BOOST_TEST(stream.str().find(divLayerName) != stream.str().npos);
886
887 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(stream.str());
888 BOOST_CHECK(deserializedNetwork);
889
890 VerifyDivisionName nameChecker;
891 deserializedNetwork->Accept(nameChecker);
892}
893
Nina Drozd57728782019-02-27 10:53:27 +0000894BOOST_AUTO_TEST_CASE(SerializeDeserializeNormalization)
895{
896 class VerifyNormalizationName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
897 {
898 public:
899 void VisitNormalizationLayer(const armnn::IConnectableLayer*,
900 const armnn::NormalizationDescriptor& normalizationDescriptor,
901 const char* name) override
902 {
903 BOOST_TEST(name == "NormalizationLayer");
904 }
905 };
906
907 unsigned int inputShape[] = {2, 1, 2, 2};
908 unsigned int outputShape[] = {2, 1, 2, 2};
909
910 armnn::NormalizationDescriptor desc;
911 desc.m_DataLayout = armnn::DataLayout::NCHW;
912 desc.m_NormSize = 3;
913 desc.m_Alpha = 1;
914 desc.m_Beta = 1;
915 desc.m_K = 1;
916
917 auto inputTensorInfo = armnn::TensorInfo(4, inputShape, armnn::DataType::Float32);
918 auto outputTensorInfo = armnn::TensorInfo(4, outputShape, armnn::DataType::Float32);
919
920 armnn::INetworkPtr network = armnn::INetwork::Create();
921 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
922 armnn::IConnectableLayer* const normalizationLayer = network->AddNormalizationLayer(desc, "NormalizationLayer");
923 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
924
925 inputLayer->GetOutputSlot(0).Connect(normalizationLayer->GetInputSlot(0));
926 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
927 normalizationLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
928 normalizationLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
929
930 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
931 BOOST_CHECK(deserializedNetwork);
932
933 VerifyNormalizationName nameChecker;
934 deserializedNetwork->Accept(nameChecker);
935
936 CheckDeserializedNetworkAgainstOriginal(*network,
937 *deserializedNetwork,
938 {inputTensorInfo.GetShape()},
939 {outputTensorInfo.GetShape()});
940}
941
Nattapat Chaimanowong235cea52019-02-28 16:27:30 +0000942BOOST_AUTO_TEST_CASE(SerializeDeserializeEqual)
943{
944 class VerifyEqualName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
945 {
946 public:
947 void VisitEqualLayer(const armnn::IConnectableLayer*,
948 const char* name) override
949 {
950 BOOST_TEST(name == "EqualLayer");
951 }
952 };
953
954 const armnn::TensorInfo inputTensorInfo1 = armnn::TensorInfo({2, 1, 2, 4}, armnn::DataType::Float32);
955 const armnn::TensorInfo inputTensorInfo2 = armnn::TensorInfo({2, 1, 2, 4}, armnn::DataType::Float32);
956 const armnn::TensorInfo outputTensorInfo = armnn::TensorInfo({2, 1, 2, 4}, armnn::DataType::Boolean);
957
958 armnn::INetworkPtr network = armnn::INetwork::Create();
959 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(0);
960 armnn::IConnectableLayer* const inputLayer2 = network->AddInputLayer(1);
961 armnn::IConnectableLayer* const equalLayer = network->AddEqualLayer("EqualLayer");
962 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
963
964 inputLayer1->GetOutputSlot(0).Connect(equalLayer->GetInputSlot(0));
965 inputLayer1->GetOutputSlot(0).SetTensorInfo(inputTensorInfo1);
966 inputLayer2->GetOutputSlot(0).Connect(equalLayer->GetInputSlot(1));
967 inputLayer2->GetOutputSlot(0).SetTensorInfo(inputTensorInfo2);
968 equalLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
969 equalLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
970
971 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
972 BOOST_CHECK(deserializedNetwork);
973
974 VerifyEqualName nameChecker;
975 deserializedNetwork->Accept(nameChecker);
976
977 CheckDeserializedNetworkAgainstOriginal(*network,
978 *deserializedNetwork,
979 {inputTensorInfo1.GetShape(), inputTensorInfo2.GetShape()},
980 {outputTensorInfo.GetShape()},
981 {0, 1});
982}
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000983BOOST_AUTO_TEST_SUITE_END()