blob: 278715bfa4d3298ce1baf21ac3068b092cb8313b [file] [log] [blame]
Mike Kelly8c1701a2019-02-11 17:01:27 +00001//
Teresa Charlin52664732020-06-29 16:27:03 +01002// Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
Mike Kelly8c1701a2019-02-11 17:01:27 +00003// SPDX-License-Identifier: MIT
4//
5
Mike Kelly8c1701a2019-02-11 17:01:27 +00006#include "../Serializer.hpp"
Finn Williamsb454c5c2021-02-09 15:56:23 +00007#include "SerializerTestUtils.hpp"
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00008
Matthew Benthamff130e22020-01-17 11:47:42 +00009#include <armnn/Descriptors.hpp>
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +000010#include <armnn/INetwork.hpp>
Matthew Benthamff130e22020-01-17 11:47:42 +000011#include <armnn/TypesUtils.hpp>
12#include <armnn/LstmParams.hpp>
13#include <armnn/QuantizedLstmParams.hpp>
Derek Lamberti0028d1b2019-02-20 13:57:42 +000014#include <armnnDeserializer/IDeserializer.hpp>
Finn Williamsb454c5c2021-02-09 15:56:23 +000015#include <armnn/utility/IgnoreUnused.hpp>
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +000016
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +000017#include <random>
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +000018#include <vector>
19
Sadik Armagan1625efc2021-06-10 18:24:34 +010020#include <doctest/doctest.h>
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +000021
Derek Lamberti0028d1b2019-02-20 13:57:42 +000022using armnnDeserializer::IDeserializer;
Mike Kelly8c1701a2019-02-11 17:01:27 +000023
Sadik Armagan1625efc2021-06-10 18:24:34 +010024TEST_SUITE("SerializerTests")
25{
Finn Williamsb454c5c2021-02-09 15:56:23 +000026
Sadik Armagan1625efc2021-06-10 18:24:34 +010027TEST_CASE("SerializeAddition")
Mike Kelly8c1701a2019-02-11 17:01:27 +000028{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +000029 const std::string layerName("addition");
30 const armnn::TensorInfo tensorInfo({1, 2, 3}, armnn::DataType::Float32);
31
Mike Kelly8c1701a2019-02-11 17:01:27 +000032 armnn::INetworkPtr network = armnn::INetwork::Create();
33 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
34 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +000035 armnn::IConnectableLayer* const additionLayer = network->AddAdditionLayer(layerName.c_str());
36 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
Mike Kelly8c1701a2019-02-11 17:01:27 +000037
Éanna Ó Catháin633f8592019-02-25 16:26:29 +000038 inputLayer0->GetOutputSlot(0).Connect(additionLayer->GetInputSlot(0));
39 inputLayer1->GetOutputSlot(0).Connect(additionLayer->GetInputSlot(1));
Éanna Ó Catháin633f8592019-02-25 16:26:29 +000040 additionLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
Mike Kelly8c1701a2019-02-11 17:01:27 +000041
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +000042 inputLayer0->GetOutputSlot(0).SetTensorInfo(tensorInfo);
43 inputLayer1->GetOutputSlot(0).SetTensorInfo(tensorInfo);
44 additionLayer->GetOutputSlot(0).SetTensorInfo(tensorInfo);
Jim Flynn3091b062019-02-15 14:45:04 +000045
Finn Williamsb454c5c2021-02-09 15:56:23 +000046 std::string serializedNetwork = SerializeNetwork(*network);
47 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(serializedNetwork);
Sadik Armagan1625efc2021-06-10 18:24:34 +010048 CHECK(deserializedNetwork);
Éanna Ó Catháin633f8592019-02-25 16:26:29 +000049
Finn Williamsb454c5c2021-02-09 15:56:23 +000050 LayerVerifierBase verifier(layerName, {tensorInfo, tensorInfo}, {tensorInfo});
51 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +000052}
Jim Flynnac25a1b2019-02-28 10:40:49 +000053
Mike Kelly1f140f72021-04-06 12:25:55 +010054void SerializeArgMinMaxTest(armnn::DataType dataType)
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +010055{
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +010056 const std::string layerName("argminmax");
57 const armnn::TensorInfo inputInfo({1, 2, 3}, armnn::DataType::Float32);
Mike Kelly1f140f72021-04-06 12:25:55 +010058 const armnn::TensorInfo outputInfo({1, 3}, dataType);
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +010059
60 armnn::ArgMinMaxDescriptor descriptor;
61 descriptor.m_Function = armnn::ArgMinMaxFunction::Max;
62 descriptor.m_Axis = 1;
63
64 armnn::INetworkPtr network = armnn::INetwork::Create();
65 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
66 armnn::IConnectableLayer* const argMinMaxLayer = network->AddArgMinMaxLayer(descriptor, layerName.c_str());
67 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
68
69 inputLayer->GetOutputSlot(0).Connect(argMinMaxLayer->GetInputSlot(0));
70 argMinMaxLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
71
72 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
73 argMinMaxLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
74
75 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +010076 CHECK(deserializedNetwork);
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +010077
Finn Williamsb454c5c2021-02-09 15:56:23 +000078 LayerVerifierBaseWithDescriptor<armnn::ArgMinMaxDescriptor> verifier(layerName,
79 {inputInfo},
80 {outputInfo},
81 descriptor);
82 deserializedNetwork->ExecuteStrategy(verifier);
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +010083}
84
Sadik Armagan1625efc2021-06-10 18:24:34 +010085TEST_CASE("SerializeArgMinMaxSigned32")
Mike Kelly1f140f72021-04-06 12:25:55 +010086{
87 SerializeArgMinMaxTest(armnn::DataType::Signed32);
88}
89
Sadik Armagan1625efc2021-06-10 18:24:34 +010090TEST_CASE("SerializeArgMinMaxSigned64")
Mike Kelly1f140f72021-04-06 12:25:55 +010091{
92 SerializeArgMinMaxTest(armnn::DataType::Signed64);
93}
94
Sadik Armagan1625efc2021-06-10 18:24:34 +010095TEST_CASE("SerializeBatchNormalization")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +000096{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +000097 const std::string layerName("batchNormalization");
98 const armnn::TensorInfo inputInfo ({ 1, 3, 3, 1 }, armnn::DataType::Float32);
99 const armnn::TensorInfo outputInfo({ 1, 3, 3, 1 }, armnn::DataType::Float32);
100
Cathal Corbett5b8093c2021-10-22 11:12:07 +0100101 const armnn::TensorInfo meanInfo({1}, armnn::DataType::Float32, 0.0f, 0, true);
102 const armnn::TensorInfo varianceInfo({1}, armnn::DataType::Float32, 0.0f, 0, true);
103 const armnn::TensorInfo betaInfo({1}, armnn::DataType::Float32, 0.0f, 0, true);
104 const armnn::TensorInfo gammaInfo({1}, armnn::DataType::Float32, 0.0f, 0, true);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000105
106 armnn::BatchNormalizationDescriptor descriptor;
107 descriptor.m_Eps = 0.0010000000475f;
108 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
109
110 std::vector<float> meanData({5.0});
111 std::vector<float> varianceData({2.0});
112 std::vector<float> betaData({1.0});
113 std::vector<float> gammaData({0.0});
114
Finn Williamsb454c5c2021-02-09 15:56:23 +0000115 std::vector<armnn::ConstTensor> constants;
116 constants.emplace_back(armnn::ConstTensor(meanInfo, meanData));
117 constants.emplace_back(armnn::ConstTensor(varianceInfo, varianceData));
118 constants.emplace_back(armnn::ConstTensor(betaInfo, betaData));
119 constants.emplace_back(armnn::ConstTensor(gammaInfo, gammaData));
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000120
121 armnn::INetworkPtr network = armnn::INetwork::Create();
122 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
123 armnn::IConnectableLayer* const batchNormalizationLayer =
Finn Williamsb454c5c2021-02-09 15:56:23 +0000124 network->AddBatchNormalizationLayer(descriptor,
125 constants[0],
126 constants[1],
127 constants[2],
128 constants[3],
129 layerName.c_str());
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000130 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
131
132 inputLayer->GetOutputSlot(0).Connect(batchNormalizationLayer->GetInputSlot(0));
133 batchNormalizationLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
134
135 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
136 batchNormalizationLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
137
138 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100139 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000140
Finn Williamsb454c5c2021-02-09 15:56:23 +0000141 LayerVerifierBaseWithDescriptorAndConstants<armnn::BatchNormalizationDescriptor> verifier(
142 layerName, {inputInfo}, {outputInfo}, descriptor, constants);
143 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000144}
145
Sadik Armagan1625efc2021-06-10 18:24:34 +0100146TEST_CASE("SerializeBatchToSpaceNd")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000147{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000148 const std::string layerName("spaceToBatchNd");
149 const armnn::TensorInfo inputInfo({4, 1, 2, 2}, armnn::DataType::Float32);
150 const armnn::TensorInfo outputInfo({1, 1, 4, 4}, armnn::DataType::Float32);
151
152 armnn::BatchToSpaceNdDescriptor desc;
153 desc.m_DataLayout = armnn::DataLayout::NCHW;
154 desc.m_BlockShape = {2, 2};
155 desc.m_Crops = {{0, 0}, {0, 0}};
156
157 armnn::INetworkPtr network = armnn::INetwork::Create();
158 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
159 armnn::IConnectableLayer* const batchToSpaceNdLayer = network->AddBatchToSpaceNdLayer(desc, layerName.c_str());
160 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
161
162 inputLayer->GetOutputSlot(0).Connect(batchToSpaceNdLayer->GetInputSlot(0));
163 batchToSpaceNdLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
164
165 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
166 batchToSpaceNdLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
167
168 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100169 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000170
Finn Williamsb454c5c2021-02-09 15:56:23 +0000171 LayerVerifierBaseWithDescriptor<armnn::BatchToSpaceNdDescriptor> verifier(layerName,
172 {inputInfo},
173 {outputInfo},
174 desc);
175 deserializedNetwork->ExecuteStrategy(verifier);
Mike Kelly8c1701a2019-02-11 17:01:27 +0000176}
177
Sadik Armagan1625efc2021-06-10 18:24:34 +0100178TEST_CASE("SerializeCast")
mathad01b392e982021-04-07 12:07:30 +0100179{
180 const std::string layerName("cast");
181
182 const armnn::TensorShape shape{1, 5, 2, 3};
183
184 const armnn::TensorInfo inputInfo = armnn::TensorInfo(shape, armnn::DataType::Signed32);
185 const armnn::TensorInfo outputInfo = armnn::TensorInfo(shape, armnn::DataType::Float32);
186
187 armnn::INetworkPtr network = armnn::INetwork::Create();
188 armnn::IConnectableLayer* inputLayer = network->AddInputLayer(0);
189 armnn::IConnectableLayer* castLayer = network->AddCastLayer(layerName.c_str());
190 armnn::IConnectableLayer* outputLayer = network->AddOutputLayer(0);
191
192 inputLayer->GetOutputSlot(0).Connect(castLayer->GetInputSlot(0));
193 castLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
194
195 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
196 castLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
197
198 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100199 CHECK(deserializedNetwork);
mathad01b392e982021-04-07 12:07:30 +0100200
201 LayerVerifierBase verifier(layerName, {inputInfo}, {outputInfo});
202 deserializedNetwork->ExecuteStrategy(verifier);
203}
204
Simon Obute51f67772021-09-03 15:50:13 +0100205TEST_CASE("SerializeChannelShuffle")
206{
207 const std::string layerName("channelShuffle");
208 const armnn::TensorInfo inputInfo({1, 9}, armnn::DataType::Float32);
209 const armnn::TensorInfo outputInfo({1, 9}, armnn::DataType::Float32);
210
211 armnn::ChannelShuffleDescriptor descriptor({3, 1});
212
213 armnn::INetworkPtr network = armnn::INetwork::Create();
214 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
215 armnn::IConnectableLayer* const ChannelShuffleLayer =
216 network->AddChannelShuffleLayer(descriptor, layerName.c_str());
217 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
218
219 inputLayer->GetOutputSlot(0).Connect(ChannelShuffleLayer->GetInputSlot(0));
220 ChannelShuffleLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
221
222 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
223 ChannelShuffleLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
224
225 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
226 CHECK(deserializedNetwork);
227
228 LayerVerifierBaseWithDescriptor<armnn::ChannelShuffleDescriptor> verifier(
229 layerName, {inputInfo}, {outputInfo}, descriptor);
230 deserializedNetwork->ExecuteStrategy(verifier);
231}
232
Sadik Armagan1625efc2021-06-10 18:24:34 +0100233TEST_CASE("SerializeComparison")
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100234{
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100235 const std::string layerName("comparison");
236
237 const armnn::TensorShape shape{2, 1, 2, 4};
238
239 const armnn::TensorInfo inputInfo = armnn::TensorInfo(shape, armnn::DataType::Float32);
240 const armnn::TensorInfo outputInfo = armnn::TensorInfo(shape, armnn::DataType::Boolean);
241
242 armnn::ComparisonDescriptor descriptor(armnn::ComparisonOperation::NotEqual);
243
244 armnn::INetworkPtr network = armnn::INetwork::Create();
245 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
246 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
247 armnn::IConnectableLayer* const comparisonLayer = network->AddComparisonLayer(descriptor, layerName.c_str());
248 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
249
250 inputLayer0->GetOutputSlot(0).Connect(comparisonLayer->GetInputSlot(0));
251 inputLayer1->GetOutputSlot(0).Connect(comparisonLayer->GetInputSlot(1));
252 comparisonLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
253
254 inputLayer0->GetOutputSlot(0).SetTensorInfo(inputInfo);
255 inputLayer1->GetOutputSlot(0).SetTensorInfo(inputInfo);
256 comparisonLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
257
258 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100259 CHECK(deserializedNetwork);
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100260
Finn Williamsb454c5c2021-02-09 15:56:23 +0000261 LayerVerifierBaseWithDescriptor<armnn::ComparisonDescriptor> verifier(layerName,
262 { inputInfo, inputInfo },
263 { outputInfo },
264 descriptor);
265 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100266}
267
Sadik Armagan1625efc2021-06-10 18:24:34 +0100268TEST_CASE("SerializeConstant")
Conor Kennedy76277882019-02-26 08:29:54 +0000269{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000270 class ConstantLayerVerifier : public LayerVerifierBase
Conor Kennedy76277882019-02-26 08:29:54 +0000271 {
272 public:
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000273 ConstantLayerVerifier(const std::string& layerName,
274 const std::vector<armnn::TensorInfo>& inputInfos,
275 const std::vector<armnn::TensorInfo>& outputInfos,
Finn Williamsb454c5c2021-02-09 15:56:23 +0000276 const std::vector<armnn::ConstTensor>& constants)
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100277 : LayerVerifierBase(layerName, inputInfos, outputInfos)
Finn Williamsb454c5c2021-02-09 15:56:23 +0000278 , m_Constants(constants) {}
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000279
Finn Williamsb454c5c2021-02-09 15:56:23 +0000280 void ExecuteStrategy(const armnn::IConnectableLayer* layer,
281 const armnn::BaseDescriptor& descriptor,
282 const std::vector<armnn::ConstTensor>& constants,
283 const char* name,
284 const armnn::LayerBindingId id = 0) override
Conor Kennedy76277882019-02-26 08:29:54 +0000285 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000286 armnn::IgnoreUnused(descriptor, id);
287
288 switch (layer->GetType())
289 {
290 case armnn::LayerType::Input: break;
291 case armnn::LayerType::Output: break;
292 case armnn::LayerType::Addition: break;
293 default:
294 {
295 this->VerifyNameAndConnections(layer, name);
296
297 for (std::size_t i = 0; i < constants.size(); i++)
298 {
299 CompareConstTensor(constants[i], m_Constants[i]);
300 }
301 }
302 }
Conor Kennedy76277882019-02-26 08:29:54 +0000303 }
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000304
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000305 private:
Finn Williamsb454c5c2021-02-09 15:56:23 +0000306 const std::vector<armnn::ConstTensor> m_Constants;
Conor Kennedy76277882019-02-26 08:29:54 +0000307 };
308
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000309 const std::string layerName("constant");
Cathal Corbett5b8093c2021-10-22 11:12:07 +0100310 const armnn::TensorInfo info({ 2, 3 }, armnn::DataType::Float32, 0.0f, 0, true);
Conor Kennedy76277882019-02-26 08:29:54 +0000311
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000312 std::vector<float> constantData = GenerateRandomData<float>(info.GetNumElements());
313 armnn::ConstTensor constTensor(info, constantData);
Conor Kennedy76277882019-02-26 08:29:54 +0000314
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000315 armnn::INetworkPtr network(armnn::INetwork::Create());
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000316 armnn::IConnectableLayer* input = network->AddInputLayer(0);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000317 armnn::IConnectableLayer* constant = network->AddConstantLayer(constTensor, layerName.c_str());
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000318 armnn::IConnectableLayer* add = network->AddAdditionLayer();
319 armnn::IConnectableLayer* output = network->AddOutputLayer(0);
Conor Kennedy76277882019-02-26 08:29:54 +0000320
321 input->GetOutputSlot(0).Connect(add->GetInputSlot(0));
322 constant->GetOutputSlot(0).Connect(add->GetInputSlot(1));
323 add->GetOutputSlot(0).Connect(output->GetInputSlot(0));
324
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000325 input->GetOutputSlot(0).SetTensorInfo(info);
326 constant->GetOutputSlot(0).SetTensorInfo(info);
327 add->GetOutputSlot(0).SetTensorInfo(info);
Conor Kennedy76277882019-02-26 08:29:54 +0000328
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000329 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100330 CHECK(deserializedNetwork);
Conor Kennedy76277882019-02-26 08:29:54 +0000331
Finn Williamsb454c5c2021-02-09 15:56:23 +0000332 ConstantLayerVerifier verifier(layerName, {}, {info}, {constTensor});
333 deserializedNetwork->ExecuteStrategy(verifier);
Conor Kennedy76277882019-02-26 08:29:54 +0000334}
335
Sadik Armagan1625efc2021-06-10 18:24:34 +0100336TEST_CASE("SerializeConvolution2d")
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000337{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000338 const std::string layerName("convolution2d");
339 const armnn::TensorInfo inputInfo ({ 1, 5, 5, 1 }, armnn::DataType::Float32);
340 const armnn::TensorInfo outputInfo({ 1, 3, 3, 1 }, armnn::DataType::Float32);
Saoirse Stewart263829c2019-02-19 15:54:14 +0000341
Cathal Corbett5b8093c2021-10-22 11:12:07 +0100342 const armnn::TensorInfo weightsInfo({ 1, 3, 3, 1 }, armnn::DataType::Float32, 0.0f, 0, true);
343 const armnn::TensorInfo biasesInfo ({ 1 }, armnn::DataType::Float32, 0.0f, 0, true);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000344
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000345 std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements());
346 armnn::ConstTensor weights(weightsInfo, weightsData);
347
348 std::vector<float> biasesData = GenerateRandomData<float>(biasesInfo.GetNumElements());
349 armnn::ConstTensor biases(biasesInfo, biasesData);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000350
351 armnn::Convolution2dDescriptor descriptor;
352 descriptor.m_PadLeft = 1;
353 descriptor.m_PadRight = 1;
354 descriptor.m_PadTop = 1;
355 descriptor.m_PadBottom = 1;
356 descriptor.m_StrideX = 2;
357 descriptor.m_StrideY = 2;
Aron Virginas-Tar5e1b0cf2019-06-21 14:20:11 +0100358 descriptor.m_DilationX = 2;
359 descriptor.m_DilationY = 2;
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000360 descriptor.m_BiasEnabled = true;
361 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
362
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000363 armnn::INetworkPtr network = armnn::INetwork::Create();
364 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000365 armnn::IConnectableLayer* const convLayer =
Matteo Martincighfc598e12019-05-14 10:36:13 +0100366 network->AddConvolution2dLayer(descriptor,
367 weights,
368 armnn::Optional<armnn::ConstTensor>(biases),
369 layerName.c_str());
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000370 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000371
372 inputLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(0));
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000373 convLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000374
375 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000376 convLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
377
378 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100379 CHECK(deserializedNetwork);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000380
Finn Williamsb454c5c2021-02-09 15:56:23 +0000381 const std::vector<armnn::ConstTensor>& constants {weights, biases};
382 LayerVerifierBaseWithDescriptorAndConstants<armnn::Convolution2dDescriptor> verifier(
383 layerName, {inputInfo}, {outputInfo}, descriptor, constants);
384 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000385}
386
Sadik Armagan1625efc2021-06-10 18:24:34 +0100387TEST_CASE("SerializeConvolution2dWithPerAxisParams")
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000388{
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000389 using namespace armnn;
390
391 const std::string layerName("convolution2dWithPerAxis");
392 const TensorInfo inputInfo ({ 1, 3, 1, 2 }, DataType::QAsymmU8, 0.55f, 128);
393 const TensorInfo outputInfo({ 1, 3, 1, 3 }, DataType::QAsymmU8, 0.75f, 128);
394
395 const std::vector<float> quantScales{ 0.75f, 0.65f, 0.85f };
396 constexpr unsigned int quantDimension = 0;
397
Cathal Corbett5b8093c2021-10-22 11:12:07 +0100398 const TensorInfo kernelInfo({ 3, 1, 1, 2 }, DataType::QSymmS8, quantScales, quantDimension, true);
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000399
400 const std::vector<float> biasQuantScales{ 0.25f, 0.50f, 0.75f };
Cathal Corbett5b8093c2021-10-22 11:12:07 +0100401 const TensorInfo biasInfo({ 3 }, DataType::Signed32, biasQuantScales, quantDimension, true);
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000402
403 std::vector<int8_t> kernelData = GenerateRandomData<int8_t>(kernelInfo.GetNumElements());
404 armnn::ConstTensor weights(kernelInfo, kernelData);
405 std::vector<int32_t> biasData = GenerateRandomData<int32_t>(biasInfo.GetNumElements());
406 armnn::ConstTensor biases(biasInfo, biasData);
407
408 Convolution2dDescriptor descriptor;
409 descriptor.m_StrideX = 1;
410 descriptor.m_StrideY = 1;
411 descriptor.m_PadLeft = 0;
412 descriptor.m_PadRight = 0;
413 descriptor.m_PadTop = 0;
414 descriptor.m_PadBottom = 0;
415 descriptor.m_BiasEnabled = true;
416 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
417
418 armnn::INetworkPtr network = armnn::INetwork::Create();
419 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
420 armnn::IConnectableLayer* const convLayer =
421 network->AddConvolution2dLayer(descriptor,
422 weights,
423 armnn::Optional<armnn::ConstTensor>(biases),
424 layerName.c_str());
425 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
426
427 inputLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(0));
428 convLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
429
430 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
431 convLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
432
433 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100434 CHECK(deserializedNetwork);
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000435
Finn Williamsb454c5c2021-02-09 15:56:23 +0000436 const std::vector<armnn::ConstTensor>& constants {weights, biases};
437 LayerVerifierBaseWithDescriptorAndConstants<Convolution2dDescriptor> verifier(
438 layerName, {inputInfo}, {outputInfo}, descriptor, constants);
439 deserializedNetwork->ExecuteStrategy(verifier);
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000440}
441
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100442TEST_CASE("SerializeConvolution3d")
443{
444 const std::string layerName("convolution3d");
445 const armnn::TensorInfo inputInfo ({ 1, 5, 5, 5, 1 }, armnn::DataType::Float32);
446 const armnn::TensorInfo outputInfo({ 1, 2, 2, 2, 1 }, armnn::DataType::Float32);
447
Cathal Corbett5b8093c2021-10-22 11:12:07 +0100448 const armnn::TensorInfo weightsInfo({ 3, 3, 3, 1, 1 }, armnn::DataType::Float32, 0.0f, 0, true);
449 const armnn::TensorInfo biasesInfo ({ 1 }, armnn::DataType::Float32, 0.0f, 0, true);
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100450
451 std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements());
452 armnn::ConstTensor weights(weightsInfo, weightsData);
453
454 std::vector<float> biasesData = GenerateRandomData<float>(biasesInfo.GetNumElements());
455 armnn::ConstTensor biases(biasesInfo, biasesData);
456
457 armnn::Convolution3dDescriptor descriptor;
458 descriptor.m_PadLeft = 0;
459 descriptor.m_PadRight = 0;
460 descriptor.m_PadTop = 0;
461 descriptor.m_PadBottom = 0;
462 descriptor.m_PadFront = 0;
463 descriptor.m_PadBack = 0;
464 descriptor.m_DilationX = 1;
465 descriptor.m_DilationY = 1;
466 descriptor.m_DilationZ = 1;
467 descriptor.m_StrideX = 2;
468 descriptor.m_StrideY = 2;
469 descriptor.m_StrideZ = 2;
470 descriptor.m_BiasEnabled = true;
471 descriptor.m_DataLayout = armnn::DataLayout::NDHWC;
472
473 armnn::INetworkPtr network = armnn::INetwork::Create();
474 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100475 armnn::IConnectableLayer* const weightsLayer = network->AddConstantLayer(weights, "Weights");
476 armnn::IConnectableLayer* const biasesLayer = network->AddConstantLayer(biases, "Biases");
477 armnn::IConnectableLayer* const convLayer = network->AddConvolution3dLayer(descriptor, layerName.c_str());
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100478 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
479
480 inputLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(0));
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100481 weightsLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(1));
482 biasesLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(2));
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100483 convLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
484
485 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100486 weightsLayer->GetOutputSlot(0).SetTensorInfo(weightsInfo);
487 biasesLayer->GetOutputSlot(0).SetTensorInfo(biasesInfo);
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100488 convLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
489
490 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
491 CHECK(deserializedNetwork);
492
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100493 LayerVerifierBaseWithDescriptor<armnn::Convolution3dDescriptor> verifier(
494 layerName, {inputInfo, weightsInfo, biasesInfo}, {outputInfo}, descriptor);
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100495 deserializedNetwork->ExecuteStrategy(verifier);
496}
497
Sadik Armagan1625efc2021-06-10 18:24:34 +0100498TEST_CASE("SerializeDepthToSpace")
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100499{
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100500 const std::string layerName("depthToSpace");
501
502 const armnn::TensorInfo inputInfo ({ 1, 8, 4, 12 }, armnn::DataType::Float32);
503 const armnn::TensorInfo outputInfo({ 1, 16, 8, 3 }, armnn::DataType::Float32);
504
505 armnn::DepthToSpaceDescriptor desc;
506 desc.m_BlockSize = 2;
507 desc.m_DataLayout = armnn::DataLayout::NHWC;
508
509 armnn::INetworkPtr network = armnn::INetwork::Create();
510 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
511 armnn::IConnectableLayer* const depthToSpaceLayer = network->AddDepthToSpaceLayer(desc, layerName.c_str());
512 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
513
514 inputLayer->GetOutputSlot(0).Connect(depthToSpaceLayer->GetInputSlot(0));
515 depthToSpaceLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
516
517 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
518 depthToSpaceLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
519
520 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100521 CHECK(deserializedNetwork);
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100522
Finn Williamsb454c5c2021-02-09 15:56:23 +0000523 LayerVerifierBaseWithDescriptor<armnn::DepthToSpaceDescriptor> verifier(layerName, {inputInfo}, {outputInfo}, desc);
524 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100525}
526
Sadik Armagan1625efc2021-06-10 18:24:34 +0100527TEST_CASE("SerializeDepthwiseConvolution2d")
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000528{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000529 const std::string layerName("depwiseConvolution2d");
530 const armnn::TensorInfo inputInfo ({ 1, 5, 5, 3 }, armnn::DataType::Float32);
531 const armnn::TensorInfo outputInfo({ 1, 3, 3, 3 }, armnn::DataType::Float32);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000532
Cathal Corbett5b8093c2021-10-22 11:12:07 +0100533 const armnn::TensorInfo weightsInfo({ 1, 3, 3, 3 }, armnn::DataType::Float32, 0.0f, 0, true);
534 const armnn::TensorInfo biasesInfo ({ 3 }, armnn::DataType::Float32, 0.0f, 0, true);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000535
536 std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements());
537 armnn::ConstTensor weights(weightsInfo, weightsData);
538
539 std::vector<int32_t> biasesData = GenerateRandomData<int32_t>(biasesInfo.GetNumElements());
540 armnn::ConstTensor biases(biasesInfo, biasesData);
541
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000542 armnn::DepthwiseConvolution2dDescriptor descriptor;
Aron Virginas-Tar5e1b0cf2019-06-21 14:20:11 +0100543 descriptor.m_PadLeft = 1;
544 descriptor.m_PadRight = 1;
545 descriptor.m_PadTop = 1;
546 descriptor.m_PadBottom = 1;
547 descriptor.m_StrideX = 2;
548 descriptor.m_StrideY = 2;
549 descriptor.m_DilationX = 2;
550 descriptor.m_DilationY = 2;
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000551 descriptor.m_BiasEnabled = true;
552 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
553
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000554 armnn::INetworkPtr network = armnn::INetwork::Create();
555 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
Cathal Corbett06902652022-04-14 17:55:11 +0100556 armnn::IConnectableLayer* const depthwiseConvLayer = network->AddDepthwiseConvolution2dLayer(descriptor,
557 layerName.c_str());
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000558 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
559
560 inputLayer->GetOutputSlot(0).Connect(depthwiseConvLayer->GetInputSlot(0));
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000561 depthwiseConvLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000562
563 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000564 depthwiseConvLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
565
Cathal Corbett06902652022-04-14 17:55:11 +0100566 armnn::IConnectableLayer* const weightsLayer = network->AddConstantLayer(weights);
567 weightsLayer->GetOutputSlot(0).Connect(depthwiseConvLayer->GetInputSlot(1u));
568 weightsLayer->GetOutputSlot(0).SetTensorInfo(weights.GetInfo());
569
570 armnn::IConnectableLayer* const biasLayer = network->AddConstantLayer(biases);
571 biasLayer->GetOutputSlot(0).Connect(depthwiseConvLayer->GetInputSlot(2u));
572 biasLayer->GetOutputSlot(0).SetTensorInfo(biases.GetInfo());
573
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000574 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100575 CHECK(deserializedNetwork);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000576
Finn Williamsb454c5c2021-02-09 15:56:23 +0000577 const std::vector<armnn::ConstTensor>& constants {weights, biases};
578 LayerVerifierBaseWithDescriptorAndConstants<armnn::DepthwiseConvolution2dDescriptor> verifier(
Cathal Corbett06902652022-04-14 17:55:11 +0100579 layerName, {inputInfo, weightsInfo, biasesInfo}, {outputInfo}, descriptor, constants);
Finn Williamsb454c5c2021-02-09 15:56:23 +0000580 deserializedNetwork->ExecuteStrategy(verifier);
Jim Flynn18ce3382019-03-08 11:08:30 +0000581}
582
Sadik Armagan1625efc2021-06-10 18:24:34 +0100583TEST_CASE("SerializeDepthwiseConvolution2dWithPerAxisParams")
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000584{
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000585 using namespace armnn;
586
587 const std::string layerName("depwiseConvolution2dWithPerAxis");
588 const TensorInfo inputInfo ({ 1, 3, 3, 2 }, DataType::QAsymmU8, 0.55f, 128);
589 const TensorInfo outputInfo({ 1, 2, 2, 4 }, DataType::QAsymmU8, 0.75f, 128);
590
591 const std::vector<float> quantScales{ 0.75f, 0.80f, 0.90f, 0.95f };
592 const unsigned int quantDimension = 0;
Cathal Corbett5b8093c2021-10-22 11:12:07 +0100593 TensorInfo kernelInfo({ 2, 2, 2, 2 }, DataType::QSymmS8, quantScales, quantDimension, true);
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000594
595 const std::vector<float> biasQuantScales{ 0.25f, 0.35f, 0.45f, 0.55f };
596 constexpr unsigned int biasQuantDimension = 0;
Cathal Corbett5b8093c2021-10-22 11:12:07 +0100597 TensorInfo biasInfo({ 4 }, DataType::Signed32, biasQuantScales, biasQuantDimension, true);
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000598
599 std::vector<int8_t> kernelData = GenerateRandomData<int8_t>(kernelInfo.GetNumElements());
600 armnn::ConstTensor weights(kernelInfo, kernelData);
601 std::vector<int32_t> biasData = GenerateRandomData<int32_t>(biasInfo.GetNumElements());
602 armnn::ConstTensor biases(biasInfo, biasData);
603
604 DepthwiseConvolution2dDescriptor descriptor;
605 descriptor.m_StrideX = 1;
606 descriptor.m_StrideY = 1;
607 descriptor.m_PadLeft = 0;
608 descriptor.m_PadRight = 0;
609 descriptor.m_PadTop = 0;
610 descriptor.m_PadBottom = 0;
611 descriptor.m_DilationX = 1;
612 descriptor.m_DilationY = 1;
613 descriptor.m_BiasEnabled = true;
614 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
615
616 armnn::INetworkPtr network = armnn::INetwork::Create();
617 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
Cathal Corbett06902652022-04-14 17:55:11 +0100618 armnn::IConnectableLayer* const depthwiseConvLayer = network->AddDepthwiseConvolution2dLayer(descriptor,
619 layerName.c_str());
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000620 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
621
622 inputLayer->GetOutputSlot(0).Connect(depthwiseConvLayer->GetInputSlot(0));
623 depthwiseConvLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
624
625 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
626 depthwiseConvLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
627
Cathal Corbett06902652022-04-14 17:55:11 +0100628 armnn::IConnectableLayer* const weightsLayer = network->AddConstantLayer(weights);
629 weightsLayer->GetOutputSlot(0).Connect(depthwiseConvLayer->GetInputSlot(1u));
630 weightsLayer->GetOutputSlot(0).SetTensorInfo(weights.GetInfo());
631
632 armnn::IConnectableLayer* const biasLayer = network->AddConstantLayer(biases);
633 biasLayer->GetOutputSlot(0).Connect(depthwiseConvLayer->GetInputSlot(2u));
634 biasLayer->GetOutputSlot(0).SetTensorInfo(biases.GetInfo());
635
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000636 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100637 CHECK(deserializedNetwork);
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000638
Finn Williamsb454c5c2021-02-09 15:56:23 +0000639 const std::vector<armnn::ConstTensor>& constants {weights, biases};
640 LayerVerifierBaseWithDescriptorAndConstants<armnn::DepthwiseConvolution2dDescriptor> verifier(
Cathal Corbett06902652022-04-14 17:55:11 +0100641 layerName, {inputInfo, kernelInfo, biasInfo}, {outputInfo}, descriptor, constants);
642 deserializedNetwork->ExecuteStrategy(verifier);
643}
644
645TEST_CASE("SerializeDepthwiseConvolution2dWeightsAndBiasesAsConstantLayers")
646{
647 const std::string layerName("depthwiseConvolution2d");
648 const armnn::TensorInfo inputInfo ({ 1, 5, 5, 1 }, armnn::DataType::Float32);
649 const armnn::TensorInfo outputInfo({ 1, 3, 3, 1 }, armnn::DataType::Float32);
650
651 const armnn::TensorInfo weightsInfo({ 1, 3, 3, 1 }, armnn::DataType::Float32, 0.0f, 0, true);
652 const armnn::TensorInfo biasesInfo ({ 1 }, armnn::DataType::Float32, 0.0f, 0, true);
653
654 std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements());
655 armnn::ConstTensor weights(weightsInfo, weightsData);
656
657 std::vector<float> biasesData = GenerateRandomData<float>(biasesInfo.GetNumElements());
658 armnn::ConstTensor biases(biasesInfo, biasesData);
659
660 armnn::DepthwiseConvolution2dDescriptor descriptor;
661 descriptor.m_PadLeft = 1;
662 descriptor.m_PadRight = 1;
663 descriptor.m_PadTop = 1;
664 descriptor.m_PadBottom = 1;
665 descriptor.m_StrideX = 2;
666 descriptor.m_StrideY = 2;
667 descriptor.m_DilationX = 2;
668 descriptor.m_DilationY = 2;
669 descriptor.m_BiasEnabled = true;
670 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
671
672 armnn::INetworkPtr network = armnn::INetwork::Create();
673 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
674 armnn::IConnectableLayer* const weightsLayer = network->AddConstantLayer(weights, "Weights");
675 armnn::IConnectableLayer* const biasesLayer = network->AddConstantLayer(biases, "Biases");
676 armnn::IConnectableLayer* const convLayer = network->AddDepthwiseConvolution2dLayer(descriptor,
677 layerName.c_str());
678 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
679
680 inputLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(0));
681 weightsLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(1));
682 biasesLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(2));
683 convLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
684
685 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
686 weightsLayer->GetOutputSlot(0).SetTensorInfo(weightsInfo);
687 biasesLayer->GetOutputSlot(0).SetTensorInfo(biasesInfo);
688 convLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
689
690 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
691 CHECK(deserializedNetwork);
692
693 const std::vector<armnn::ConstTensor>& constants {weights, biases};
694 LayerVerifierBaseWithDescriptorAndConstants<armnn::DepthwiseConvolution2dDescriptor> verifier(
695 layerName, {inputInfo, weightsInfo, biasesInfo}, {outputInfo}, descriptor, constants);
696
Finn Williamsb454c5c2021-02-09 15:56:23 +0000697 deserializedNetwork->ExecuteStrategy(verifier);
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000698}
699
Sadik Armagan1625efc2021-06-10 18:24:34 +0100700TEST_CASE("SerializeDequantize")
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000701{
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000702 const std::string layerName("dequantize");
Derek Lambertif90c56d2020-01-10 17:14:08 +0000703 const armnn::TensorInfo inputInfo({ 1, 5, 2, 3 }, armnn::DataType::QAsymmU8, 0.5f, 1);
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000704 const armnn::TensorInfo outputInfo({ 1, 5, 2, 3 }, armnn::DataType::Float32);
705
706 armnn::INetworkPtr network = armnn::INetwork::Create();
707 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
708 armnn::IConnectableLayer* const dequantizeLayer = network->AddDequantizeLayer(layerName.c_str());
709 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
710
711 inputLayer->GetOutputSlot(0).Connect(dequantizeLayer->GetInputSlot(0));
712 dequantizeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
713
714 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
715 dequantizeLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
716
717 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100718 CHECK(deserializedNetwork);
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000719
Finn Williamsb454c5c2021-02-09 15:56:23 +0000720 LayerVerifierBase verifier(layerName, {inputInfo}, {outputInfo});
721 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000722}
723
Sadik Armagan1625efc2021-06-10 18:24:34 +0100724TEST_CASE("SerializeDeserializeDetectionPostProcess")
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000725{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000726 const std::string layerName("detectionPostProcess");
727
728 const std::vector<armnn::TensorInfo> inputInfos({
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000729 armnn::TensorInfo({ 1, 6, 4 }, armnn::DataType::Float32),
730 armnn::TensorInfo({ 1, 6, 3}, armnn::DataType::Float32)
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000731 });
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000732
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000733 const std::vector<armnn::TensorInfo> outputInfos({
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000734 armnn::TensorInfo({ 1, 3, 4 }, armnn::DataType::Float32),
735 armnn::TensorInfo({ 1, 3 }, armnn::DataType::Float32),
736 armnn::TensorInfo({ 1, 3 }, armnn::DataType::Float32),
737 armnn::TensorInfo({ 1 }, armnn::DataType::Float32)
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000738 });
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000739
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000740 armnn::DetectionPostProcessDescriptor descriptor;
741 descriptor.m_UseRegularNms = true;
742 descriptor.m_MaxDetections = 3;
743 descriptor.m_MaxClassesPerDetection = 1;
744 descriptor.m_DetectionsPerClass =1;
745 descriptor.m_NmsScoreThreshold = 0.0;
746 descriptor.m_NmsIouThreshold = 0.5;
747 descriptor.m_NumClasses = 2;
748 descriptor.m_ScaleY = 10.0;
749 descriptor.m_ScaleX = 10.0;
750 descriptor.m_ScaleH = 5.0;
751 descriptor.m_ScaleW = 5.0;
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000752
Cathal Corbett5b8093c2021-10-22 11:12:07 +0100753 const armnn::TensorInfo anchorsInfo({ 6, 4 }, armnn::DataType::Float32, 0.0f, 0, true);
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000754 const std::vector<float> anchorsData({
755 0.5f, 0.5f, 1.0f, 1.0f,
756 0.5f, 0.5f, 1.0f, 1.0f,
757 0.5f, 0.5f, 1.0f, 1.0f,
758 0.5f, 10.5f, 1.0f, 1.0f,
759 0.5f, 10.5f, 1.0f, 1.0f,
760 0.5f, 100.5f, 1.0f, 1.0f
761 });
762 armnn::ConstTensor anchors(anchorsInfo, anchorsData);
763
764 armnn::INetworkPtr network = armnn::INetwork::Create();
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000765 armnn::IConnectableLayer* const detectionLayer =
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000766 network->AddDetectionPostProcessLayer(descriptor, anchors, layerName.c_str());
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000767
768 for (unsigned int i = 0; i < 2; i++)
769 {
770 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(static_cast<int>(i));
771 inputLayer->GetOutputSlot(0).Connect(detectionLayer->GetInputSlot(i));
772 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfos[i]);
773 }
774
775 for (unsigned int i = 0; i < 4; i++)
776 {
777 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(static_cast<int>(i));
778 detectionLayer->GetOutputSlot(i).Connect(outputLayer->GetInputSlot(0));
779 detectionLayer->GetOutputSlot(i).SetTensorInfo(outputInfos[i]);
780 }
781
782 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100783 CHECK(deserializedNetwork);
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000784
Finn Williamsb454c5c2021-02-09 15:56:23 +0000785 const std::vector<armnn::ConstTensor>& constants {anchors};
786 LayerVerifierBaseWithDescriptorAndConstants<armnn::DetectionPostProcessDescriptor> verifier(
787 layerName, inputInfos, outputInfos, descriptor, constants);
788 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000789}
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000790
Sadik Armagan1625efc2021-06-10 18:24:34 +0100791TEST_CASE("SerializeDivision")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000792{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000793 const std::string layerName("division");
794 const armnn::TensorInfo info({ 1, 5, 2, 3 }, armnn::DataType::Float32);
795
796 armnn::INetworkPtr network = armnn::INetwork::Create();
797 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
798 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
799 armnn::IConnectableLayer* const divisionLayer = network->AddDivisionLayer(layerName.c_str());
800 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
801
802 inputLayer0->GetOutputSlot(0).Connect(divisionLayer->GetInputSlot(0));
803 inputLayer1->GetOutputSlot(0).Connect(divisionLayer->GetInputSlot(1));
804 divisionLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
805
806 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
807 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
808 divisionLayer->GetOutputSlot(0).SetTensorInfo(info);
809
810 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100811 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000812
Finn Williamsb454c5c2021-02-09 15:56:23 +0000813 LayerVerifierBase verifier(layerName, {info, info}, {info});
814 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000815}
816
Jan Eilers1b2654f2021-09-24 15:45:46 +0100817TEST_CASE("SerializeDeserializeComparisonEqual")
Aron Virginas-Tar6d2e6592019-10-22 11:44:47 +0100818{
Finn Williamsb454c5c2021-02-09 15:56:23 +0000819 const std::string layerName("EqualLayer");
820 const armnn::TensorInfo inputTensorInfo1 = armnn::TensorInfo({2, 1, 2, 4}, armnn::DataType::Float32);
821 const armnn::TensorInfo inputTensorInfo2 = armnn::TensorInfo({2, 1, 2, 4}, armnn::DataType::Float32);
822 const armnn::TensorInfo outputTensorInfo = armnn::TensorInfo({2, 1, 2, 4}, armnn::DataType::Boolean);
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100823
824 armnn::INetworkPtr network = armnn::INetwork::Create();
Finn Williamsb454c5c2021-02-09 15:56:23 +0000825 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(0);
826 armnn::IConnectableLayer* const inputLayer2 = network->AddInputLayer(1);
Jan Eilers1b2654f2021-09-24 15:45:46 +0100827 armnn::ComparisonDescriptor equalDescriptor(armnn::ComparisonOperation::Equal);
828 armnn::IConnectableLayer* const equalLayer = network->AddComparisonLayer(equalDescriptor, layerName.c_str());
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100829 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
830
Finn Williamsb454c5c2021-02-09 15:56:23 +0000831 inputLayer1->GetOutputSlot(0).Connect(equalLayer->GetInputSlot(0));
832 inputLayer1->GetOutputSlot(0).SetTensorInfo(inputTensorInfo1);
833 inputLayer2->GetOutputSlot(0).Connect(equalLayer->GetInputSlot(1));
834 inputLayer2->GetOutputSlot(0).SetTensorInfo(inputTensorInfo2);
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100835 equalLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
Finn Williamsb454c5c2021-02-09 15:56:23 +0000836 equalLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100837
838 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100839 CHECK(deserializedNetwork);
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100840
Finn Williamsb454c5c2021-02-09 15:56:23 +0000841 LayerVerifierBase verifier(layerName, {inputTensorInfo1, inputTensorInfo2}, {outputTensorInfo});
842 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tar6d2e6592019-10-22 11:44:47 +0100843}
844
Teresa Charlin50de4fa2021-05-31 18:47:33 +0100845void SerializeElementwiseUnaryTest(armnn::UnaryOperation unaryOperation)
846{
847 auto layerName = GetUnaryOperationAsCString(unaryOperation);
848
849 const armnn::TensorShape shape{2, 1, 2, 2};
850
851 const armnn::TensorInfo inputInfo = armnn::TensorInfo(shape, armnn::DataType::Float32);
852 const armnn::TensorInfo outputInfo = armnn::TensorInfo(shape, armnn::DataType::Float32);
853
854 armnn::ElementwiseUnaryDescriptor descriptor(unaryOperation);
855
856 armnn::INetworkPtr network = armnn::INetwork::Create();
857 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
858 armnn::IConnectableLayer* const elementwiseUnaryLayer =
859 network->AddElementwiseUnaryLayer(descriptor, layerName);
860 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
861
862 inputLayer->GetOutputSlot(0).Connect(elementwiseUnaryLayer->GetInputSlot(0));
863 elementwiseUnaryLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
864
865 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
866 elementwiseUnaryLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
867
868 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
869
870 CHECK(deserializedNetwork);
871
872 LayerVerifierBaseWithDescriptor<armnn::ElementwiseUnaryDescriptor>
873 verifier(layerName, { inputInfo }, { outputInfo }, descriptor);
874
875 deserializedNetwork->ExecuteStrategy(verifier);
876}
877
878TEST_CASE("SerializeElementwiseUnary")
879{
880 using op = armnn::UnaryOperation;
881 std::initializer_list<op> allUnaryOperations = {op::Abs, op::Exp, op::Sqrt, op::Rsqrt, op::Neg,
882 op::LogicalNot, op::Log, op::Sin};
883
884 for (auto unaryOperation : allUnaryOperations)
885 {
886 SerializeElementwiseUnaryTest(unaryOperation);
887 }
888}
889
Sadik Armagan1625efc2021-06-10 18:24:34 +0100890TEST_CASE("SerializeFill")
Keith Davis300ad562020-06-04 16:34:23 +0100891{
Keith Davis300ad562020-06-04 16:34:23 +0100892 const std::string layerName("fill");
Teresa Charlin4b10fef2020-07-29 09:36:41 +0100893 const armnn::TensorInfo inputInfo({4}, armnn::DataType::Signed32);
Keith Davis300ad562020-06-04 16:34:23 +0100894 const armnn::TensorInfo outputInfo({1, 3, 3, 1}, armnn::DataType::Float32);
895
896 armnn::FillDescriptor descriptor(1.0f);
897
898 armnn::INetworkPtr network = armnn::INetwork::Create();
899 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
900 armnn::IConnectableLayer* const fillLayer = network->AddFillLayer(descriptor, layerName.c_str());
901 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
902
903 inputLayer->GetOutputSlot(0).Connect(fillLayer->GetInputSlot(0));
904 fillLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
905
906 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
907 fillLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
908
909 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100910 CHECK(deserializedNetwork);
Keith Davis300ad562020-06-04 16:34:23 +0100911
Finn Williamsb454c5c2021-02-09 15:56:23 +0000912 LayerVerifierBaseWithDescriptor<armnn::FillDescriptor> verifier(layerName, {inputInfo}, {outputInfo}, descriptor);
Keith Davis300ad562020-06-04 16:34:23 +0100913
Finn Williamsb454c5c2021-02-09 15:56:23 +0000914 deserializedNetwork->ExecuteStrategy(verifier);
Keith Davis300ad562020-06-04 16:34:23 +0100915}
916
Sadik Armagan1625efc2021-06-10 18:24:34 +0100917TEST_CASE("SerializeFloor")
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100918{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000919 const std::string layerName("floor");
920 const armnn::TensorInfo info({4,4}, armnn::DataType::Float32);
921
922 armnn::INetworkPtr network = armnn::INetwork::Create();
923 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
924 armnn::IConnectableLayer* const floorLayer = network->AddFloorLayer(layerName.c_str());
925 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
926
927 inputLayer->GetOutputSlot(0).Connect(floorLayer->GetInputSlot(0));
928 floorLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
929
930 inputLayer->GetOutputSlot(0).SetTensorInfo(info);
931 floorLayer->GetOutputSlot(0).SetTensorInfo(info);
932
933 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100934 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000935
Finn Williamsb454c5c2021-02-09 15:56:23 +0000936 LayerVerifierBase verifier(layerName, {info}, {info});
937 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000938}
939
Matthew Sloyan81beae32021-07-13 19:46:11 +0100940using FullyConnectedDescriptor = armnn::FullyConnectedDescriptor;
941class FullyConnectedLayerVerifier : public LayerVerifierBaseWithDescriptor<FullyConnectedDescriptor>
942{
943public:
944 FullyConnectedLayerVerifier(const std::string& layerName,
945 const std::vector<armnn::TensorInfo>& inputInfos,
946 const std::vector<armnn::TensorInfo>& outputInfos,
947 const FullyConnectedDescriptor& descriptor)
948 : LayerVerifierBaseWithDescriptor<FullyConnectedDescriptor>(layerName, inputInfos, outputInfos, descriptor) {}
949
950 void ExecuteStrategy(const armnn::IConnectableLayer* layer,
951 const armnn::BaseDescriptor& descriptor,
952 const std::vector<armnn::ConstTensor>& constants,
953 const char* name,
954 const armnn::LayerBindingId id = 0) override
955 {
956 armnn::IgnoreUnused(constants, id);
957 switch (layer->GetType())
958 {
959 case armnn::LayerType::Input: break;
960 case armnn::LayerType::Output: break;
961 case armnn::LayerType::Constant: break;
962 default:
963 {
964 VerifyNameAndConnections(layer, name);
965 const FullyConnectedDescriptor& layerDescriptor =
966 static_cast<const FullyConnectedDescriptor&>(descriptor);
967 CHECK(layerDescriptor.m_ConstantWeights == m_Descriptor.m_ConstantWeights);
968 CHECK(layerDescriptor.m_BiasEnabled == m_Descriptor.m_BiasEnabled);
969 CHECK(layerDescriptor.m_TransposeWeightMatrix == m_Descriptor.m_TransposeWeightMatrix);
970 }
971 }
972 }
973};
974
Sadik Armagan1625efc2021-06-10 18:24:34 +0100975TEST_CASE("SerializeFullyConnected")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000976{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000977 const std::string layerName("fullyConnected");
978 const armnn::TensorInfo inputInfo ({ 2, 5, 1, 1 }, armnn::DataType::Float32);
979 const armnn::TensorInfo outputInfo({ 2, 3 }, armnn::DataType::Float32);
980
Cathal Corbett5b8093c2021-10-22 11:12:07 +0100981 const armnn::TensorInfo weightsInfo({ 5, 3 }, armnn::DataType::Float32, 0.0f, 0, true);
982 const armnn::TensorInfo biasesInfo ({ 3 }, armnn::DataType::Float32, 0.0f, 0, true);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000983 std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements());
984 std::vector<float> biasesData = GenerateRandomData<float>(biasesInfo.GetNumElements());
985 armnn::ConstTensor weights(weightsInfo, weightsData);
986 armnn::ConstTensor biases(biasesInfo, biasesData);
987
988 armnn::FullyConnectedDescriptor descriptor;
989 descriptor.m_BiasEnabled = true;
990 descriptor.m_TransposeWeightMatrix = false;
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000991 descriptor.m_ConstantWeights = true;
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000992
993 armnn::INetworkPtr network = armnn::INetwork::Create();
994 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
Francis Murtaghbb6c6492022-02-09 15:13:38 +0000995 armnn::IConnectableLayer* const weightsInputLayer = network->AddInputLayer(1);
996 armnn::IConnectableLayer* const biasInputLayer = network->AddInputLayer(2);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000997 armnn::IConnectableLayer* const fullyConnectedLayer =
Francis Murtaghbb6c6492022-02-09 15:13:38 +0000998 network->AddFullyConnectedLayer(descriptor,
999 layerName.c_str());
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001000 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1001
1002 inputLayer->GetOutputSlot(0).Connect(fullyConnectedLayer->GetInputSlot(0));
Francis Murtaghbb6c6492022-02-09 15:13:38 +00001003 weightsInputLayer->GetOutputSlot(0).Connect(fullyConnectedLayer->GetInputSlot(1));
1004 biasInputLayer->GetOutputSlot(0).Connect(fullyConnectedLayer->GetInputSlot(2));
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001005 fullyConnectedLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1006
1007 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
Francis Murtaghbb6c6492022-02-09 15:13:38 +00001008 weightsInputLayer->GetOutputSlot(0).SetTensorInfo(weightsInfo);
1009 biasInputLayer->GetOutputSlot(0).SetTensorInfo(biasesInfo);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001010 fullyConnectedLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1011
1012 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001013 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001014
Matthew Sloyan81beae32021-07-13 19:46:11 +01001015 FullyConnectedLayerVerifier verifier(layerName, {inputInfo, weightsInfo, biasesInfo}, {outputInfo}, descriptor);
Finn Williamsb454c5c2021-02-09 15:56:23 +00001016 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001017}
1018
Matthew Sloyan81beae32021-07-13 19:46:11 +01001019TEST_CASE("SerializeFullyConnectedWeightsAndBiasesAsInputs")
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001020{
1021 const std::string layerName("fullyConnected_weights_as_inputs");
1022 const armnn::TensorInfo inputInfo ({ 2, 5, 1, 1 }, armnn::DataType::Float32);
1023 const armnn::TensorInfo outputInfo({ 2, 3 }, armnn::DataType::Float32);
1024
1025 const armnn::TensorInfo weightsInfo({ 5, 3 }, armnn::DataType::Float32);
1026 const armnn::TensorInfo biasesInfo ({ 3 }, armnn::DataType::Float32);
1027
1028 armnn::Optional<armnn::ConstTensor> weights = armnn::EmptyOptional();
1029 armnn::Optional<armnn::ConstTensor> bias = armnn::EmptyOptional();
1030
1031 armnn::FullyConnectedDescriptor descriptor;
1032 descriptor.m_BiasEnabled = true;
1033 descriptor.m_TransposeWeightMatrix = false;
1034 descriptor.m_ConstantWeights = false;
1035
1036 armnn::INetworkPtr network = armnn::INetwork::Create();
1037 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1038 armnn::IConnectableLayer* const weightsInputLayer = network->AddInputLayer(1);
1039 armnn::IConnectableLayer* const biasInputLayer = network->AddInputLayer(2);
1040 armnn::IConnectableLayer* const fullyConnectedLayer =
1041 network->AddFullyConnectedLayer(descriptor,
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001042 layerName.c_str());
1043 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1044
1045 inputLayer->GetOutputSlot(0).Connect(fullyConnectedLayer->GetInputSlot(0));
1046 weightsInputLayer->GetOutputSlot(0).Connect(fullyConnectedLayer->GetInputSlot(1));
1047 biasInputLayer->GetOutputSlot(0).Connect(fullyConnectedLayer->GetInputSlot(2));
1048 fullyConnectedLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1049
1050 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
1051 weightsInputLayer->GetOutputSlot(0).SetTensorInfo(weightsInfo);
1052 biasInputLayer->GetOutputSlot(0).SetTensorInfo(biasesInfo);
1053 fullyConnectedLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1054
1055 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001056 CHECK(deserializedNetwork);
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001057
1058 const std::vector<armnn::ConstTensor> constants {};
1059 LayerVerifierBaseWithDescriptorAndConstants<armnn::FullyConnectedDescriptor> verifier(
1060 layerName, {inputInfo, weightsInfo, biasesInfo}, {outputInfo}, descriptor, constants);
1061 deserializedNetwork->ExecuteStrategy(verifier);
1062}
1063
Matthew Sloyan81beae32021-07-13 19:46:11 +01001064TEST_CASE("SerializeFullyConnectedWeightsAndBiasesAsConstantLayers")
1065{
1066 const std::string layerName("fullyConnected_weights_as_inputs");
1067 const armnn::TensorInfo inputInfo ({ 2, 5, 1, 1 }, armnn::DataType::Float32);
1068 const armnn::TensorInfo outputInfo({ 2, 3 }, armnn::DataType::Float32);
1069
Cathal Corbett5b8093c2021-10-22 11:12:07 +01001070 const armnn::TensorInfo weightsInfo({ 5, 3 }, armnn::DataType::Float32, 0.0f, 0, true);
1071 const armnn::TensorInfo biasesInfo ({ 3 }, armnn::DataType::Float32, 0.0f, 0, true);
Matthew Sloyan81beae32021-07-13 19:46:11 +01001072
1073 std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements());
1074 std::vector<float> biasesData = GenerateRandomData<float>(biasesInfo.GetNumElements());
1075 armnn::ConstTensor weights(weightsInfo, weightsData);
1076 armnn::ConstTensor biases(biasesInfo, biasesData);
1077
1078 armnn::FullyConnectedDescriptor descriptor;
1079 descriptor.m_BiasEnabled = true;
1080 descriptor.m_TransposeWeightMatrix = false;
1081 descriptor.m_ConstantWeights = true;
1082
1083 armnn::INetworkPtr network = armnn::INetwork::Create();
1084 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1085 armnn::IConnectableLayer* const weightsLayer = network->AddConstantLayer(weights, "Weights");
1086 armnn::IConnectableLayer* const biasesLayer = network->AddConstantLayer(biases, "Biases");
1087 armnn::IConnectableLayer* const fullyConnectedLayer = network->AddFullyConnectedLayer(descriptor,layerName.c_str());
1088 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1089
1090 inputLayer->GetOutputSlot(0).Connect(fullyConnectedLayer->GetInputSlot(0));
1091 weightsLayer->GetOutputSlot(0).Connect(fullyConnectedLayer->GetInputSlot(1));
1092 biasesLayer->GetOutputSlot(0).Connect(fullyConnectedLayer->GetInputSlot(2));
1093 fullyConnectedLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1094
1095 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
1096 weightsLayer->GetOutputSlot(0).SetTensorInfo(weightsInfo);
1097 biasesLayer->GetOutputSlot(0).SetTensorInfo(biasesInfo);
1098 fullyConnectedLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1099
1100 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
1101 CHECK(deserializedNetwork);
1102
1103 FullyConnectedLayerVerifier verifier(layerName, {inputInfo, weightsInfo, biasesInfo}, {outputInfo}, descriptor);
1104 deserializedNetwork->ExecuteStrategy(verifier);
1105}
1106
Sadik Armagan1625efc2021-06-10 18:24:34 +01001107TEST_CASE("SerializeGather")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001108{
Teresa Charlin52664732020-06-29 16:27:03 +01001109 using GatherDescriptor = armnn::GatherDescriptor;
1110 class GatherLayerVerifier : public LayerVerifierBaseWithDescriptor<GatherDescriptor>
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001111 {
1112 public:
1113 GatherLayerVerifier(const std::string& layerName,
1114 const std::vector<armnn::TensorInfo>& inputInfos,
Teresa Charlin52664732020-06-29 16:27:03 +01001115 const std::vector<armnn::TensorInfo>& outputInfos,
1116 const GatherDescriptor& descriptor)
1117 : LayerVerifierBaseWithDescriptor<GatherDescriptor>(layerName, inputInfos, outputInfos, descriptor) {}
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001118
Finn Williamsb454c5c2021-02-09 15:56:23 +00001119 void ExecuteStrategy(const armnn::IConnectableLayer* layer,
1120 const armnn::BaseDescriptor& descriptor,
1121 const std::vector<armnn::ConstTensor>& constants,
1122 const char* name,
1123 const armnn::LayerBindingId id = 0) override
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001124 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001125 armnn::IgnoreUnused(constants, id);
1126 switch (layer->GetType())
1127 {
1128 case armnn::LayerType::Input: break;
1129 case armnn::LayerType::Output: break;
1130 case armnn::LayerType::Constant: break;
1131 default:
1132 {
1133 VerifyNameAndConnections(layer, name);
1134 const GatherDescriptor& layerDescriptor = static_cast<const GatherDescriptor&>(descriptor);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001135 CHECK(layerDescriptor.m_Axis == m_Descriptor.m_Axis);
Finn Williamsb454c5c2021-02-09 15:56:23 +00001136 }
1137 }
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001138 }
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001139 };
1140
1141 const std::string layerName("gather");
Derek Lambertif90c56d2020-01-10 17:14:08 +00001142 armnn::TensorInfo paramsInfo({ 8 }, armnn::DataType::QAsymmU8);
1143 armnn::TensorInfo outputInfo({ 3 }, armnn::DataType::QAsymmU8);
Cathal Corbett5b8093c2021-10-22 11:12:07 +01001144 const armnn::TensorInfo indicesInfo({ 3 }, armnn::DataType::Signed32, 0.0f, 0, true);
Teresa Charlin52664732020-06-29 16:27:03 +01001145 GatherDescriptor descriptor;
1146 descriptor.m_Axis = 1;
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001147
1148 paramsInfo.SetQuantizationScale(1.0f);
1149 paramsInfo.SetQuantizationOffset(0);
1150 outputInfo.SetQuantizationScale(1.0f);
1151 outputInfo.SetQuantizationOffset(0);
1152
1153 const std::vector<int32_t>& indicesData = {7, 6, 5};
1154
1155 armnn::INetworkPtr network = armnn::INetwork::Create();
1156 armnn::IConnectableLayer *const inputLayer = network->AddInputLayer(0);
1157 armnn::IConnectableLayer *const constantLayer =
1158 network->AddConstantLayer(armnn::ConstTensor(indicesInfo, indicesData));
Teresa Charlin52664732020-06-29 16:27:03 +01001159 armnn::IConnectableLayer *const gatherLayer = network->AddGatherLayer(descriptor, layerName.c_str());
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001160 armnn::IConnectableLayer *const outputLayer = network->AddOutputLayer(0);
1161
1162 inputLayer->GetOutputSlot(0).Connect(gatherLayer->GetInputSlot(0));
1163 constantLayer->GetOutputSlot(0).Connect(gatherLayer->GetInputSlot(1));
1164 gatherLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1165
1166 inputLayer->GetOutputSlot(0).SetTensorInfo(paramsInfo);
1167 constantLayer->GetOutputSlot(0).SetTensorInfo(indicesInfo);
1168 gatherLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1169
1170 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001171 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001172
Teresa Charlin52664732020-06-29 16:27:03 +01001173 GatherLayerVerifier verifier(layerName, {paramsInfo, indicesInfo}, {outputInfo}, descriptor);
Finn Williamsb454c5c2021-02-09 15:56:23 +00001174 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001175}
1176
Teresa Charlin6966bfa2022-04-25 17:14:50 +01001177TEST_CASE("SerializeGatherNd")
1178{
1179 class GatherNdLayerVerifier : public LayerVerifierBase
1180 {
1181 public:
1182 GatherNdLayerVerifier(const std::string& layerName,
1183 const std::vector<armnn::TensorInfo>& inputInfos,
1184 const std::vector<armnn::TensorInfo>& outputInfos)
1185 : LayerVerifierBase(layerName, inputInfos, outputInfos) {}
1186
1187 void ExecuteStrategy(const armnn::IConnectableLayer* layer,
1188 const armnn::BaseDescriptor& descriptor,
1189 const std::vector<armnn::ConstTensor>& constants,
1190 const char* name,
1191 const armnn::LayerBindingId id = 0) override
1192 {
1193 armnn::IgnoreUnused(constants, id);
1194 switch (layer->GetType())
1195 {
1196 case armnn::LayerType::Input:
1197 case armnn::LayerType::Output:
1198 case armnn::LayerType::Constant:
1199 break;
1200 default:
1201 {
1202 VerifyNameAndConnections(layer, name);
1203 }
1204 }
1205 }
1206 };
1207
1208 const std::string layerName("gatherNd");
1209 armnn::TensorInfo paramsInfo({ 6, 3 }, armnn::DataType::QAsymmU8);
1210 armnn::TensorInfo outputInfo({ 3, 3 }, armnn::DataType::QAsymmU8);
1211 const armnn::TensorInfo indicesInfo({ 3, 1 }, armnn::DataType::Signed32, 0.0f, 0, true);
1212
1213 paramsInfo.SetQuantizationScale(1.0f);
1214 paramsInfo.SetQuantizationOffset(0);
1215 outputInfo.SetQuantizationScale(1.0f);
1216 outputInfo.SetQuantizationOffset(0);
1217
1218 const std::vector<int32_t>& indicesData = {5, 1, 0};
1219
1220 armnn::INetworkPtr network = armnn::INetwork::Create();
1221 armnn::IConnectableLayer *const inputLayer = network->AddInputLayer(0);
1222 armnn::IConnectableLayer *const constantLayer =
1223 network->AddConstantLayer(armnn::ConstTensor(indicesInfo, indicesData));
1224 armnn::IConnectableLayer *const gatherNdLayer = network->AddGatherNdLayer(layerName.c_str());
1225 armnn::IConnectableLayer *const outputLayer = network->AddOutputLayer(0);
1226
1227 inputLayer->GetOutputSlot(0).Connect(gatherNdLayer->GetInputSlot(0));
1228 constantLayer->GetOutputSlot(0).Connect(gatherNdLayer->GetInputSlot(1));
1229 gatherNdLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1230
1231 inputLayer->GetOutputSlot(0).SetTensorInfo(paramsInfo);
1232 constantLayer->GetOutputSlot(0).SetTensorInfo(indicesInfo);
1233 gatherNdLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1234
1235 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
1236 CHECK(deserializedNetwork);
1237
1238 GatherNdLayerVerifier verifier(layerName, {paramsInfo, indicesInfo}, {outputInfo});
1239 deserializedNetwork->ExecuteStrategy(verifier);
1240}
Aron Virginas-Tar6d2e6592019-10-22 11:44:47 +01001241
Jan Eilers1b2654f2021-09-24 15:45:46 +01001242TEST_CASE("SerializeComparisonGreater")
Aron Virginas-Tar781ced92019-10-03 11:15:39 +01001243{
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01001244 const std::string layerName("greater");
1245
1246 const armnn::TensorShape shape{2, 1, 2, 4};
1247
1248 const armnn::TensorInfo inputInfo = armnn::TensorInfo(shape, armnn::DataType::Float32);
1249 const armnn::TensorInfo outputInfo = armnn::TensorInfo(shape, armnn::DataType::Boolean);
1250
1251 armnn::INetworkPtr network = armnn::INetwork::Create();
1252 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
1253 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
Jan Eilers1b2654f2021-09-24 15:45:46 +01001254 armnn::ComparisonDescriptor greaterDescriptor(armnn::ComparisonOperation::Greater);
1255 armnn::IConnectableLayer* const equalLayer = network->AddComparisonLayer(greaterDescriptor, layerName.c_str());
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01001256 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1257
1258 inputLayer0->GetOutputSlot(0).Connect(equalLayer->GetInputSlot(0));
1259 inputLayer1->GetOutputSlot(0).Connect(equalLayer->GetInputSlot(1));
1260 equalLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1261
1262 inputLayer0->GetOutputSlot(0).SetTensorInfo(inputInfo);
1263 inputLayer1->GetOutputSlot(0).SetTensorInfo(inputInfo);
1264 equalLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1265
1266 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001267 CHECK(deserializedNetwork);
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01001268
Finn Williamsb454c5c2021-02-09 15:56:23 +00001269 LayerVerifierBase verifier(layerName, { inputInfo, inputInfo }, { outputInfo });
1270 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01001271}
1272
Aron Virginas-Tar6d2e6592019-10-22 11:44:47 +01001273
Sadik Armagan1625efc2021-06-10 18:24:34 +01001274TEST_CASE("SerializeInstanceNormalization")
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01001275{
Aron Virginas-Tar781ced92019-10-03 11:15:39 +01001276 const std::string layerName("instanceNormalization");
1277 const armnn::TensorInfo info({ 1, 2, 1, 5 }, armnn::DataType::Float32);
1278
1279 armnn::InstanceNormalizationDescriptor descriptor;
1280 descriptor.m_Gamma = 1.1f;
1281 descriptor.m_Beta = 0.1f;
1282 descriptor.m_Eps = 0.0001f;
1283 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
1284
1285 armnn::INetworkPtr network = armnn::INetwork::Create();
1286 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1287 armnn::IConnectableLayer* const instanceNormLayer =
1288 network->AddInstanceNormalizationLayer(descriptor, layerName.c_str());
1289 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1290
1291 inputLayer->GetOutputSlot(0).Connect(instanceNormLayer->GetInputSlot(0));
1292 instanceNormLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1293
1294 inputLayer->GetOutputSlot(0).SetTensorInfo(info);
1295 instanceNormLayer->GetOutputSlot(0).SetTensorInfo(info);
1296
1297 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001298 CHECK(deserializedNetwork);
Aron Virginas-Tar781ced92019-10-03 11:15:39 +01001299
Finn Williamsb454c5c2021-02-09 15:56:23 +00001300 LayerVerifierBaseWithDescriptor<armnn::InstanceNormalizationDescriptor> verifier(
1301 layerName, {info}, {info}, descriptor);
1302 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tar781ced92019-10-03 11:15:39 +01001303}
1304
Sadik Armagan1625efc2021-06-10 18:24:34 +01001305TEST_CASE("SerializeL2Normalization")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001306{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001307 const std::string l2NormLayerName("l2Normalization");
1308 const armnn::TensorInfo info({1, 2, 1, 5}, armnn::DataType::Float32);
1309
1310 armnn::L2NormalizationDescriptor desc;
1311 desc.m_DataLayout = armnn::DataLayout::NCHW;
Ferran Balaguer0dcffec2019-06-18 16:25:06 +01001312 desc.m_Eps = 0.0001f;
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001313
1314 armnn::INetworkPtr network = armnn::INetwork::Create();
1315 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
1316 armnn::IConnectableLayer* const l2NormLayer = network->AddL2NormalizationLayer(desc, l2NormLayerName.c_str());
1317 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1318
1319 inputLayer0->GetOutputSlot(0).Connect(l2NormLayer->GetInputSlot(0));
1320 l2NormLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1321
1322 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
1323 l2NormLayer->GetOutputSlot(0).SetTensorInfo(info);
1324
1325 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001326 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001327
Finn Williamsb454c5c2021-02-09 15:56:23 +00001328 LayerVerifierBaseWithDescriptor<armnn::L2NormalizationDescriptor> verifier(
1329 l2NormLayerName, {info}, {info}, desc);
1330 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001331}
1332
Sadik Armagan1625efc2021-06-10 18:24:34 +01001333TEST_CASE("EnsureL2NormalizationBackwardCompatibility")
Ferran Balaguer0dcffec2019-06-18 16:25:06 +01001334{
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001335 // The hex data below is a flat buffer containing a simple network with one input
Ferran Balaguer0dcffec2019-06-18 16:25:06 +01001336 // a L2Normalization layer and an output layer with dimensions as per the tensor infos below.
1337 //
1338 // This test verifies that we can still read back these old style
1339 // models without the normalization epsilon value.
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001340 const std::vector<uint8_t> l2NormalizationModel =
Ferran Balaguer0dcffec2019-06-18 16:25:06 +01001341 {
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001342 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x0A, 0x00,
1343 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
1344 0x3C, 0x01, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
1345 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xE8, 0xFE, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x0B,
1346 0x04, 0x00, 0x00, 0x00, 0xD6, 0xFE, 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x08, 0x00,
1347 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x9E, 0xFF, 0xFF, 0xFF, 0x02, 0x00, 0x00, 0x00,
1348 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00,
1349 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1350 0x4C, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
1351 0x00, 0x20, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00,
1352 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
1353 0x0E, 0x00, 0x18, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x14, 0x00, 0x0E, 0x00, 0x00, 0x00,
1354 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x20, 0x00,
1355 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x6C, 0x32, 0x4E, 0x6F, 0x72, 0x6D, 0x61, 0x6C, 0x69, 0x7A, 0x61, 0x74,
1356 0x69, 0x6F, 0x6E, 0x00, 0x01, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00,
1357 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
1358 0x52, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00,
1359 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
1360 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1361 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x07, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09,
1362 0x04, 0x00, 0x00, 0x00, 0xF6, 0xFF, 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0A, 0x00,
1363 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x00, 0x00,
1364 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00,
1365 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1366 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0A, 0x00, 0x00, 0x00,
1367 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x08, 0x00,
1368 0x07, 0x00, 0x0C, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
1369 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
1370 0x05, 0x00, 0x00, 0x00, 0x00
1371 };
1372
1373 armnn::INetworkPtr deserializedNetwork =
1374 DeserializeNetwork(std::string(l2NormalizationModel.begin(), l2NormalizationModel.end()));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001375 CHECK(deserializedNetwork);
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001376
Ferran Balaguer0dcffec2019-06-18 16:25:06 +01001377 const std::string layerName("l2Normalization");
1378 const armnn::TensorInfo inputInfo = armnn::TensorInfo({1, 2, 1, 5}, armnn::DataType::Float32);
1379
1380 armnn::L2NormalizationDescriptor desc;
1381 desc.m_DataLayout = armnn::DataLayout::NCHW;
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001382 // Since this variable does not exist in the l2NormalizationModel dump, the default value will be loaded
Ferran Balaguer0dcffec2019-06-18 16:25:06 +01001383 desc.m_Eps = 1e-12f;
1384
Finn Williamsb454c5c2021-02-09 15:56:23 +00001385 LayerVerifierBaseWithDescriptor<armnn::L2NormalizationDescriptor> verifier(
1386 layerName, {inputInfo}, {inputInfo}, desc);
1387 deserializedNetwork->ExecuteStrategy(verifier);
Ferran Balaguer0dcffec2019-06-18 16:25:06 +01001388}
1389
Sadik Armagan1625efc2021-06-10 18:24:34 +01001390TEST_CASE("SerializeLogicalBinary")
James Conroyaba90cd2020-11-06 16:28:18 +00001391{
James Conroyaba90cd2020-11-06 16:28:18 +00001392 const std::string layerName("logicalBinaryAnd");
1393
1394 const armnn::TensorShape shape{2, 1, 2, 2};
1395
1396 const armnn::TensorInfo inputInfo = armnn::TensorInfo(shape, armnn::DataType::Boolean);
1397 const armnn::TensorInfo outputInfo = armnn::TensorInfo(shape, armnn::DataType::Boolean);
1398
1399 armnn::LogicalBinaryDescriptor descriptor(armnn::LogicalBinaryOperation::LogicalAnd);
1400
1401 armnn::INetworkPtr network = armnn::INetwork::Create();
1402 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
1403 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
1404 armnn::IConnectableLayer* const logicalBinaryLayer = network->AddLogicalBinaryLayer(descriptor, layerName.c_str());
1405 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1406
1407 inputLayer0->GetOutputSlot(0).Connect(logicalBinaryLayer->GetInputSlot(0));
1408 inputLayer1->GetOutputSlot(0).Connect(logicalBinaryLayer->GetInputSlot(1));
1409 logicalBinaryLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1410
1411 inputLayer0->GetOutputSlot(0).SetTensorInfo(inputInfo);
1412 inputLayer1->GetOutputSlot(0).SetTensorInfo(inputInfo);
1413 logicalBinaryLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1414
1415 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001416 CHECK(deserializedNetwork);
James Conroyaba90cd2020-11-06 16:28:18 +00001417
Finn Williamsb454c5c2021-02-09 15:56:23 +00001418 LayerVerifierBaseWithDescriptor<armnn::LogicalBinaryDescriptor> verifier(
1419 layerName, { inputInfo, inputInfo }, { outputInfo }, descriptor);
1420 deserializedNetwork->ExecuteStrategy(verifier);
James Conroyaba90cd2020-11-06 16:28:18 +00001421}
1422
Sadik Armagan1625efc2021-06-10 18:24:34 +01001423TEST_CASE("SerializeLogSoftmax")
Sadik Armagan26257852019-10-14 13:00:47 +01001424{
Sadik Armagan26257852019-10-14 13:00:47 +01001425 const std::string layerName("log_softmax");
1426 const armnn::TensorInfo info({1, 10}, armnn::DataType::Float32);
1427
1428 armnn::LogSoftmaxDescriptor descriptor;
1429 descriptor.m_Beta = 1.0f;
1430 descriptor.m_Axis = -1;
1431
1432 armnn::INetworkPtr network = armnn::INetwork::Create();
1433 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1434 armnn::IConnectableLayer* const logSoftmaxLayer = network->AddLogSoftmaxLayer(descriptor, layerName.c_str());
1435 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1436
1437 inputLayer->GetOutputSlot(0).Connect(logSoftmaxLayer->GetInputSlot(0));
1438 logSoftmaxLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1439
1440 inputLayer->GetOutputSlot(0).SetTensorInfo(info);
1441 logSoftmaxLayer->GetOutputSlot(0).SetTensorInfo(info);
1442
1443 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001444 CHECK(deserializedNetwork);
Sadik Armagan26257852019-10-14 13:00:47 +01001445
Finn Williamsb454c5c2021-02-09 15:56:23 +00001446 LayerVerifierBaseWithDescriptor<armnn::LogSoftmaxDescriptor> verifier(layerName, {info}, {info}, descriptor);
1447 deserializedNetwork->ExecuteStrategy(verifier);
Sadik Armagan26257852019-10-14 13:00:47 +01001448}
1449
Sadik Armagan1625efc2021-06-10 18:24:34 +01001450TEST_CASE("SerializeMaximum")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001451{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001452 const std::string layerName("maximum");
1453 const armnn::TensorInfo info({ 1, 2, 2, 3 }, armnn::DataType::Float32);
1454
1455 armnn::INetworkPtr network = armnn::INetwork::Create();
1456 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
1457 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
1458 armnn::IConnectableLayer* const maximumLayer = network->AddMaximumLayer(layerName.c_str());
1459 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1460
1461 inputLayer0->GetOutputSlot(0).Connect(maximumLayer->GetInputSlot(0));
1462 inputLayer1->GetOutputSlot(0).Connect(maximumLayer->GetInputSlot(1));
1463 maximumLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1464
1465 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
1466 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
1467 maximumLayer->GetOutputSlot(0).SetTensorInfo(info);
1468
1469 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001470 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001471
Finn Williamsb454c5c2021-02-09 15:56:23 +00001472 LayerVerifierBase verifier(layerName, {info, info}, {info});
1473 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001474}
1475
Sadik Armagan1625efc2021-06-10 18:24:34 +01001476TEST_CASE("SerializeMean")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001477{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001478 const std::string layerName("mean");
1479 const armnn::TensorInfo inputInfo({1, 1, 3, 2}, armnn::DataType::Float32);
1480 const armnn::TensorInfo outputInfo({1, 1, 1, 2}, armnn::DataType::Float32);
1481
1482 armnn::MeanDescriptor descriptor;
1483 descriptor.m_Axis = { 2 };
1484 descriptor.m_KeepDims = true;
1485
1486 armnn::INetworkPtr network = armnn::INetwork::Create();
1487 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1488 armnn::IConnectableLayer* const meanLayer = network->AddMeanLayer(descriptor, layerName.c_str());
1489 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1490
1491 inputLayer->GetOutputSlot(0).Connect(meanLayer->GetInputSlot(0));
1492 meanLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1493
1494 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
1495 meanLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1496
1497 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001498 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001499
Finn Williamsb454c5c2021-02-09 15:56:23 +00001500 LayerVerifierBaseWithDescriptor<armnn::MeanDescriptor> verifier(layerName, {inputInfo}, {outputInfo}, descriptor);
1501 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001502}
1503
Sadik Armagan1625efc2021-06-10 18:24:34 +01001504TEST_CASE("SerializeMerge")
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +01001505{
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +01001506 const std::string layerName("merge");
1507 const armnn::TensorInfo info({ 1, 2, 2, 3 }, armnn::DataType::Float32);
1508
1509 armnn::INetworkPtr network = armnn::INetwork::Create();
1510 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
1511 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
1512 armnn::IConnectableLayer* const mergeLayer = network->AddMergeLayer(layerName.c_str());
1513 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1514
1515 inputLayer0->GetOutputSlot(0).Connect(mergeLayer->GetInputSlot(0));
1516 inputLayer1->GetOutputSlot(0).Connect(mergeLayer->GetInputSlot(1));
1517 mergeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1518
1519 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
1520 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
1521 mergeLayer->GetOutputSlot(0).SetTensorInfo(info);
1522
1523 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001524 CHECK(deserializedNetwork);
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +01001525
Finn Williamsb454c5c2021-02-09 15:56:23 +00001526 LayerVerifierBase verifier(layerName, {info, info}, {info});
1527 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +01001528}
1529
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01001530class MergerLayerVerifier : public LayerVerifierBaseWithDescriptor<armnn::OriginsDescriptor>
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001531{
Jim Flynn5fa83932019-05-09 15:35:43 +01001532public:
1533 MergerLayerVerifier(const std::string& layerName,
1534 const std::vector<armnn::TensorInfo>& inputInfos,
1535 const std::vector<armnn::TensorInfo>& outputInfos,
1536 const armnn::OriginsDescriptor& descriptor)
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01001537 : LayerVerifierBaseWithDescriptor<armnn::OriginsDescriptor>(layerName, inputInfos, outputInfos, descriptor) {}
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001538
Finn Williamsb454c5c2021-02-09 15:56:23 +00001539 void ExecuteStrategy(const armnn::IConnectableLayer* layer,
1540 const armnn::BaseDescriptor& descriptor,
1541 const std::vector<armnn::ConstTensor>& constants,
1542 const char* name,
1543 const armnn::LayerBindingId id = 0) override
Jim Flynn5fa83932019-05-09 15:35:43 +01001544 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001545 armnn::IgnoreUnused(descriptor, constants, id);
1546 switch (layer->GetType())
1547 {
1548 case armnn::LayerType::Input: break;
1549 case armnn::LayerType::Output: break;
1550 case armnn::LayerType::Merge:
1551 {
1552 throw armnn::Exception("MergerLayer should have translated to ConcatLayer");
1553 break;
1554 }
1555 case armnn::LayerType::Concat:
1556 {
1557 VerifyNameAndConnections(layer, name);
1558 const armnn::MergerDescriptor& layerDescriptor =
1559 static_cast<const armnn::MergerDescriptor&>(descriptor);
1560 VerifyDescriptor(layerDescriptor);
1561 break;
1562 }
1563 default:
1564 {
1565 throw armnn::Exception("Unexpected layer type in Merge test model");
1566 }
1567 }
Jim Flynn5fa83932019-05-09 15:35:43 +01001568 }
Jim Flynn5fa83932019-05-09 15:35:43 +01001569};
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001570
Sadik Armagan1625efc2021-06-10 18:24:34 +01001571TEST_CASE("EnsureMergerLayerBackwardCompatibility")
Jim Flynn5fa83932019-05-09 15:35:43 +01001572{
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001573 // The hex data below is a flat buffer containing a simple network with two inputs
Jim Flynne242f2d2019-05-22 14:24:13 +01001574 // a merger layer (now deprecated) and an output layer with dimensions as per the tensor infos below.
1575 //
1576 // This test verifies that we can still read back these old style
Jim Flynn5fa83932019-05-09 15:35:43 +01001577 // models replacing the MergerLayers with ConcatLayers with the same parameters.
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001578 const std::vector<uint8_t> mergerModel =
Jim Flynn5fa83932019-05-09 15:35:43 +01001579 {
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001580 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x0A, 0x00,
1581 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
1582 0x38, 0x02, 0x00, 0x00, 0x8C, 0x01, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x02, 0x00,
1583 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
1584 0xF4, 0xFD, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x0B, 0x04, 0x00, 0x00, 0x00, 0x92, 0xFE, 0xFF, 0xFF, 0x04, 0x00,
1585 0x00, 0x00, 0x9A, 0xFE, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x7E, 0xFE, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00,
1586 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00,
1587 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1588 0xF8, 0xFE, 0xFF, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0xFE, 0xFF, 0xFF, 0x00, 0x00,
1589 0x00, 0x1F, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00,
1590 0x68, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00,
1591 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
1592 0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x22, 0xFF, 0xFF, 0xFF, 0x04, 0x00,
1593 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1594 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
1595 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFF, 0xFF, 0xFF,
1596 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x1C, 0x00,
1597 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x6D, 0x65, 0x72, 0x67, 0x65, 0x72, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
1598 0x5C, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x34, 0xFF,
1599 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x92, 0xFE, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00,
1600 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00,
1601 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00,
1602 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00,
1603 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0E, 0x00,
1604 0x07, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00,
1605 0x06, 0x00, 0x08, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0E, 0x00,
1606 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
1607 0x0E, 0x00, 0x18, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x14, 0x00, 0x0E, 0x00, 0x00, 0x00,
1608 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00,
1609 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
1610 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00,
1611 0x00, 0x00, 0x66, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1612 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00,
1613 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x07, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09,
1614 0x04, 0x00, 0x00, 0x00, 0xF6, 0xFF, 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0A, 0x00,
1615 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x00, 0x00,
1616 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00,
1617 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1618 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0A, 0x00, 0x00, 0x00,
1619 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x08, 0x00,
1620 0x07, 0x00, 0x0C, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
1621 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
1622 0x02, 0x00, 0x00, 0x00
1623 };
1624
1625 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(std::string(mergerModel.begin(), mergerModel.end()));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001626 CHECK(deserializedNetwork);
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001627
1628 const armnn::TensorInfo inputInfo = armnn::TensorInfo({ 2, 3, 2, 2 }, armnn::DataType::Float32);
1629 const armnn::TensorInfo outputInfo = armnn::TensorInfo({ 4, 3, 2, 2 }, armnn::DataType::Float32);
Jim Flynn5fa83932019-05-09 15:35:43 +01001630
1631 const std::vector<armnn::TensorShape> shapes({inputInfo.GetShape(), inputInfo.GetShape()});
1632
1633 armnn::OriginsDescriptor descriptor =
Jim Flynn825af452019-05-20 12:49:28 +01001634 armnn::CreateDescriptorForConcatenation(shapes.begin(), shapes.end(), 0);
Jim Flynn5fa83932019-05-09 15:35:43 +01001635
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001636 MergerLayerVerifier verifier("merger", { inputInfo, inputInfo }, { outputInfo }, descriptor);
Finn Williamsb454c5c2021-02-09 15:56:23 +00001637 deserializedNetwork->ExecuteStrategy(verifier);
Jim Flynn5fa83932019-05-09 15:35:43 +01001638}
1639
Sadik Armagan1625efc2021-06-10 18:24:34 +01001640TEST_CASE("SerializeConcat")
Jim Flynne242f2d2019-05-22 14:24:13 +01001641{
1642 const std::string layerName("concat");
1643 const armnn::TensorInfo inputInfo = armnn::TensorInfo({2, 3, 2, 2}, armnn::DataType::Float32);
1644 const armnn::TensorInfo outputInfo = armnn::TensorInfo({4, 3, 2, 2}, armnn::DataType::Float32);
1645
1646 const std::vector<armnn::TensorShape> shapes({inputInfo.GetShape(), inputInfo.GetShape()});
1647
1648 armnn::OriginsDescriptor descriptor =
1649 armnn::CreateDescriptorForConcatenation(shapes.begin(), shapes.end(), 0);
1650
1651 armnn::INetworkPtr network = armnn::INetwork::Create();
1652 armnn::IConnectableLayer* const inputLayerOne = network->AddInputLayer(0);
1653 armnn::IConnectableLayer* const inputLayerTwo = network->AddInputLayer(1);
1654 armnn::IConnectableLayer* const concatLayer = network->AddConcatLayer(descriptor, layerName.c_str());
1655 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1656
1657 inputLayerOne->GetOutputSlot(0).Connect(concatLayer->GetInputSlot(0));
1658 inputLayerTwo->GetOutputSlot(0).Connect(concatLayer->GetInputSlot(1));
1659 concatLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1660
1661 inputLayerOne->GetOutputSlot(0).SetTensorInfo(inputInfo);
1662 inputLayerTwo->GetOutputSlot(0).SetTensorInfo(inputInfo);
1663 concatLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1664
1665 std::string concatLayerNetwork = SerializeNetwork(*network);
1666 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(concatLayerNetwork);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001667 CHECK(deserializedNetwork);
Jim Flynne242f2d2019-05-22 14:24:13 +01001668
1669 // NOTE: using the MergerLayerVerifier to ensure that it is a concat layer and not a
1670 // merger layer that gets placed into the graph.
1671 MergerLayerVerifier verifier(layerName, {inputInfo, inputInfo}, {outputInfo}, descriptor);
Finn Williamsb454c5c2021-02-09 15:56:23 +00001672 deserializedNetwork->ExecuteStrategy(verifier);
Jim Flynne242f2d2019-05-22 14:24:13 +01001673}
1674
Sadik Armagan1625efc2021-06-10 18:24:34 +01001675TEST_CASE("SerializeMinimum")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001676{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001677 const std::string layerName("minimum");
1678 const armnn::TensorInfo info({ 1, 2, 2, 3 }, armnn::DataType::Float32);
1679
1680 armnn::INetworkPtr network = armnn::INetwork::Create();
1681 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
1682 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
1683 armnn::IConnectableLayer* const minimumLayer = network->AddMinimumLayer(layerName.c_str());
1684 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1685
1686 inputLayer0->GetOutputSlot(0).Connect(minimumLayer->GetInputSlot(0));
1687 inputLayer1->GetOutputSlot(0).Connect(minimumLayer->GetInputSlot(1));
1688 minimumLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1689
1690 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
1691 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
1692 minimumLayer->GetOutputSlot(0).SetTensorInfo(info);
1693
1694 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001695 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001696
Finn Williamsb454c5c2021-02-09 15:56:23 +00001697 LayerVerifierBase verifier(layerName, {info, info}, {info});
1698 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001699}
1700
Sadik Armagan1625efc2021-06-10 18:24:34 +01001701TEST_CASE("SerializeMultiplication")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001702{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001703 const std::string layerName("multiplication");
1704 const armnn::TensorInfo info({ 1, 5, 2, 3 }, armnn::DataType::Float32);
1705
1706 armnn::INetworkPtr network = armnn::INetwork::Create();
1707 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
1708 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
1709 armnn::IConnectableLayer* const multiplicationLayer = network->AddMultiplicationLayer(layerName.c_str());
1710 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1711
1712 inputLayer0->GetOutputSlot(0).Connect(multiplicationLayer->GetInputSlot(0));
1713 inputLayer1->GetOutputSlot(0).Connect(multiplicationLayer->GetInputSlot(1));
1714 multiplicationLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1715
1716 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
1717 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
1718 multiplicationLayer->GetOutputSlot(0).SetTensorInfo(info);
1719
1720 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001721 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001722
Finn Williamsb454c5c2021-02-09 15:56:23 +00001723 LayerVerifierBase verifier(layerName, {info, info}, {info});
1724 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001725}
1726
Sadik Armagan1625efc2021-06-10 18:24:34 +01001727TEST_CASE("SerializePrelu")
Ellen Norris-Thompson51982472019-06-19 11:46:21 +01001728{
Ellen Norris-Thompson51982472019-06-19 11:46:21 +01001729 const std::string layerName("prelu");
1730
1731 armnn::TensorInfo inputTensorInfo ({ 4, 1, 2 }, armnn::DataType::Float32);
1732 armnn::TensorInfo alphaTensorInfo ({ 5, 4, 3, 1 }, armnn::DataType::Float32);
1733 armnn::TensorInfo outputTensorInfo({ 5, 4, 3, 2 }, armnn::DataType::Float32);
1734
1735 armnn::INetworkPtr network = armnn::INetwork::Create();
1736 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1737 armnn::IConnectableLayer* const alphaLayer = network->AddInputLayer(1);
1738 armnn::IConnectableLayer* const preluLayer = network->AddPreluLayer(layerName.c_str());
1739 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1740
1741 inputLayer->GetOutputSlot(0).Connect(preluLayer->GetInputSlot(0));
1742 alphaLayer->GetOutputSlot(0).Connect(preluLayer->GetInputSlot(1));
1743 preluLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1744
1745 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
1746 alphaLayer->GetOutputSlot(0).SetTensorInfo(alphaTensorInfo);
1747 preluLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
1748
1749 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001750 CHECK(deserializedNetwork);
Ellen Norris-Thompson51982472019-06-19 11:46:21 +01001751
Finn Williamsb454c5c2021-02-09 15:56:23 +00001752 LayerVerifierBase verifier(layerName, {inputTensorInfo, alphaTensorInfo}, {outputTensorInfo});
1753 deserializedNetwork->ExecuteStrategy(verifier);
Ellen Norris-Thompson51982472019-06-19 11:46:21 +01001754}
1755
Sadik Armagan1625efc2021-06-10 18:24:34 +01001756TEST_CASE("SerializeNormalization")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001757{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001758 const std::string layerName("normalization");
1759 const armnn::TensorInfo info({2, 1, 2, 2}, armnn::DataType::Float32);
1760
1761 armnn::NormalizationDescriptor desc;
1762 desc.m_DataLayout = armnn::DataLayout::NCHW;
1763 desc.m_NormSize = 3;
1764 desc.m_Alpha = 1;
1765 desc.m_Beta = 1;
1766 desc.m_K = 1;
1767
1768 armnn::INetworkPtr network = armnn::INetwork::Create();
1769 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1770 armnn::IConnectableLayer* const normalizationLayer = network->AddNormalizationLayer(desc, layerName.c_str());
1771 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1772
1773 inputLayer->GetOutputSlot(0).Connect(normalizationLayer->GetInputSlot(0));
1774 normalizationLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1775
1776 inputLayer->GetOutputSlot(0).SetTensorInfo(info);
1777 normalizationLayer->GetOutputSlot(0).SetTensorInfo(info);
1778
1779 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001780 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001781
Finn Williamsb454c5c2021-02-09 15:56:23 +00001782 LayerVerifierBaseWithDescriptor<armnn::NormalizationDescriptor> verifier(layerName, {info}, {info}, desc);
1783 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001784}
1785
Sadik Armagan1625efc2021-06-10 18:24:34 +01001786TEST_CASE("SerializePad")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001787{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001788 const std::string layerName("pad");
1789 const armnn::TensorInfo inputTensorInfo = armnn::TensorInfo({1, 2, 3, 4}, armnn::DataType::Float32);
1790 const armnn::TensorInfo outputTensorInfo = armnn::TensorInfo({1, 3, 5, 7}, armnn::DataType::Float32);
1791
1792 armnn::PadDescriptor desc({{0, 0}, {1, 0}, {1, 1}, {1, 2}});
1793
1794 armnn::INetworkPtr network = armnn::INetwork::Create();
1795 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1796 armnn::IConnectableLayer* const padLayer = network->AddPadLayer(desc, layerName.c_str());
1797 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1798
1799 inputLayer->GetOutputSlot(0).Connect(padLayer->GetInputSlot(0));
1800 padLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1801
1802 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
1803 padLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
1804
1805 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001806 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001807
Finn Williamsb454c5c2021-02-09 15:56:23 +00001808 LayerVerifierBaseWithDescriptor<armnn::PadDescriptor> verifier(layerName,
1809 {inputTensorInfo},
1810 {outputTensorInfo},
1811 desc);
1812 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001813}
1814
Matthew Sloyan2e5d0b22021-10-21 14:05:31 +01001815TEST_CASE("SerializePadReflect")
1816{
1817 const std::string layerName("padReflect");
1818 const armnn::TensorInfo inputTensorInfo = armnn::TensorInfo({1, 2, 3, 4}, armnn::DataType::Float32);
1819 const armnn::TensorInfo outputTensorInfo = armnn::TensorInfo({1, 3, 5, 7}, armnn::DataType::Float32);
1820
1821 armnn::PadDescriptor desc({{0, 0}, {1, 0}, {1, 1}, {1, 2}});
1822 desc.m_PaddingMode = armnn::PaddingMode::Reflect;
1823
1824 armnn::INetworkPtr network = armnn::INetwork::Create();
1825 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1826 armnn::IConnectableLayer* const padLayer = network->AddPadLayer(desc, layerName.c_str());
1827 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1828
1829 inputLayer->GetOutputSlot(0).Connect(padLayer->GetInputSlot(0));
1830 padLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1831
1832 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
1833 padLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
1834
1835 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
1836 CHECK(deserializedNetwork);
1837
1838 LayerVerifierBaseWithDescriptor<armnn::PadDescriptor> verifier(layerName,
1839 {inputTensorInfo},
1840 {outputTensorInfo},
1841 desc);
1842 deserializedNetwork->ExecuteStrategy(verifier);
1843}
1844
Sadik Armagan1625efc2021-06-10 18:24:34 +01001845TEST_CASE("EnsurePadBackwardCompatibility")
Jim Flynn965c7c62019-06-24 14:32:41 +01001846{
1847 // The PadDescriptor is being extended with a float PadValue (so a value other than 0
1848 // can be used to pad the tensor.
1849 //
1850 // This test contains a binary representation of a simple input->pad->output network
1851 // prior to this change to test that the descriptor has been updated in a backward
1852 // compatible way with respect to Deserialization of older binary dumps
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001853 const std::vector<uint8_t> padModel =
Jim Flynn965c7c62019-06-24 14:32:41 +01001854 {
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001855 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x0A, 0x00,
1856 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
1857 0x54, 0x01, 0x00, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
1858 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xD0, 0xFE, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x0B,
1859 0x04, 0x00, 0x00, 0x00, 0x96, 0xFF, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x9E, 0xFF, 0xFF, 0xFF, 0x04, 0x00,
1860 0x00, 0x00, 0x72, 0xFF, 0xFF, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
1861 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
1862 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00,
1863 0x00, 0x00, 0x00, 0x00, 0x24, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x16, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00,
1864 0x0E, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00,
1865 0x00, 0x00, 0x06, 0x00, 0x08, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00,
1866 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1867 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
1868 0x0E, 0x00, 0x18, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x14, 0x00, 0x0E, 0x00, 0x00, 0x00,
1869 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00,
1870 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x70, 0x61, 0x64, 0x00, 0x01, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00,
1871 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00,
1872 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x52, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00,
1873 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00,
1874 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00,
1875 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x07, 0x00, 0x08, 0x00, 0x08, 0x00,
1876 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xF6, 0xFF, 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x00,
1877 0x00, 0x00, 0x06, 0x00, 0x0A, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00,
1878 0x0E, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x0E, 0x00, 0x00, 0x00,
1879 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
1880 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00,
1881 0x08, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
1882 0x0A, 0x00, 0x10, 0x00, 0x08, 0x00, 0x07, 0x00, 0x0C, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
1883 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00,
1884 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00
1885 };
1886
1887 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(std::string(padModel.begin(), padModel.end()));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001888 CHECK(deserializedNetwork);
Jim Flynn965c7c62019-06-24 14:32:41 +01001889
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001890 const armnn::TensorInfo inputInfo = armnn::TensorInfo({ 1, 2, 3, 4 }, armnn::DataType::Float32);
1891 const armnn::TensorInfo outputInfo = armnn::TensorInfo({ 1, 3, 5, 7 }, armnn::DataType::Float32);
Jim Flynn965c7c62019-06-24 14:32:41 +01001892
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001893 armnn::PadDescriptor descriptor({{ 0, 0 }, { 1, 0 }, { 1, 1 }, { 1, 2 }});
Jim Flynn965c7c62019-06-24 14:32:41 +01001894
Finn Williamsb454c5c2021-02-09 15:56:23 +00001895 LayerVerifierBaseWithDescriptor<armnn::PadDescriptor> verifier("pad", { inputInfo }, { outputInfo }, descriptor);
1896 deserializedNetwork->ExecuteStrategy(verifier);
Jim Flynn965c7c62019-06-24 14:32:41 +01001897}
1898
Sadik Armagan1625efc2021-06-10 18:24:34 +01001899TEST_CASE("SerializePermute")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001900{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001901 const std::string layerName("permute");
1902 const armnn::TensorInfo inputTensorInfo({4, 3, 2, 1}, armnn::DataType::Float32);
1903 const armnn::TensorInfo outputTensorInfo({1, 2, 3, 4}, armnn::DataType::Float32);
1904
1905 armnn::PermuteDescriptor descriptor(armnn::PermutationVector({3, 2, 1, 0}));
1906
1907 armnn::INetworkPtr network = armnn::INetwork::Create();
1908 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1909 armnn::IConnectableLayer* const permuteLayer = network->AddPermuteLayer(descriptor, layerName.c_str());
1910 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1911
1912 inputLayer->GetOutputSlot(0).Connect(permuteLayer->GetInputSlot(0));
1913 permuteLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1914
1915 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
1916 permuteLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
1917
1918 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001919 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001920
Finn Williamsb454c5c2021-02-09 15:56:23 +00001921 LayerVerifierBaseWithDescriptor<armnn::PermuteDescriptor> verifier(
1922 layerName, {inputTensorInfo}, {outputTensorInfo}, descriptor);
1923 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001924}
1925
Sadik Armagan1625efc2021-06-10 18:24:34 +01001926TEST_CASE("SerializePooling2d")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001927{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001928 const std::string layerName("pooling2d");
1929 const armnn::TensorInfo inputInfo({1, 2, 2, 1}, armnn::DataType::Float32);
1930 const armnn::TensorInfo outputInfo({1, 1, 1, 1}, armnn::DataType::Float32);
1931
1932 armnn::Pooling2dDescriptor desc;
1933 desc.m_DataLayout = armnn::DataLayout::NHWC;
1934 desc.m_PadTop = 0;
1935 desc.m_PadBottom = 0;
1936 desc.m_PadLeft = 0;
1937 desc.m_PadRight = 0;
1938 desc.m_PoolType = armnn::PoolingAlgorithm::Average;
1939 desc.m_OutputShapeRounding = armnn::OutputShapeRounding::Floor;
1940 desc.m_PaddingMethod = armnn::PaddingMethod::Exclude;
1941 desc.m_PoolHeight = 2;
1942 desc.m_PoolWidth = 2;
1943 desc.m_StrideX = 2;
1944 desc.m_StrideY = 2;
1945
1946 armnn::INetworkPtr network = armnn::INetwork::Create();
1947 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1948 armnn::IConnectableLayer* const pooling2dLayer = network->AddPooling2dLayer(desc, layerName.c_str());
1949 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1950
1951 inputLayer->GetOutputSlot(0).Connect(pooling2dLayer->GetInputSlot(0));
1952 pooling2dLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1953
1954 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
1955 pooling2dLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1956
1957 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001958 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001959
Finn Williamsb454c5c2021-02-09 15:56:23 +00001960 LayerVerifierBaseWithDescriptor<armnn::Pooling2dDescriptor> verifier(
1961 layerName, {inputInfo}, {outputInfo}, desc);
1962 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001963}
1964
Tamas Nyirid998a1c2021-11-05 14:55:33 +00001965TEST_CASE("SerializePooling3d")
1966{
1967 const std::string layerName("pooling3d");
1968 const armnn::TensorInfo inputInfo({1, 1, 2, 2, 2}, armnn::DataType::Float32);
1969 const armnn::TensorInfo outputInfo({1, 1, 1, 1, 1}, armnn::DataType::Float32);
1970
1971 armnn::Pooling3dDescriptor desc;
1972 desc.m_DataLayout = armnn::DataLayout::NDHWC;
1973 desc.m_PadFront = 0;
1974 desc.m_PadBack = 0;
1975 desc.m_PadTop = 0;
1976 desc.m_PadBottom = 0;
1977 desc.m_PadLeft = 0;
1978 desc.m_PadRight = 0;
1979 desc.m_PoolType = armnn::PoolingAlgorithm::Average;
1980 desc.m_OutputShapeRounding = armnn::OutputShapeRounding::Floor;
1981 desc.m_PaddingMethod = armnn::PaddingMethod::Exclude;
1982 desc.m_PoolHeight = 2;
1983 desc.m_PoolWidth = 2;
1984 desc.m_PoolDepth = 2;
1985 desc.m_StrideX = 2;
1986 desc.m_StrideY = 2;
1987 desc.m_StrideZ = 2;
1988
1989 armnn::INetworkPtr network = armnn::INetwork::Create();
1990 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1991 armnn::IConnectableLayer* const pooling3dLayer = network->AddPooling3dLayer(desc, layerName.c_str());
1992 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1993
1994 inputLayer->GetOutputSlot(0).Connect(pooling3dLayer->GetInputSlot(0));
1995 pooling3dLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1996
1997 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
1998 pooling3dLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1999
2000 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
2001 CHECK(deserializedNetwork);
2002
2003 LayerVerifierBaseWithDescriptor<armnn::Pooling3dDescriptor> verifier(
2004 layerName, {inputInfo}, {outputInfo}, desc);
2005 deserializedNetwork->ExecuteStrategy(verifier);
2006}
2007
Sadik Armagan1625efc2021-06-10 18:24:34 +01002008TEST_CASE("SerializeQuantize")
Derek Lamberti87acb272019-03-27 16:51:31 +00002009{
Derek Lamberti87acb272019-03-27 16:51:31 +00002010 const std::string layerName("quantize");
2011 const armnn::TensorInfo info({ 1, 2, 2, 3 }, armnn::DataType::Float32);
2012
2013 armnn::INetworkPtr network = armnn::INetwork::Create();
2014 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2015 armnn::IConnectableLayer* const quantizeLayer = network->AddQuantizeLayer(layerName.c_str());
2016 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2017
2018 inputLayer->GetOutputSlot(0).Connect(quantizeLayer->GetInputSlot(0));
2019 quantizeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2020
2021 inputLayer->GetOutputSlot(0).SetTensorInfo(info);
2022 quantizeLayer->GetOutputSlot(0).SetTensorInfo(info);
2023
2024 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002025 CHECK(deserializedNetwork);
Derek Lamberti87acb272019-03-27 16:51:31 +00002026
Finn Williamsb454c5c2021-02-09 15:56:23 +00002027 LayerVerifierBase verifier(layerName, {info}, {info});
2028 deserializedNetwork->ExecuteStrategy(verifier);
Derek Lamberti87acb272019-03-27 16:51:31 +00002029}
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01002030
Sadik Armagan1625efc2021-06-10 18:24:34 +01002031TEST_CASE("SerializeRank")
Finn Williams2605b232020-06-10 15:53:46 +01002032{
Finn Williams2605b232020-06-10 15:53:46 +01002033 const std::string layerName("rank");
2034 const armnn::TensorInfo inputInfo({1, 9}, armnn::DataType::Float32);
2035 const armnn::TensorInfo outputInfo({1}, armnn::DataType::Signed32);
2036
2037 armnn::INetworkPtr network = armnn::INetwork::Create();
2038 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2039 armnn::IConnectableLayer* const rankLayer = network->AddRankLayer(layerName.c_str());
2040 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2041
2042 inputLayer->GetOutputSlot(0).Connect(rankLayer->GetInputSlot(0));
2043 rankLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2044
2045 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2046 rankLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2047
2048 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002049 CHECK(deserializedNetwork);
Finn Williams2605b232020-06-10 15:53:46 +01002050
Finn Williamsb454c5c2021-02-09 15:56:23 +00002051 LayerVerifierBase verifier(layerName, {inputInfo}, {outputInfo});
2052 deserializedNetwork->ExecuteStrategy(verifier);
Finn Williams2605b232020-06-10 15:53:46 +01002053}
2054
Sadik Armagan1625efc2021-06-10 18:24:34 +01002055TEST_CASE("SerializeReduceSum")
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +00002056{
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +00002057 const std::string layerName("Reduce_Sum");
2058 const armnn::TensorInfo inputInfo({1, 1, 3, 2}, armnn::DataType::Float32);
2059 const armnn::TensorInfo outputInfo({1, 1, 1, 2}, armnn::DataType::Float32);
2060
2061 armnn::ReduceDescriptor descriptor;
2062 descriptor.m_vAxis = { 2 };
2063 descriptor.m_ReduceOperation = armnn::ReduceOperation::Sum;
2064
2065 armnn::INetworkPtr network = armnn::INetwork::Create();
2066 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2067 armnn::IConnectableLayer* const reduceSumLayer = network->AddReduceLayer(descriptor, layerName.c_str());
2068 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2069
2070 inputLayer->GetOutputSlot(0).Connect(reduceSumLayer->GetInputSlot(0));
2071 reduceSumLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2072
2073 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2074 reduceSumLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2075
2076 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002077 CHECK(deserializedNetwork);
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +00002078
Finn Williamsb454c5c2021-02-09 15:56:23 +00002079 LayerVerifierBaseWithDescriptor<armnn::ReduceDescriptor> verifier(layerName, {inputInfo}, {outputInfo}, descriptor);
2080 deserializedNetwork->ExecuteStrategy(verifier);
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +00002081}
2082
Sadik Armagan1625efc2021-06-10 18:24:34 +01002083TEST_CASE("SerializeReshape")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002084{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002085 const std::string layerName("reshape");
2086 const armnn::TensorInfo inputInfo({1, 9}, armnn::DataType::Float32);
2087 const armnn::TensorInfo outputInfo({3, 3}, armnn::DataType::Float32);
2088
2089 armnn::ReshapeDescriptor descriptor({3, 3});
2090
2091 armnn::INetworkPtr network = armnn::INetwork::Create();
2092 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2093 armnn::IConnectableLayer* const reshapeLayer = network->AddReshapeLayer(descriptor, layerName.c_str());
2094 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2095
2096 inputLayer->GetOutputSlot(0).Connect(reshapeLayer->GetInputSlot(0));
2097 reshapeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2098
2099 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2100 reshapeLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2101
2102 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002103 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002104
Finn Williamsb454c5c2021-02-09 15:56:23 +00002105 LayerVerifierBaseWithDescriptor<armnn::ReshapeDescriptor> verifier(
2106 layerName, {inputInfo}, {outputInfo}, descriptor);
2107 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002108}
2109
Sadik Armagan1625efc2021-06-10 18:24:34 +01002110TEST_CASE("SerializeResize")
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01002111{
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01002112 const std::string layerName("resize");
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002113 const armnn::TensorInfo inputInfo = armnn::TensorInfo({1, 3, 5, 5}, armnn::DataType::Float32);
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01002114 const armnn::TensorInfo outputInfo = armnn::TensorInfo({1, 3, 2, 4}, armnn::DataType::Float32);
2115
2116 armnn::ResizeDescriptor desc;
Aron Virginas-Tar169d2f12019-07-01 19:01:44 +01002117 desc.m_TargetWidth = 4;
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01002118 desc.m_TargetHeight = 2;
Aron Virginas-Tar169d2f12019-07-01 19:01:44 +01002119 desc.m_Method = armnn::ResizeMethod::NearestNeighbor;
David Monahan4a0c9b92020-05-30 09:48:39 +01002120 desc.m_AlignCorners = true;
2121 desc.m_HalfPixelCenters = true;
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01002122
2123 armnn::INetworkPtr network = armnn::INetwork::Create();
2124 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2125 armnn::IConnectableLayer* const resizeLayer = network->AddResizeLayer(desc, layerName.c_str());
2126 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2127
2128 inputLayer->GetOutputSlot(0).Connect(resizeLayer->GetInputSlot(0));
2129 resizeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2130
2131 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2132 resizeLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2133
2134 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002135 CHECK(deserializedNetwork);
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01002136
Finn Williamsb454c5c2021-02-09 15:56:23 +00002137 LayerVerifierBaseWithDescriptor<armnn::ResizeDescriptor> verifier(layerName, {inputInfo}, {outputInfo}, desc);
2138 deserializedNetwork->ExecuteStrategy(verifier);
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01002139}
2140
Jan Eilers1b2654f2021-09-24 15:45:46 +01002141class ResizeBilinearLayerVerifier : public LayerVerifierBaseWithDescriptor<armnn::ResizeDescriptor>
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002142{
2143public:
2144 ResizeBilinearLayerVerifier(const std::string& layerName,
2145 const std::vector<armnn::TensorInfo>& inputInfos,
2146 const std::vector<armnn::TensorInfo>& outputInfos,
Jan Eilers1b2654f2021-09-24 15:45:46 +01002147 const armnn::ResizeDescriptor& descriptor)
2148 : LayerVerifierBaseWithDescriptor<armnn::ResizeDescriptor>(
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002149 layerName, inputInfos, outputInfos, descriptor) {}
2150
Finn Williamsb454c5c2021-02-09 15:56:23 +00002151 void ExecuteStrategy(const armnn::IConnectableLayer* layer,
2152 const armnn::BaseDescriptor& descriptor,
2153 const std::vector<armnn::ConstTensor>& constants,
2154 const char* name,
2155 const armnn::LayerBindingId id = 0) override
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002156 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00002157 armnn::IgnoreUnused(descriptor, constants, id);
2158 switch (layer->GetType())
2159 {
2160 case armnn::LayerType::Input: break;
2161 case armnn::LayerType::Output: break;
2162 case armnn::LayerType::Resize:
2163 {
2164 VerifyNameAndConnections(layer, name);
2165 const armnn::ResizeDescriptor& layerDescriptor =
2166 static_cast<const armnn::ResizeDescriptor&>(descriptor);
Sadik Armagan1625efc2021-06-10 18:24:34 +01002167 CHECK(layerDescriptor.m_Method == armnn::ResizeMethod::Bilinear);
2168 CHECK(layerDescriptor.m_TargetWidth == m_Descriptor.m_TargetWidth);
2169 CHECK(layerDescriptor.m_TargetHeight == m_Descriptor.m_TargetHeight);
2170 CHECK(layerDescriptor.m_DataLayout == m_Descriptor.m_DataLayout);
2171 CHECK(layerDescriptor.m_AlignCorners == m_Descriptor.m_AlignCorners);
2172 CHECK(layerDescriptor.m_HalfPixelCenters == m_Descriptor.m_HalfPixelCenters);
Finn Williamsb454c5c2021-02-09 15:56:23 +00002173 break;
2174 }
2175 default:
2176 {
2177 throw armnn::Exception("Unexpected layer type in test model. ResizeBiliniar "
2178 "should have translated to Resize");
2179 }
2180 }
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002181 }
2182};
2183
Sadik Armagan1625efc2021-06-10 18:24:34 +01002184TEST_CASE("SerializeResizeBilinear")
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002185{
2186 const std::string layerName("resizeBilinear");
2187 const armnn::TensorInfo inputInfo = armnn::TensorInfo({1, 3, 5, 5}, armnn::DataType::Float32);
2188 const armnn::TensorInfo outputInfo = armnn::TensorInfo({1, 3, 2, 4}, armnn::DataType::Float32);
2189
Jan Eilers1b2654f2021-09-24 15:45:46 +01002190 armnn::ResizeDescriptor desc;
2191 desc.m_Method = armnn::ResizeMethod::Bilinear;
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002192 desc.m_TargetWidth = 4u;
2193 desc.m_TargetHeight = 2u;
David Monahan4a0c9b92020-05-30 09:48:39 +01002194 desc.m_AlignCorners = true;
2195 desc.m_HalfPixelCenters = true;
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002196
2197 armnn::INetworkPtr network = armnn::INetwork::Create();
2198 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
Jan Eilers1b2654f2021-09-24 15:45:46 +01002199 armnn::IConnectableLayer* const resizeLayer = network->AddResizeLayer(desc, layerName.c_str());
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002200 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2201
2202 inputLayer->GetOutputSlot(0).Connect(resizeLayer->GetInputSlot(0));
2203 resizeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2204
2205 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2206 resizeLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2207
2208 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002209 CHECK(deserializedNetwork);
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002210
2211 ResizeBilinearLayerVerifier verifier(layerName, {inputInfo}, {outputInfo}, desc);
Finn Williamsb454c5c2021-02-09 15:56:23 +00002212 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002213}
2214
Sadik Armagan1625efc2021-06-10 18:24:34 +01002215TEST_CASE("EnsureResizeBilinearBackwardCompatibility")
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002216{
2217 // The hex data below is a flat buffer containing a simple network with an input,
Jan Eilers1b2654f2021-09-24 15:45:46 +01002218 // a ResizeBilinearLayer (now deprecated and removed) and an output
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002219 //
2220 // This test verifies that we can still deserialize this old-style model by replacing
2221 // the ResizeBilinearLayer with an equivalent ResizeLayer
2222 const std::vector<uint8_t> resizeBilinearModel =
2223 {
2224 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x0A, 0x00,
2225 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
2226 0x50, 0x01, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
2227 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xD4, 0xFE, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x0B,
2228 0x04, 0x00, 0x00, 0x00, 0xC2, 0xFE, 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x08, 0x00,
2229 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x8A, 0xFF, 0xFF, 0xFF, 0x02, 0x00, 0x00, 0x00,
2230 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00,
2231 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2232 0x38, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
2233 0x00, 0x1A, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00,
2234 0x34, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x12, 0x00, 0x08, 0x00, 0x0C, 0x00,
2235 0x07, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
2236 0x00, 0x00, 0x0E, 0x00, 0x18, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x14, 0x00, 0x0E, 0x00,
2237 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00,
2238 0x20, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x72, 0x65, 0x73, 0x69, 0x7A, 0x65, 0x42, 0x69, 0x6C, 0x69,
2239 0x6E, 0x65, 0x61, 0x72, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
2240 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00,
2241 0x00, 0x00, 0x52, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2242 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00,
2243 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2244 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x07, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
2245 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xF6, 0xFF, 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00,
2246 0x0A, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x14, 0x00,
2247 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
2248 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2249 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0A, 0x00,
2250 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x10, 0x00,
2251 0x08, 0x00, 0x07, 0x00, 0x0C, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00,
2252 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00,
2253 0x00, 0x00, 0x05, 0x00, 0x00, 0x00
2254 };
2255
2256 armnn::INetworkPtr deserializedNetwork =
2257 DeserializeNetwork(std::string(resizeBilinearModel.begin(), resizeBilinearModel.end()));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002258 CHECK(deserializedNetwork);
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002259
2260 const armnn::TensorInfo inputInfo = armnn::TensorInfo({1, 3, 5, 5}, armnn::DataType::Float32);
2261 const armnn::TensorInfo outputInfo = armnn::TensorInfo({1, 3, 2, 4}, armnn::DataType::Float32);
2262
Jan Eilers1b2654f2021-09-24 15:45:46 +01002263 armnn::ResizeDescriptor descriptor;
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002264 descriptor.m_TargetWidth = 4u;
2265 descriptor.m_TargetHeight = 2u;
2266
2267 ResizeBilinearLayerVerifier verifier("resizeBilinear", { inputInfo }, { outputInfo }, descriptor);
Finn Williamsb454c5c2021-02-09 15:56:23 +00002268 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002269}
2270
Keith Davis3ae3f972021-05-21 16:33:48 +01002271TEST_CASE("SerializeShape")
2272{
2273 const std::string layerName("shape");
2274 const armnn::TensorInfo inputInfo({1, 3, 3, 1}, armnn::DataType::Signed32);
2275 const armnn::TensorInfo outputInfo({ 4 }, armnn::DataType::Signed32);
2276
2277 armnn::INetworkPtr network = armnn::INetwork::Create();
2278 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2279 armnn::IConnectableLayer* const shapeLayer = network->AddShapeLayer(layerName.c_str());
2280 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2281
2282 inputLayer->GetOutputSlot(0).Connect(shapeLayer->GetInputSlot(0));
2283 shapeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2284
2285 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2286 shapeLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2287
2288 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
2289 CHECK(deserializedNetwork);
2290
2291 LayerVerifierBase verifier(layerName, {inputInfo}, {outputInfo});
2292
2293 deserializedNetwork->ExecuteStrategy(verifier);
2294}
2295
Sadik Armagan1625efc2021-06-10 18:24:34 +01002296TEST_CASE("SerializeSlice")
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +01002297{
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +01002298 const std::string layerName{"slice"};
2299
2300 const armnn::TensorInfo inputInfo = armnn::TensorInfo({3, 2, 3, 1}, armnn::DataType::Float32);
2301 const armnn::TensorInfo outputInfo = armnn::TensorInfo({2, 2, 2, 1}, armnn::DataType::Float32);
2302
2303 armnn::SliceDescriptor descriptor({ 0, 0, 1, 0}, {2, 2, 2, 1});
2304
2305 armnn::INetworkPtr network = armnn::INetwork::Create();
2306
2307 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2308 armnn::IConnectableLayer* const sliceLayer = network->AddSliceLayer(descriptor, layerName.c_str());
2309 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2310
2311 inputLayer->GetOutputSlot(0).Connect(sliceLayer->GetInputSlot(0));
2312 sliceLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2313
2314 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2315 sliceLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2316
2317 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002318 CHECK(deserializedNetwork);
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +01002319
Finn Williamsb454c5c2021-02-09 15:56:23 +00002320 LayerVerifierBaseWithDescriptor<armnn::SliceDescriptor> verifier(layerName, {inputInfo}, {outputInfo}, descriptor);
2321 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +01002322}
2323
Sadik Armagan1625efc2021-06-10 18:24:34 +01002324TEST_CASE("SerializeSoftmax")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002325{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002326 const std::string layerName("softmax");
2327 const armnn::TensorInfo info({1, 10}, armnn::DataType::Float32);
2328
2329 armnn::SoftmaxDescriptor descriptor;
2330 descriptor.m_Beta = 1.0f;
2331
2332 armnn::INetworkPtr network = armnn::INetwork::Create();
2333 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2334 armnn::IConnectableLayer* const softmaxLayer = network->AddSoftmaxLayer(descriptor, layerName.c_str());
2335 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2336
2337 inputLayer->GetOutputSlot(0).Connect(softmaxLayer->GetInputSlot(0));
2338 softmaxLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2339
2340 inputLayer->GetOutputSlot(0).SetTensorInfo(info);
2341 softmaxLayer->GetOutputSlot(0).SetTensorInfo(info);
2342
2343 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002344 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002345
Finn Williamsb454c5c2021-02-09 15:56:23 +00002346 LayerVerifierBaseWithDescriptor<armnn::SoftmaxDescriptor> verifier(layerName, {info}, {info}, descriptor);
2347 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002348}
2349
Sadik Armagan1625efc2021-06-10 18:24:34 +01002350TEST_CASE("SerializeSpaceToBatchNd")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002351{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002352 const std::string layerName("spaceToBatchNd");
2353 const armnn::TensorInfo inputInfo({2, 1, 2, 4}, armnn::DataType::Float32);
2354 const armnn::TensorInfo outputInfo({8, 1, 1, 3}, armnn::DataType::Float32);
2355
2356 armnn::SpaceToBatchNdDescriptor desc;
2357 desc.m_DataLayout = armnn::DataLayout::NCHW;
2358 desc.m_BlockShape = {2, 2};
2359 desc.m_PadList = {{0, 0}, {2, 0}};
2360
2361 armnn::INetworkPtr network = armnn::INetwork::Create();
2362 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2363 armnn::IConnectableLayer* const spaceToBatchNdLayer = network->AddSpaceToBatchNdLayer(desc, layerName.c_str());
2364 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2365
2366 inputLayer->GetOutputSlot(0).Connect(spaceToBatchNdLayer->GetInputSlot(0));
2367 spaceToBatchNdLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2368
2369 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2370 spaceToBatchNdLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2371
2372 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002373 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002374
Finn Williamsb454c5c2021-02-09 15:56:23 +00002375 LayerVerifierBaseWithDescriptor<armnn::SpaceToBatchNdDescriptor> verifier(
2376 layerName, {inputInfo}, {outputInfo}, desc);
2377 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002378}
2379
Sadik Armagan1625efc2021-06-10 18:24:34 +01002380TEST_CASE("SerializeSpaceToDepth")
Aron Virginas-Taraa067142019-06-11 16:01:44 +01002381{
Aron Virginas-Taraa067142019-06-11 16:01:44 +01002382 const std::string layerName("spaceToDepth");
2383
2384 const armnn::TensorInfo inputInfo ({ 1, 16, 8, 3 }, armnn::DataType::Float32);
2385 const armnn::TensorInfo outputInfo({ 1, 8, 4, 12 }, armnn::DataType::Float32);
2386
2387 armnn::SpaceToDepthDescriptor desc;
2388 desc.m_BlockSize = 2;
2389 desc.m_DataLayout = armnn::DataLayout::NHWC;
2390
2391 armnn::INetworkPtr network = armnn::INetwork::Create();
2392 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2393 armnn::IConnectableLayer* const spaceToDepthLayer = network->AddSpaceToDepthLayer(desc, layerName.c_str());
2394 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2395
2396 inputLayer->GetOutputSlot(0).Connect(spaceToDepthLayer->GetInputSlot(0));
2397 spaceToDepthLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2398
2399 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2400 spaceToDepthLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2401
2402 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002403 CHECK(deserializedNetwork);
Aron Virginas-Taraa067142019-06-11 16:01:44 +01002404
Finn Williamsb454c5c2021-02-09 15:56:23 +00002405 LayerVerifierBaseWithDescriptor<armnn::SpaceToDepthDescriptor> verifier(
2406 layerName, {inputInfo}, {outputInfo}, desc);
2407 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Taraa067142019-06-11 16:01:44 +01002408}
2409
Sadik Armagan1625efc2021-06-10 18:24:34 +01002410TEST_CASE("SerializeSplitter")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002411{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002412 const unsigned int numViews = 3;
2413 const unsigned int numDimensions = 4;
2414 const unsigned int inputShape[] = {1, 18, 4, 4};
2415 const unsigned int outputShape[] = {1, 6, 4, 4};
2416
2417 // This is modelled on how the caffe parser sets up a splitter layer to partition an input along dimension one.
2418 unsigned int splitterDimSizes[4] = {static_cast<unsigned int>(inputShape[0]),
2419 static_cast<unsigned int>(inputShape[1]),
2420 static_cast<unsigned int>(inputShape[2]),
2421 static_cast<unsigned int>(inputShape[3])};
2422 splitterDimSizes[1] /= numViews;
2423 armnn::ViewsDescriptor desc(numViews, numDimensions);
2424
2425 for (unsigned int g = 0; g < numViews; ++g)
2426 {
2427 desc.SetViewOriginCoord(g, 1, splitterDimSizes[1] * g);
2428
2429 for (unsigned int dimIdx=0; dimIdx < 4; dimIdx++)
2430 {
2431 desc.SetViewSize(g, dimIdx, splitterDimSizes[dimIdx]);
2432 }
2433 }
2434
2435 const std::string layerName("splitter");
2436 const armnn::TensorInfo inputInfo(numDimensions, inputShape, armnn::DataType::Float32);
2437 const armnn::TensorInfo outputInfo(numDimensions, outputShape, armnn::DataType::Float32);
2438
2439 armnn::INetworkPtr network = armnn::INetwork::Create();
2440 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2441 armnn::IConnectableLayer* const splitterLayer = network->AddSplitterLayer(desc, layerName.c_str());
2442 armnn::IConnectableLayer* const outputLayer0 = network->AddOutputLayer(0);
2443 armnn::IConnectableLayer* const outputLayer1 = network->AddOutputLayer(1);
2444 armnn::IConnectableLayer* const outputLayer2 = network->AddOutputLayer(2);
2445
2446 inputLayer->GetOutputSlot(0).Connect(splitterLayer->GetInputSlot(0));
2447 splitterLayer->GetOutputSlot(0).Connect(outputLayer0->GetInputSlot(0));
2448 splitterLayer->GetOutputSlot(1).Connect(outputLayer1->GetInputSlot(0));
2449 splitterLayer->GetOutputSlot(2).Connect(outputLayer2->GetInputSlot(0));
2450
2451 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2452 splitterLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2453 splitterLayer->GetOutputSlot(1).SetTensorInfo(outputInfo);
2454 splitterLayer->GetOutputSlot(2).SetTensorInfo(outputInfo);
2455
2456 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002457 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002458
Finn Williamsb454c5c2021-02-09 15:56:23 +00002459 LayerVerifierBaseWithDescriptor<armnn::ViewsDescriptor> verifier(
2460 layerName, {inputInfo}, {outputInfo, outputInfo, outputInfo}, desc);
2461 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002462}
2463
Sadik Armagan1625efc2021-06-10 18:24:34 +01002464TEST_CASE("SerializeStack")
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01002465{
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01002466 const std::string layerName("stack");
2467
2468 armnn::TensorInfo inputTensorInfo ({4, 3, 5}, armnn::DataType::Float32);
2469 armnn::TensorInfo outputTensorInfo({4, 3, 2, 5}, armnn::DataType::Float32);
2470
2471 armnn::StackDescriptor descriptor(2, 2, {4, 3, 5});
2472
2473 armnn::INetworkPtr network = armnn::INetwork::Create();
2474 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(0);
2475 armnn::IConnectableLayer* const inputLayer2 = network->AddInputLayer(1);
2476 armnn::IConnectableLayer* const stackLayer = network->AddStackLayer(descriptor, layerName.c_str());
2477 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2478
2479 inputLayer1->GetOutputSlot(0).Connect(stackLayer->GetInputSlot(0));
2480 inputLayer2->GetOutputSlot(0).Connect(stackLayer->GetInputSlot(1));
2481 stackLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2482
2483 inputLayer1->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
2484 inputLayer2->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
2485 stackLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
2486
2487 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002488 CHECK(deserializedNetwork);
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01002489
Finn Williamsb454c5c2021-02-09 15:56:23 +00002490 LayerVerifierBaseWithDescriptor<armnn::StackDescriptor> verifier(
2491 layerName, {inputTensorInfo, inputTensorInfo}, {outputTensorInfo}, descriptor);
2492 deserializedNetwork->ExecuteStrategy(verifier);
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01002493}
2494
Sadik Armagan1625efc2021-06-10 18:24:34 +01002495TEST_CASE("SerializeStandIn")
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01002496{
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01002497 const std::string layerName("standIn");
2498
2499 armnn::TensorInfo tensorInfo({ 1u }, armnn::DataType::Float32);
2500 armnn::StandInDescriptor descriptor(2u, 2u);
2501
2502 armnn::INetworkPtr network = armnn::INetwork::Create();
2503 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
2504 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
2505 armnn::IConnectableLayer* const standInLayer = network->AddStandInLayer(descriptor, layerName.c_str());
2506 armnn::IConnectableLayer* const outputLayer0 = network->AddOutputLayer(0);
2507 armnn::IConnectableLayer* const outputLayer1 = network->AddOutputLayer(1);
2508
2509 inputLayer0->GetOutputSlot(0).Connect(standInLayer->GetInputSlot(0));
2510 inputLayer0->GetOutputSlot(0).SetTensorInfo(tensorInfo);
2511
2512 inputLayer1->GetOutputSlot(0).Connect(standInLayer->GetInputSlot(1));
2513 inputLayer1->GetOutputSlot(0).SetTensorInfo(tensorInfo);
2514
2515 standInLayer->GetOutputSlot(0).Connect(outputLayer0->GetInputSlot(0));
2516 standInLayer->GetOutputSlot(0).SetTensorInfo(tensorInfo);
2517
2518 standInLayer->GetOutputSlot(1).Connect(outputLayer1->GetInputSlot(0));
2519 standInLayer->GetOutputSlot(1).SetTensorInfo(tensorInfo);
2520
2521 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002522 CHECK(deserializedNetwork);
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01002523
Finn Williamsb454c5c2021-02-09 15:56:23 +00002524 LayerVerifierBaseWithDescriptor<armnn::StandInDescriptor> verifier(
2525 layerName, { tensorInfo, tensorInfo }, { tensorInfo, tensorInfo }, descriptor);
2526 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01002527}
2528
Sadik Armagan1625efc2021-06-10 18:24:34 +01002529TEST_CASE("SerializeStridedSlice")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002530{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002531 const std::string layerName("stridedSlice");
2532 const armnn::TensorInfo inputInfo = armnn::TensorInfo({3, 2, 3, 1}, armnn::DataType::Float32);
2533 const armnn::TensorInfo outputInfo = armnn::TensorInfo({3, 1}, armnn::DataType::Float32);
2534
2535 armnn::StridedSliceDescriptor desc({0, 0, 1, 0}, {1, 1, 1, 1}, {1, 1, 1, 1});
2536 desc.m_EndMask = (1 << 4) - 1;
2537 desc.m_ShrinkAxisMask = (1 << 1) | (1 << 2);
2538 desc.m_DataLayout = armnn::DataLayout::NCHW;
2539
2540 armnn::INetworkPtr network = armnn::INetwork::Create();
2541 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2542 armnn::IConnectableLayer* const stridedSliceLayer = network->AddStridedSliceLayer(desc, layerName.c_str());
2543 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2544
2545 inputLayer->GetOutputSlot(0).Connect(stridedSliceLayer->GetInputSlot(0));
2546 stridedSliceLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2547
2548 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2549 stridedSliceLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2550
2551 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002552 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002553
Finn Williamsb454c5c2021-02-09 15:56:23 +00002554 LayerVerifierBaseWithDescriptor<armnn::StridedSliceDescriptor> verifier(
2555 layerName, {inputInfo}, {outputInfo}, desc);
2556 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002557}
2558
Sadik Armagan1625efc2021-06-10 18:24:34 +01002559TEST_CASE("SerializeSubtraction")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002560{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002561 const std::string layerName("subtraction");
2562 const armnn::TensorInfo info({ 1, 4 }, armnn::DataType::Float32);
2563
2564 armnn::INetworkPtr network = armnn::INetwork::Create();
2565 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
2566 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
2567 armnn::IConnectableLayer* const subtractionLayer = network->AddSubtractionLayer(layerName.c_str());
2568 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2569
2570 inputLayer0->GetOutputSlot(0).Connect(subtractionLayer->GetInputSlot(0));
2571 inputLayer1->GetOutputSlot(0).Connect(subtractionLayer->GetInputSlot(1));
2572 subtractionLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2573
2574 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
2575 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
2576 subtractionLayer->GetOutputSlot(0).SetTensorInfo(info);
2577
2578 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002579 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002580
Finn Williamsb454c5c2021-02-09 15:56:23 +00002581 LayerVerifierBase verifier(layerName, {info, info}, {info});
2582 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +00002583}
2584
Sadik Armagan1625efc2021-06-10 18:24:34 +01002585TEST_CASE("SerializeSwitch")
Sadik Armaganeff363d2019-04-05 15:25:46 +01002586{
2587 class SwitchLayerVerifier : public LayerVerifierBase
2588 {
2589 public:
2590 SwitchLayerVerifier(const std::string& layerName,
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01002591 const std::vector<armnn::TensorInfo>& inputInfos,
2592 const std::vector<armnn::TensorInfo>& outputInfos)
Finn Williamsb454c5c2021-02-09 15:56:23 +00002593 : LayerVerifierBase(layerName, inputInfos, outputInfos) {}
Sadik Armaganeff363d2019-04-05 15:25:46 +01002594
Finn Williamsb454c5c2021-02-09 15:56:23 +00002595 void ExecuteStrategy(const armnn::IConnectableLayer* layer,
2596 const armnn::BaseDescriptor& descriptor,
2597 const std::vector<armnn::ConstTensor>& constants,
2598 const char* name,
2599 const armnn::LayerBindingId id = 0) override
Sadik Armaganeff363d2019-04-05 15:25:46 +01002600 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00002601 armnn::IgnoreUnused(descriptor, constants, id);
2602 switch (layer->GetType())
2603 {
2604 case armnn::LayerType::Input: break;
2605 case armnn::LayerType::Output: break;
2606 case armnn::LayerType::Constant: break;
2607 case armnn::LayerType::Switch:
2608 {
2609 VerifyNameAndConnections(layer, name);
2610 break;
2611 }
2612 default:
2613 {
2614 throw armnn::Exception("Unexpected layer type in Switch test model");
2615 }
2616 }
Sadik Armaganeff363d2019-04-05 15:25:46 +01002617 }
Sadik Armaganeff363d2019-04-05 15:25:46 +01002618 };
2619
2620 const std::string layerName("switch");
Cathal Corbett5b8093c2021-10-22 11:12:07 +01002621 const armnn::TensorInfo info({ 1, 4 }, armnn::DataType::Float32, 0.0f, 0, true);
Sadik Armaganeff363d2019-04-05 15:25:46 +01002622
2623 std::vector<float> constantData = GenerateRandomData<float>(info.GetNumElements());
2624 armnn::ConstTensor constTensor(info, constantData);
2625
2626 armnn::INetworkPtr network = armnn::INetwork::Create();
2627 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2628 armnn::IConnectableLayer* const constantLayer = network->AddConstantLayer(constTensor, "constant");
2629 armnn::IConnectableLayer* const switchLayer = network->AddSwitchLayer(layerName.c_str());
2630 armnn::IConnectableLayer* const trueOutputLayer = network->AddOutputLayer(0);
2631 armnn::IConnectableLayer* const falseOutputLayer = network->AddOutputLayer(1);
2632
2633 inputLayer->GetOutputSlot(0).Connect(switchLayer->GetInputSlot(0));
2634 constantLayer->GetOutputSlot(0).Connect(switchLayer->GetInputSlot(1));
2635 switchLayer->GetOutputSlot(0).Connect(trueOutputLayer->GetInputSlot(0));
2636 switchLayer->GetOutputSlot(1).Connect(falseOutputLayer->GetInputSlot(0));
2637
2638 inputLayer->GetOutputSlot(0).SetTensorInfo(info);
2639 constantLayer->GetOutputSlot(0).SetTensorInfo(info);
2640 switchLayer->GetOutputSlot(0).SetTensorInfo(info);
2641 switchLayer->GetOutputSlot(1).SetTensorInfo(info);
2642
2643 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002644 CHECK(deserializedNetwork);
Sadik Armaganeff363d2019-04-05 15:25:46 +01002645
2646 SwitchLayerVerifier verifier(layerName, {info, info}, {info, info});
Finn Williamsb454c5c2021-02-09 15:56:23 +00002647 deserializedNetwork->ExecuteStrategy(verifier);
Sadik Armaganeff363d2019-04-05 15:25:46 +01002648}
2649
Sadik Armagan1625efc2021-06-10 18:24:34 +01002650TEST_CASE("SerializeTranspose")
Mike Kellyc9ea45a2020-02-28 18:11:58 +00002651{
Mike Kellyc9ea45a2020-02-28 18:11:58 +00002652 const std::string layerName("transpose");
2653 const armnn::TensorInfo inputTensorInfo({4, 3, 2, 1}, armnn::DataType::Float32);
2654 const armnn::TensorInfo outputTensorInfo({1, 2, 3, 4}, armnn::DataType::Float32);
2655
2656 armnn::TransposeDescriptor descriptor(armnn::PermutationVector({3, 2, 1, 0}));
2657
2658 armnn::INetworkPtr network = armnn::INetwork::Create();
2659 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2660 armnn::IConnectableLayer* const transposeLayer = network->AddTransposeLayer(descriptor, layerName.c_str());
2661 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2662
2663 inputLayer->GetOutputSlot(0).Connect(transposeLayer->GetInputSlot(0));
2664 transposeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2665
2666 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
2667 transposeLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
2668
2669 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002670 CHECK(deserializedNetwork);
Mike Kellyc9ea45a2020-02-28 18:11:58 +00002671
Finn Williamsb454c5c2021-02-09 15:56:23 +00002672 LayerVerifierBaseWithDescriptor<armnn::TransposeDescriptor> verifier(
2673 layerName, {inputTensorInfo}, {outputTensorInfo}, descriptor);
2674 deserializedNetwork->ExecuteStrategy(verifier);
Mike Kellyc9ea45a2020-02-28 18:11:58 +00002675}
2676
Sadik Armagan1625efc2021-06-10 18:24:34 +01002677TEST_CASE("SerializeTransposeConvolution2d")
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01002678{
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01002679 const std::string layerName("transposeConvolution2d");
2680 const armnn::TensorInfo inputInfo ({ 1, 7, 7, 1 }, armnn::DataType::Float32);
2681 const armnn::TensorInfo outputInfo({ 1, 9, 9, 1 }, armnn::DataType::Float32);
2682
Cathal Corbett5b8093c2021-10-22 11:12:07 +01002683 const armnn::TensorInfo weightsInfo({ 1, 3, 3, 1 }, armnn::DataType::Float32, 0.0f, 0, true);
2684 const armnn::TensorInfo biasesInfo ({ 1 }, armnn::DataType::Float32, 0.0f, 0, true);
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01002685
2686 std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements());
2687 armnn::ConstTensor weights(weightsInfo, weightsData);
2688
2689 std::vector<float> biasesData = GenerateRandomData<float>(biasesInfo.GetNumElements());
2690 armnn::ConstTensor biases(biasesInfo, biasesData);
2691
2692 armnn::TransposeConvolution2dDescriptor descriptor;
2693 descriptor.m_PadLeft = 1;
2694 descriptor.m_PadRight = 1;
2695 descriptor.m_PadTop = 1;
2696 descriptor.m_PadBottom = 1;
2697 descriptor.m_StrideX = 1;
2698 descriptor.m_StrideY = 1;
2699 descriptor.m_BiasEnabled = true;
2700 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
2701
2702 armnn::INetworkPtr network = armnn::INetwork::Create();
2703 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2704 armnn::IConnectableLayer* const convLayer =
2705 network->AddTransposeConvolution2dLayer(descriptor,
2706 weights,
2707 armnn::Optional<armnn::ConstTensor>(biases),
2708 layerName.c_str());
2709 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2710
2711 inputLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(0));
2712 convLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2713
2714 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2715 convLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2716
2717 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002718 CHECK(deserializedNetwork);
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01002719
Finn Williamsb454c5c2021-02-09 15:56:23 +00002720 const std::vector<armnn::ConstTensor> constants {weights, biases};
2721 LayerVerifierBaseWithDescriptorAndConstants<armnn::TransposeConvolution2dDescriptor> verifier(
2722 layerName, {inputInfo}, {outputInfo}, descriptor, constants);
2723 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01002724}
2725
Sadik Armagan1625efc2021-06-10 18:24:34 +01002726TEST_CASE("SerializeDeserializeNonLinearNetwork")
Sadik Armagandb059fd2019-03-20 12:28:32 +00002727{
2728 class ConstantLayerVerifier : public LayerVerifierBase
2729 {
2730 public:
2731 ConstantLayerVerifier(const std::string& layerName,
2732 const std::vector<armnn::TensorInfo>& inputInfos,
2733 const std::vector<armnn::TensorInfo>& outputInfos,
2734 const armnn::ConstTensor& layerInput)
2735 : LayerVerifierBase(layerName, inputInfos, outputInfos)
2736 , m_LayerInput(layerInput) {}
2737
Finn Williamsb454c5c2021-02-09 15:56:23 +00002738 void ExecuteStrategy(const armnn::IConnectableLayer* layer,
2739 const armnn::BaseDescriptor& descriptor,
2740 const std::vector<armnn::ConstTensor>& constants,
2741 const char* name,
2742 const armnn::LayerBindingId id = 0) override
Sadik Armagandb059fd2019-03-20 12:28:32 +00002743 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00002744 armnn::IgnoreUnused(descriptor, constants, id);
2745 switch (layer->GetType())
2746 {
2747 case armnn::LayerType::Input: break;
2748 case armnn::LayerType::Output: break;
2749 case armnn::LayerType::Addition: break;
2750 case armnn::LayerType::Constant:
2751 {
2752 VerifyNameAndConnections(layer, name);
2753 CompareConstTensor(constants.at(0), m_LayerInput);
2754 break;
2755 }
2756 default:
2757 {
2758 throw armnn::Exception("Unexpected layer type in test model");
2759 }
2760 }
Sadik Armagandb059fd2019-03-20 12:28:32 +00002761 }
2762
Sadik Armagandb059fd2019-03-20 12:28:32 +00002763 private:
2764 armnn::ConstTensor m_LayerInput;
2765 };
2766
2767 const std::string layerName("constant");
Cathal Corbett5b8093c2021-10-22 11:12:07 +01002768 const armnn::TensorInfo info({ 2, 3 }, armnn::DataType::Float32, 0.0f, 0, true);
Sadik Armagandb059fd2019-03-20 12:28:32 +00002769
2770 std::vector<float> constantData = GenerateRandomData<float>(info.GetNumElements());
2771 armnn::ConstTensor constTensor(info, constantData);
2772
2773 armnn::INetworkPtr network(armnn::INetwork::Create());
2774 armnn::IConnectableLayer* input = network->AddInputLayer(0);
2775 armnn::IConnectableLayer* add = network->AddAdditionLayer();
2776 armnn::IConnectableLayer* constant = network->AddConstantLayer(constTensor, layerName.c_str());
2777 armnn::IConnectableLayer* output = network->AddOutputLayer(0);
2778
2779 input->GetOutputSlot(0).Connect(add->GetInputSlot(0));
2780 constant->GetOutputSlot(0).Connect(add->GetInputSlot(1));
2781 add->GetOutputSlot(0).Connect(output->GetInputSlot(0));
2782
2783 input->GetOutputSlot(0).SetTensorInfo(info);
2784 constant->GetOutputSlot(0).SetTensorInfo(info);
2785 add->GetOutputSlot(0).SetTensorInfo(info);
2786
2787 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002788 CHECK(deserializedNetwork);
Sadik Armagandb059fd2019-03-20 12:28:32 +00002789
2790 ConstantLayerVerifier verifier(layerName, {}, {info}, constTensor);
Finn Williamsb454c5c2021-02-09 15:56:23 +00002791 deserializedNetwork->ExecuteStrategy(verifier);
James Conroy8d333182020-05-13 10:27:58 +01002792}
2793
Teresa Charlin50de4fa2021-05-31 18:47:33 +01002794}