blob: 3998ee730d5aee08c232c3b4dc4b5d01a5160e2a [file] [log] [blame]
Mike Kelly8c1701a2019-02-11 17:01:27 +00001//
Mike Kelly3ec30772023-03-08 13:47:17 +00002// Copyright © 2017,2020-2023 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);
Mike Kelly52e90bf2023-03-15 15:06:23 +000035 ARMNN_NO_DEPRECATE_WARN_BEGIN
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +000036 armnn::IConnectableLayer* const additionLayer = network->AddAdditionLayer(layerName.c_str());
Mike Kelly52e90bf2023-03-15 15:06:23 +000037 ARMNN_NO_DEPRECATE_WARN_END
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +000038 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
Mike Kelly8c1701a2019-02-11 17:01:27 +000039
Éanna Ó Catháin633f8592019-02-25 16:26:29 +000040 inputLayer0->GetOutputSlot(0).Connect(additionLayer->GetInputSlot(0));
41 inputLayer1->GetOutputSlot(0).Connect(additionLayer->GetInputSlot(1));
Éanna Ó Catháin633f8592019-02-25 16:26:29 +000042 additionLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
Mike Kelly8c1701a2019-02-11 17:01:27 +000043
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +000044 inputLayer0->GetOutputSlot(0).SetTensorInfo(tensorInfo);
45 inputLayer1->GetOutputSlot(0).SetTensorInfo(tensorInfo);
46 additionLayer->GetOutputSlot(0).SetTensorInfo(tensorInfo);
Jim Flynn3091b062019-02-15 14:45:04 +000047
Finn Williamsb454c5c2021-02-09 15:56:23 +000048 std::string serializedNetwork = SerializeNetwork(*network);
49 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(serializedNetwork);
Sadik Armagan1625efc2021-06-10 18:24:34 +010050 CHECK(deserializedNetwork);
Éanna Ó Catháin633f8592019-02-25 16:26:29 +000051
Finn Williamsb454c5c2021-02-09 15:56:23 +000052 LayerVerifierBase verifier(layerName, {tensorInfo, tensorInfo}, {tensorInfo});
53 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +000054}
Jim Flynnac25a1b2019-02-28 10:40:49 +000055
Mike Kelly1f140f72021-04-06 12:25:55 +010056void SerializeArgMinMaxTest(armnn::DataType dataType)
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +010057{
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +010058 const std::string layerName("argminmax");
59 const armnn::TensorInfo inputInfo({1, 2, 3}, armnn::DataType::Float32);
Mike Kelly1f140f72021-04-06 12:25:55 +010060 const armnn::TensorInfo outputInfo({1, 3}, dataType);
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +010061
62 armnn::ArgMinMaxDescriptor descriptor;
63 descriptor.m_Function = armnn::ArgMinMaxFunction::Max;
64 descriptor.m_Axis = 1;
65
66 armnn::INetworkPtr network = armnn::INetwork::Create();
67 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
68 armnn::IConnectableLayer* const argMinMaxLayer = network->AddArgMinMaxLayer(descriptor, layerName.c_str());
69 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
70
71 inputLayer->GetOutputSlot(0).Connect(argMinMaxLayer->GetInputSlot(0));
72 argMinMaxLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
73
74 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
75 argMinMaxLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
76
77 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +010078 CHECK(deserializedNetwork);
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +010079
Finn Williamsb454c5c2021-02-09 15:56:23 +000080 LayerVerifierBaseWithDescriptor<armnn::ArgMinMaxDescriptor> verifier(layerName,
81 {inputInfo},
82 {outputInfo},
83 descriptor);
84 deserializedNetwork->ExecuteStrategy(verifier);
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +010085}
86
Sadik Armagan1625efc2021-06-10 18:24:34 +010087TEST_CASE("SerializeArgMinMaxSigned32")
Mike Kelly1f140f72021-04-06 12:25:55 +010088{
89 SerializeArgMinMaxTest(armnn::DataType::Signed32);
90}
91
Sadik Armagan1625efc2021-06-10 18:24:34 +010092TEST_CASE("SerializeArgMinMaxSigned64")
Mike Kelly1f140f72021-04-06 12:25:55 +010093{
94 SerializeArgMinMaxTest(armnn::DataType::Signed64);
95}
96
Samuel Yapa04f4a12022-08-19 11:14:38 +010097TEST_CASE("SerializeBatchMatMul")
98{
99 const std::string layerName("batchMatMul");
100 const armnn::TensorInfo inputXInfo({2, 3, 4, 5}, armnn::DataType::Float32);
101 const armnn::TensorInfo inputYInfo({2, 4, 3, 5}, armnn::DataType::Float32);
102
103 const armnn::TensorInfo outputInfo({2, 3, 3, 5}, armnn::DataType::Float32);
104
105 armnn::BatchMatMulDescriptor descriptor(false,
106 false,
107 false,
108 false,
109 armnn::DataLayout::NHWC,
110 armnn::DataLayout::NHWC);
111
112 armnn::INetworkPtr network = armnn::INetwork::Create();
113 armnn::IConnectableLayer* const inputXLayer = network->AddInputLayer(0);
114 armnn::IConnectableLayer* const inputYLayer = network->AddInputLayer(1);
115
116 armnn::IConnectableLayer* const batchMatMulLayer =
117 network->AddBatchMatMulLayer(descriptor, layerName.c_str());
118 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
119
120 inputXLayer->GetOutputSlot(0).Connect(batchMatMulLayer->GetInputSlot(0));
121 inputYLayer->GetOutputSlot(0).Connect(batchMatMulLayer->GetInputSlot(1));
122 batchMatMulLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
123
124 inputXLayer->GetOutputSlot(0).SetTensorInfo(inputXInfo);
125 inputYLayer->GetOutputSlot(0).SetTensorInfo(inputYInfo);
126 batchMatMulLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
127
128 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
129 CHECK(deserializedNetwork);
130
131 LayerVerifierBaseWithDescriptor<armnn::BatchMatMulDescriptor> verifier(layerName,
132 {inputXInfo, inputYInfo},
133 {outputInfo},
134 descriptor);
135 deserializedNetwork->ExecuteStrategy(verifier);
136}
137
Sadik Armagan1625efc2021-06-10 18:24:34 +0100138TEST_CASE("SerializeBatchNormalization")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000139{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000140 const std::string layerName("batchNormalization");
141 const armnn::TensorInfo inputInfo ({ 1, 3, 3, 1 }, armnn::DataType::Float32);
142 const armnn::TensorInfo outputInfo({ 1, 3, 3, 1 }, armnn::DataType::Float32);
143
Cathal Corbett5b8093c2021-10-22 11:12:07 +0100144 const armnn::TensorInfo meanInfo({1}, armnn::DataType::Float32, 0.0f, 0, true);
145 const armnn::TensorInfo varianceInfo({1}, armnn::DataType::Float32, 0.0f, 0, true);
146 const armnn::TensorInfo betaInfo({1}, armnn::DataType::Float32, 0.0f, 0, true);
147 const armnn::TensorInfo gammaInfo({1}, armnn::DataType::Float32, 0.0f, 0, true);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000148
149 armnn::BatchNormalizationDescriptor descriptor;
150 descriptor.m_Eps = 0.0010000000475f;
151 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
152
153 std::vector<float> meanData({5.0});
154 std::vector<float> varianceData({2.0});
155 std::vector<float> betaData({1.0});
156 std::vector<float> gammaData({0.0});
157
Finn Williamsb454c5c2021-02-09 15:56:23 +0000158 std::vector<armnn::ConstTensor> constants;
159 constants.emplace_back(armnn::ConstTensor(meanInfo, meanData));
160 constants.emplace_back(armnn::ConstTensor(varianceInfo, varianceData));
161 constants.emplace_back(armnn::ConstTensor(betaInfo, betaData));
162 constants.emplace_back(armnn::ConstTensor(gammaInfo, gammaData));
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000163
164 armnn::INetworkPtr network = armnn::INetwork::Create();
165 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
166 armnn::IConnectableLayer* const batchNormalizationLayer =
Finn Williamsb454c5c2021-02-09 15:56:23 +0000167 network->AddBatchNormalizationLayer(descriptor,
168 constants[0],
169 constants[1],
170 constants[2],
171 constants[3],
172 layerName.c_str());
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000173 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
174
175 inputLayer->GetOutputSlot(0).Connect(batchNormalizationLayer->GetInputSlot(0));
176 batchNormalizationLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
177
178 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
179 batchNormalizationLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
180
181 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100182 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000183
Finn Williamsb454c5c2021-02-09 15:56:23 +0000184 LayerVerifierBaseWithDescriptorAndConstants<armnn::BatchNormalizationDescriptor> verifier(
185 layerName, {inputInfo}, {outputInfo}, descriptor, constants);
186 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000187}
188
Sadik Armagan1625efc2021-06-10 18:24:34 +0100189TEST_CASE("SerializeBatchToSpaceNd")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000190{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000191 const std::string layerName("spaceToBatchNd");
192 const armnn::TensorInfo inputInfo({4, 1, 2, 2}, armnn::DataType::Float32);
193 const armnn::TensorInfo outputInfo({1, 1, 4, 4}, armnn::DataType::Float32);
194
195 armnn::BatchToSpaceNdDescriptor desc;
196 desc.m_DataLayout = armnn::DataLayout::NCHW;
197 desc.m_BlockShape = {2, 2};
198 desc.m_Crops = {{0, 0}, {0, 0}};
199
200 armnn::INetworkPtr network = armnn::INetwork::Create();
201 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
202 armnn::IConnectableLayer* const batchToSpaceNdLayer = network->AddBatchToSpaceNdLayer(desc, layerName.c_str());
203 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
204
205 inputLayer->GetOutputSlot(0).Connect(batchToSpaceNdLayer->GetInputSlot(0));
206 batchToSpaceNdLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
207
208 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
209 batchToSpaceNdLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
210
211 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100212 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000213
Finn Williamsb454c5c2021-02-09 15:56:23 +0000214 LayerVerifierBaseWithDescriptor<armnn::BatchToSpaceNdDescriptor> verifier(layerName,
215 {inputInfo},
216 {outputInfo},
217 desc);
218 deserializedNetwork->ExecuteStrategy(verifier);
Mike Kelly8c1701a2019-02-11 17:01:27 +0000219}
220
Sadik Armagan1625efc2021-06-10 18:24:34 +0100221TEST_CASE("SerializeCast")
mathad01b392e982021-04-07 12:07:30 +0100222{
223 const std::string layerName("cast");
224
225 const armnn::TensorShape shape{1, 5, 2, 3};
226
227 const armnn::TensorInfo inputInfo = armnn::TensorInfo(shape, armnn::DataType::Signed32);
228 const armnn::TensorInfo outputInfo = armnn::TensorInfo(shape, armnn::DataType::Float32);
229
230 armnn::INetworkPtr network = armnn::INetwork::Create();
231 armnn::IConnectableLayer* inputLayer = network->AddInputLayer(0);
232 armnn::IConnectableLayer* castLayer = network->AddCastLayer(layerName.c_str());
233 armnn::IConnectableLayer* outputLayer = network->AddOutputLayer(0);
234
235 inputLayer->GetOutputSlot(0).Connect(castLayer->GetInputSlot(0));
236 castLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
237
238 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
239 castLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
240
241 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100242 CHECK(deserializedNetwork);
mathad01b392e982021-04-07 12:07:30 +0100243
244 LayerVerifierBase verifier(layerName, {inputInfo}, {outputInfo});
245 deserializedNetwork->ExecuteStrategy(verifier);
246}
247
Simon Obute51f67772021-09-03 15:50:13 +0100248TEST_CASE("SerializeChannelShuffle")
249{
250 const std::string layerName("channelShuffle");
251 const armnn::TensorInfo inputInfo({1, 9}, armnn::DataType::Float32);
252 const armnn::TensorInfo outputInfo({1, 9}, armnn::DataType::Float32);
253
254 armnn::ChannelShuffleDescriptor descriptor({3, 1});
255
256 armnn::INetworkPtr network = armnn::INetwork::Create();
257 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
258 armnn::IConnectableLayer* const ChannelShuffleLayer =
259 network->AddChannelShuffleLayer(descriptor, layerName.c_str());
260 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
261
262 inputLayer->GetOutputSlot(0).Connect(ChannelShuffleLayer->GetInputSlot(0));
263 ChannelShuffleLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
264
265 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
266 ChannelShuffleLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
267
268 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
269 CHECK(deserializedNetwork);
270
271 LayerVerifierBaseWithDescriptor<armnn::ChannelShuffleDescriptor> verifier(
272 layerName, {inputInfo}, {outputInfo}, descriptor);
273 deserializedNetwork->ExecuteStrategy(verifier);
274}
275
Sadik Armagan1625efc2021-06-10 18:24:34 +0100276TEST_CASE("SerializeComparison")
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100277{
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100278 const std::string layerName("comparison");
279
280 const armnn::TensorShape shape{2, 1, 2, 4};
281
282 const armnn::TensorInfo inputInfo = armnn::TensorInfo(shape, armnn::DataType::Float32);
283 const armnn::TensorInfo outputInfo = armnn::TensorInfo(shape, armnn::DataType::Boolean);
284
285 armnn::ComparisonDescriptor descriptor(armnn::ComparisonOperation::NotEqual);
286
287 armnn::INetworkPtr network = armnn::INetwork::Create();
288 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
289 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
290 armnn::IConnectableLayer* const comparisonLayer = network->AddComparisonLayer(descriptor, layerName.c_str());
291 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
292
293 inputLayer0->GetOutputSlot(0).Connect(comparisonLayer->GetInputSlot(0));
294 inputLayer1->GetOutputSlot(0).Connect(comparisonLayer->GetInputSlot(1));
295 comparisonLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
296
297 inputLayer0->GetOutputSlot(0).SetTensorInfo(inputInfo);
298 inputLayer1->GetOutputSlot(0).SetTensorInfo(inputInfo);
299 comparisonLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
300
301 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100302 CHECK(deserializedNetwork);
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100303
Finn Williamsb454c5c2021-02-09 15:56:23 +0000304 LayerVerifierBaseWithDescriptor<armnn::ComparisonDescriptor> verifier(layerName,
305 { inputInfo, inputInfo },
306 { outputInfo },
307 descriptor);
308 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100309}
310
Sadik Armagan1625efc2021-06-10 18:24:34 +0100311TEST_CASE("SerializeConstant")
Conor Kennedy76277882019-02-26 08:29:54 +0000312{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000313 class ConstantLayerVerifier : public LayerVerifierBase
Conor Kennedy76277882019-02-26 08:29:54 +0000314 {
315 public:
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000316 ConstantLayerVerifier(const std::string& layerName,
317 const std::vector<armnn::TensorInfo>& inputInfos,
318 const std::vector<armnn::TensorInfo>& outputInfos,
Finn Williamsb454c5c2021-02-09 15:56:23 +0000319 const std::vector<armnn::ConstTensor>& constants)
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100320 : LayerVerifierBase(layerName, inputInfos, outputInfos)
Finn Williamsb454c5c2021-02-09 15:56:23 +0000321 , m_Constants(constants) {}
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000322
Finn Williamsb454c5c2021-02-09 15:56:23 +0000323 void ExecuteStrategy(const armnn::IConnectableLayer* layer,
324 const armnn::BaseDescriptor& descriptor,
325 const std::vector<armnn::ConstTensor>& constants,
326 const char* name,
327 const armnn::LayerBindingId id = 0) override
Conor Kennedy76277882019-02-26 08:29:54 +0000328 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000329 armnn::IgnoreUnused(descriptor, id);
330
331 switch (layer->GetType())
332 {
333 case armnn::LayerType::Input: break;
334 case armnn::LayerType::Output: break;
335 case armnn::LayerType::Addition: break;
Mike Kelly3ec30772023-03-08 13:47:17 +0000336 case armnn::LayerType::ElementwiseBinary: break;
Finn Williamsb454c5c2021-02-09 15:56:23 +0000337 default:
338 {
339 this->VerifyNameAndConnections(layer, name);
340
341 for (std::size_t i = 0; i < constants.size(); i++)
342 {
343 CompareConstTensor(constants[i], m_Constants[i]);
344 }
345 }
346 }
Conor Kennedy76277882019-02-26 08:29:54 +0000347 }
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000348
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000349 private:
Finn Williamsb454c5c2021-02-09 15:56:23 +0000350 const std::vector<armnn::ConstTensor> m_Constants;
Conor Kennedy76277882019-02-26 08:29:54 +0000351 };
352
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000353 const std::string layerName("constant");
Cathal Corbett5b8093c2021-10-22 11:12:07 +0100354 const armnn::TensorInfo info({ 2, 3 }, armnn::DataType::Float32, 0.0f, 0, true);
Conor Kennedy76277882019-02-26 08:29:54 +0000355
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000356 std::vector<float> constantData = GenerateRandomData<float>(info.GetNumElements());
357 armnn::ConstTensor constTensor(info, constantData);
Conor Kennedy76277882019-02-26 08:29:54 +0000358
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000359 armnn::INetworkPtr network(armnn::INetwork::Create());
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000360 armnn::IConnectableLayer* input = network->AddInputLayer(0);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000361 armnn::IConnectableLayer* constant = network->AddConstantLayer(constTensor, layerName.c_str());
Mike Kelly52e90bf2023-03-15 15:06:23 +0000362 ARMNN_NO_DEPRECATE_WARN_BEGIN
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000363 armnn::IConnectableLayer* add = network->AddAdditionLayer();
Mike Kelly52e90bf2023-03-15 15:06:23 +0000364 ARMNN_NO_DEPRECATE_WARN_END
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000365 armnn::IConnectableLayer* output = network->AddOutputLayer(0);
Conor Kennedy76277882019-02-26 08:29:54 +0000366
367 input->GetOutputSlot(0).Connect(add->GetInputSlot(0));
368 constant->GetOutputSlot(0).Connect(add->GetInputSlot(1));
369 add->GetOutputSlot(0).Connect(output->GetInputSlot(0));
370
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000371 input->GetOutputSlot(0).SetTensorInfo(info);
372 constant->GetOutputSlot(0).SetTensorInfo(info);
373 add->GetOutputSlot(0).SetTensorInfo(info);
Conor Kennedy76277882019-02-26 08:29:54 +0000374
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000375 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100376 CHECK(deserializedNetwork);
Conor Kennedy76277882019-02-26 08:29:54 +0000377
Finn Williamsb454c5c2021-02-09 15:56:23 +0000378 ConstantLayerVerifier verifier(layerName, {}, {info}, {constTensor});
379 deserializedNetwork->ExecuteStrategy(verifier);
Conor Kennedy76277882019-02-26 08:29:54 +0000380}
381
Keith Davisb4dd5cc2022-04-07 11:32:00 +0100382using Convolution2dDescriptor = armnn::Convolution2dDescriptor;
383class Convolution2dLayerVerifier : public LayerVerifierBaseWithDescriptor<Convolution2dDescriptor>
384{
385public:
386 Convolution2dLayerVerifier(const std::string& layerName,
387 const std::vector<armnn::TensorInfo>& inputInfos,
388 const std::vector<armnn::TensorInfo>& outputInfos,
389 const Convolution2dDescriptor& descriptor)
390 : LayerVerifierBaseWithDescriptor<Convolution2dDescriptor>(layerName, inputInfos, outputInfos, descriptor) {}
391
392 void ExecuteStrategy(const armnn::IConnectableLayer* layer,
393 const armnn::BaseDescriptor& descriptor,
394 const std::vector<armnn::ConstTensor>& constants,
395 const char* name,
396 const armnn::LayerBindingId id = 0) override
397 {
398 armnn::IgnoreUnused(constants, id);
399 switch (layer->GetType())
400 {
401 case armnn::LayerType::Input: break;
402 case armnn::LayerType::Output: break;
403 case armnn::LayerType::Constant: break;
404 default:
405 {
406 VerifyNameAndConnections(layer, name);
407 const Convolution2dDescriptor& layerDescriptor =
408 static_cast<const Convolution2dDescriptor&>(descriptor);
409 CHECK(layerDescriptor.m_BiasEnabled == m_Descriptor.m_BiasEnabled);
410 }
411 }
412 }
413};
414
Sadik Armagan1625efc2021-06-10 18:24:34 +0100415TEST_CASE("SerializeConvolution2d")
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000416{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000417 const std::string layerName("convolution2d");
418 const armnn::TensorInfo inputInfo ({ 1, 5, 5, 1 }, armnn::DataType::Float32);
419 const armnn::TensorInfo outputInfo({ 1, 3, 3, 1 }, armnn::DataType::Float32);
Saoirse Stewart263829c2019-02-19 15:54:14 +0000420
Cathal Corbett5b8093c2021-10-22 11:12:07 +0100421 const armnn::TensorInfo weightsInfo({ 1, 3, 3, 1 }, armnn::DataType::Float32, 0.0f, 0, true);
422 const armnn::TensorInfo biasesInfo ({ 1 }, armnn::DataType::Float32, 0.0f, 0, true);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000423
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000424 std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements());
425 armnn::ConstTensor weights(weightsInfo, weightsData);
426
427 std::vector<float> biasesData = GenerateRandomData<float>(biasesInfo.GetNumElements());
428 armnn::ConstTensor biases(biasesInfo, biasesData);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000429
430 armnn::Convolution2dDescriptor descriptor;
431 descriptor.m_PadLeft = 1;
432 descriptor.m_PadRight = 1;
433 descriptor.m_PadTop = 1;
434 descriptor.m_PadBottom = 1;
435 descriptor.m_StrideX = 2;
436 descriptor.m_StrideY = 2;
Aron Virginas-Tar5e1b0cf2019-06-21 14:20:11 +0100437 descriptor.m_DilationX = 2;
438 descriptor.m_DilationY = 2;
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000439 descriptor.m_BiasEnabled = true;
440 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
441
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000442 armnn::INetworkPtr network = armnn::INetwork::Create();
443 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
Teresa Charlind9360332022-08-30 14:27:10 +0100444 armnn::IConnectableLayer* const weightsLayer = network->AddConstantLayer(weights, "weights");
445 armnn::IConnectableLayer* const biasLayer = network->AddConstantLayer(biases, "bias");
446 armnn::IConnectableLayer* const convLayer = network->AddConvolution2dLayer(descriptor, layerName.c_str());
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000447 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000448
449 inputLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(0));
Teresa Charlind9360332022-08-30 14:27:10 +0100450 weightsLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(1));
451 biasLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(2));
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000452 convLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000453
454 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
Teresa Charlind9360332022-08-30 14:27:10 +0100455 weightsLayer->GetOutputSlot(0).SetTensorInfo(weightsInfo);
456 biasLayer->GetOutputSlot(0).SetTensorInfo(biasesInfo);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000457 convLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
458
459 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100460 CHECK(deserializedNetwork);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000461
Keith Davisb4dd5cc2022-04-07 11:32:00 +0100462 Convolution2dLayerVerifier verifier(layerName, {inputInfo, weightsInfo, biasesInfo}, {outputInfo}, descriptor);
Finn Williamsb454c5c2021-02-09 15:56:23 +0000463 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000464}
465
Teresa Charlind9360332022-08-30 14:27:10 +0100466TEST_CASE("SerializeConvolution2dWithPerAxisParams")
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000467{
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000468 using namespace armnn;
469
470 const std::string layerName("convolution2dWithPerAxis");
471 const TensorInfo inputInfo ({ 1, 3, 1, 2 }, DataType::QAsymmU8, 0.55f, 128);
472 const TensorInfo outputInfo({ 1, 3, 1, 3 }, DataType::QAsymmU8, 0.75f, 128);
473
474 const std::vector<float> quantScales{ 0.75f, 0.65f, 0.85f };
475 constexpr unsigned int quantDimension = 0;
476
Cathal Corbett5b8093c2021-10-22 11:12:07 +0100477 const TensorInfo kernelInfo({ 3, 1, 1, 2 }, DataType::QSymmS8, quantScales, quantDimension, true);
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000478
479 const std::vector<float> biasQuantScales{ 0.25f, 0.50f, 0.75f };
Cathal Corbett5b8093c2021-10-22 11:12:07 +0100480 const TensorInfo biasInfo({ 3 }, DataType::Signed32, biasQuantScales, quantDimension, true);
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000481
482 std::vector<int8_t> kernelData = GenerateRandomData<int8_t>(kernelInfo.GetNumElements());
483 armnn::ConstTensor weights(kernelInfo, kernelData);
484 std::vector<int32_t> biasData = GenerateRandomData<int32_t>(biasInfo.GetNumElements());
485 armnn::ConstTensor biases(biasInfo, biasData);
486
487 Convolution2dDescriptor descriptor;
488 descriptor.m_StrideX = 1;
489 descriptor.m_StrideY = 1;
490 descriptor.m_PadLeft = 0;
491 descriptor.m_PadRight = 0;
492 descriptor.m_PadTop = 0;
493 descriptor.m_PadBottom = 0;
494 descriptor.m_BiasEnabled = true;
495 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
496
497 armnn::INetworkPtr network = armnn::INetwork::Create();
498 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
Teresa Charlind9360332022-08-30 14:27:10 +0100499 armnn::IConnectableLayer* const weightsLayer = network->AddConstantLayer(weights, "weights");
500 armnn::IConnectableLayer* const biasLayer = network->AddConstantLayer(weights, "bias");
501 armnn::IConnectableLayer* const convLayer = network->AddConvolution2dLayer(descriptor, layerName.c_str());
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000502 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
503
504 inputLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(0));
Teresa Charlind9360332022-08-30 14:27:10 +0100505 weightsLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(1));
506 biasLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(2));
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000507 convLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
508
509 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
Teresa Charlind9360332022-08-30 14:27:10 +0100510 weightsLayer->GetOutputSlot(0).SetTensorInfo(kernelInfo);
511 biasLayer->GetOutputSlot(0).SetTensorInfo(biasInfo);
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000512 convLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
513
514 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100515 CHECK(deserializedNetwork);
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000516
Keith Davisb4dd5cc2022-04-07 11:32:00 +0100517 Convolution2dLayerVerifier verifier(layerName, {inputInfo, kernelInfo, biasInfo}, {outputInfo}, descriptor);
518
519 deserializedNetwork->ExecuteStrategy(verifier);
520}
521
522TEST_CASE("SerializeConvolution2dWeightsAndBiasesAsConstantLayers")
523{
524 const std::string layerName("convolution2d");
525 const armnn::TensorInfo inputInfo ({ 1, 5, 5, 1 }, armnn::DataType::Float32);
526 const armnn::TensorInfo outputInfo({ 1, 3, 3, 1 }, armnn::DataType::Float32);
527
528 const armnn::TensorInfo weightsInfo({ 1, 3, 3, 1 }, armnn::DataType::Float32, 0.0f, 0, true);
529 const armnn::TensorInfo biasesInfo ({ 1 }, armnn::DataType::Float32, 0.0f, 0, true);
530
531 std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements());
532 armnn::ConstTensor weights(weightsInfo, weightsData);
533
534 std::vector<float> biasesData = GenerateRandomData<float>(biasesInfo.GetNumElements());
535 armnn::ConstTensor biases(biasesInfo, biasesData);
536
537 armnn::Convolution2dDescriptor descriptor;
538 descriptor.m_PadLeft = 1;
539 descriptor.m_PadRight = 1;
540 descriptor.m_PadTop = 1;
541 descriptor.m_PadBottom = 1;
542 descriptor.m_StrideX = 2;
543 descriptor.m_StrideY = 2;
544 descriptor.m_DilationX = 2;
545 descriptor.m_DilationY = 2;
546 descriptor.m_BiasEnabled = true;
547 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
548
549 armnn::INetworkPtr network = armnn::INetwork::Create();
550 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
551 armnn::IConnectableLayer* const weightsLayer = network->AddConstantLayer(weights, "Weights");
552 armnn::IConnectableLayer* const biasesLayer = network->AddConstantLayer(biases, "Biases");
553 armnn::IConnectableLayer* const convLayer = network->AddConvolution2dLayer(descriptor,
554 layerName.c_str());
555 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
556
557 inputLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(0));
558 weightsLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(1));
559 biasesLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(2));
560 convLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
561
562 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
563 weightsLayer->GetOutputSlot(0).SetTensorInfo(weightsInfo);
564 biasesLayer->GetOutputSlot(0).SetTensorInfo(biasesInfo);
565 convLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
566
567 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
568 CHECK(deserializedNetwork);
569
Finn Williamsb454c5c2021-02-09 15:56:23 +0000570 const std::vector<armnn::ConstTensor>& constants {weights, biases};
Keith Davisb4dd5cc2022-04-07 11:32:00 +0100571 LayerVerifierBaseWithDescriptorAndConstants<armnn::Convolution2dDescriptor> verifier(
572 layerName, {inputInfo, weightsInfo, biasesInfo}, {outputInfo}, descriptor, constants);
573
Finn Williamsb454c5c2021-02-09 15:56:23 +0000574 deserializedNetwork->ExecuteStrategy(verifier);
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000575}
576
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100577TEST_CASE("SerializeConvolution3d")
578{
579 const std::string layerName("convolution3d");
580 const armnn::TensorInfo inputInfo ({ 1, 5, 5, 5, 1 }, armnn::DataType::Float32);
581 const armnn::TensorInfo outputInfo({ 1, 2, 2, 2, 1 }, armnn::DataType::Float32);
582
Cathal Corbett5b8093c2021-10-22 11:12:07 +0100583 const armnn::TensorInfo weightsInfo({ 3, 3, 3, 1, 1 }, armnn::DataType::Float32, 0.0f, 0, true);
584 const armnn::TensorInfo biasesInfo ({ 1 }, armnn::DataType::Float32, 0.0f, 0, true);
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100585
586 std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements());
587 armnn::ConstTensor weights(weightsInfo, weightsData);
588
589 std::vector<float> biasesData = GenerateRandomData<float>(biasesInfo.GetNumElements());
590 armnn::ConstTensor biases(biasesInfo, biasesData);
591
592 armnn::Convolution3dDescriptor descriptor;
593 descriptor.m_PadLeft = 0;
594 descriptor.m_PadRight = 0;
595 descriptor.m_PadTop = 0;
596 descriptor.m_PadBottom = 0;
597 descriptor.m_PadFront = 0;
598 descriptor.m_PadBack = 0;
599 descriptor.m_DilationX = 1;
600 descriptor.m_DilationY = 1;
601 descriptor.m_DilationZ = 1;
602 descriptor.m_StrideX = 2;
603 descriptor.m_StrideY = 2;
604 descriptor.m_StrideZ = 2;
605 descriptor.m_BiasEnabled = true;
606 descriptor.m_DataLayout = armnn::DataLayout::NDHWC;
607
608 armnn::INetworkPtr network = armnn::INetwork::Create();
609 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100610 armnn::IConnectableLayer* const weightsLayer = network->AddConstantLayer(weights, "Weights");
611 armnn::IConnectableLayer* const biasesLayer = network->AddConstantLayer(biases, "Biases");
612 armnn::IConnectableLayer* const convLayer = network->AddConvolution3dLayer(descriptor, layerName.c_str());
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100613 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
614
615 inputLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(0));
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100616 weightsLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(1));
617 biasesLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(2));
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100618 convLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
619
620 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100621 weightsLayer->GetOutputSlot(0).SetTensorInfo(weightsInfo);
622 biasesLayer->GetOutputSlot(0).SetTensorInfo(biasesInfo);
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100623 convLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
624
625 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
626 CHECK(deserializedNetwork);
627
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100628 LayerVerifierBaseWithDescriptor<armnn::Convolution3dDescriptor> verifier(
629 layerName, {inputInfo, weightsInfo, biasesInfo}, {outputInfo}, descriptor);
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100630 deserializedNetwork->ExecuteStrategy(verifier);
631}
632
Sadik Armagan1625efc2021-06-10 18:24:34 +0100633TEST_CASE("SerializeDepthToSpace")
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100634{
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100635 const std::string layerName("depthToSpace");
636
637 const armnn::TensorInfo inputInfo ({ 1, 8, 4, 12 }, armnn::DataType::Float32);
638 const armnn::TensorInfo outputInfo({ 1, 16, 8, 3 }, armnn::DataType::Float32);
639
640 armnn::DepthToSpaceDescriptor desc;
641 desc.m_BlockSize = 2;
642 desc.m_DataLayout = armnn::DataLayout::NHWC;
643
644 armnn::INetworkPtr network = armnn::INetwork::Create();
645 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
646 armnn::IConnectableLayer* const depthToSpaceLayer = network->AddDepthToSpaceLayer(desc, layerName.c_str());
647 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
648
649 inputLayer->GetOutputSlot(0).Connect(depthToSpaceLayer->GetInputSlot(0));
650 depthToSpaceLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
651
652 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
653 depthToSpaceLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
654
655 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100656 CHECK(deserializedNetwork);
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100657
Finn Williamsb454c5c2021-02-09 15:56:23 +0000658 LayerVerifierBaseWithDescriptor<armnn::DepthToSpaceDescriptor> verifier(layerName, {inputInfo}, {outputInfo}, desc);
659 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100660}
661
Sadik Armagan1625efc2021-06-10 18:24:34 +0100662TEST_CASE("SerializeDepthwiseConvolution2d")
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000663{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000664 const std::string layerName("depwiseConvolution2d");
665 const armnn::TensorInfo inputInfo ({ 1, 5, 5, 3 }, armnn::DataType::Float32);
666 const armnn::TensorInfo outputInfo({ 1, 3, 3, 3 }, armnn::DataType::Float32);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000667
Cathal Corbett5b8093c2021-10-22 11:12:07 +0100668 const armnn::TensorInfo weightsInfo({ 1, 3, 3, 3 }, armnn::DataType::Float32, 0.0f, 0, true);
669 const armnn::TensorInfo biasesInfo ({ 3 }, armnn::DataType::Float32, 0.0f, 0, true);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000670
671 std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements());
672 armnn::ConstTensor weights(weightsInfo, weightsData);
673
674 std::vector<int32_t> biasesData = GenerateRandomData<int32_t>(biasesInfo.GetNumElements());
675 armnn::ConstTensor biases(biasesInfo, biasesData);
676
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000677 armnn::DepthwiseConvolution2dDescriptor descriptor;
Aron Virginas-Tar5e1b0cf2019-06-21 14:20:11 +0100678 descriptor.m_PadLeft = 1;
679 descriptor.m_PadRight = 1;
680 descriptor.m_PadTop = 1;
681 descriptor.m_PadBottom = 1;
682 descriptor.m_StrideX = 2;
683 descriptor.m_StrideY = 2;
684 descriptor.m_DilationX = 2;
685 descriptor.m_DilationY = 2;
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000686 descriptor.m_BiasEnabled = true;
687 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
688
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000689 armnn::INetworkPtr network = armnn::INetwork::Create();
690 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
Cathal Corbett06902652022-04-14 17:55:11 +0100691 armnn::IConnectableLayer* const depthwiseConvLayer = network->AddDepthwiseConvolution2dLayer(descriptor,
692 layerName.c_str());
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000693 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
694
695 inputLayer->GetOutputSlot(0).Connect(depthwiseConvLayer->GetInputSlot(0));
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000696 depthwiseConvLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000697
698 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000699 depthwiseConvLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
700
Cathal Corbett06902652022-04-14 17:55:11 +0100701 armnn::IConnectableLayer* const weightsLayer = network->AddConstantLayer(weights);
702 weightsLayer->GetOutputSlot(0).Connect(depthwiseConvLayer->GetInputSlot(1u));
703 weightsLayer->GetOutputSlot(0).SetTensorInfo(weights.GetInfo());
704
705 armnn::IConnectableLayer* const biasLayer = network->AddConstantLayer(biases);
706 biasLayer->GetOutputSlot(0).Connect(depthwiseConvLayer->GetInputSlot(2u));
707 biasLayer->GetOutputSlot(0).SetTensorInfo(biases.GetInfo());
708
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000709 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100710 CHECK(deserializedNetwork);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000711
Finn Williamsb454c5c2021-02-09 15:56:23 +0000712 const std::vector<armnn::ConstTensor>& constants {weights, biases};
713 LayerVerifierBaseWithDescriptorAndConstants<armnn::DepthwiseConvolution2dDescriptor> verifier(
Cathal Corbett06902652022-04-14 17:55:11 +0100714 layerName, {inputInfo, weightsInfo, biasesInfo}, {outputInfo}, descriptor, constants);
Finn Williamsb454c5c2021-02-09 15:56:23 +0000715 deserializedNetwork->ExecuteStrategy(verifier);
Jim Flynn18ce3382019-03-08 11:08:30 +0000716}
717
Sadik Armagan1625efc2021-06-10 18:24:34 +0100718TEST_CASE("SerializeDepthwiseConvolution2dWithPerAxisParams")
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000719{
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000720 using namespace armnn;
721
722 const std::string layerName("depwiseConvolution2dWithPerAxis");
723 const TensorInfo inputInfo ({ 1, 3, 3, 2 }, DataType::QAsymmU8, 0.55f, 128);
724 const TensorInfo outputInfo({ 1, 2, 2, 4 }, DataType::QAsymmU8, 0.75f, 128);
725
726 const std::vector<float> quantScales{ 0.75f, 0.80f, 0.90f, 0.95f };
727 const unsigned int quantDimension = 0;
Cathal Corbett5b8093c2021-10-22 11:12:07 +0100728 TensorInfo kernelInfo({ 2, 2, 2, 2 }, DataType::QSymmS8, quantScales, quantDimension, true);
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000729
730 const std::vector<float> biasQuantScales{ 0.25f, 0.35f, 0.45f, 0.55f };
731 constexpr unsigned int biasQuantDimension = 0;
Cathal Corbett5b8093c2021-10-22 11:12:07 +0100732 TensorInfo biasInfo({ 4 }, DataType::Signed32, biasQuantScales, biasQuantDimension, true);
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000733
734 std::vector<int8_t> kernelData = GenerateRandomData<int8_t>(kernelInfo.GetNumElements());
735 armnn::ConstTensor weights(kernelInfo, kernelData);
736 std::vector<int32_t> biasData = GenerateRandomData<int32_t>(biasInfo.GetNumElements());
737 armnn::ConstTensor biases(biasInfo, biasData);
738
739 DepthwiseConvolution2dDescriptor descriptor;
740 descriptor.m_StrideX = 1;
741 descriptor.m_StrideY = 1;
742 descriptor.m_PadLeft = 0;
743 descriptor.m_PadRight = 0;
744 descriptor.m_PadTop = 0;
745 descriptor.m_PadBottom = 0;
746 descriptor.m_DilationX = 1;
747 descriptor.m_DilationY = 1;
748 descriptor.m_BiasEnabled = true;
749 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
750
751 armnn::INetworkPtr network = armnn::INetwork::Create();
752 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
Cathal Corbett06902652022-04-14 17:55:11 +0100753 armnn::IConnectableLayer* const depthwiseConvLayer = network->AddDepthwiseConvolution2dLayer(descriptor,
754 layerName.c_str());
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000755 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
756
757 inputLayer->GetOutputSlot(0).Connect(depthwiseConvLayer->GetInputSlot(0));
758 depthwiseConvLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
759
760 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
761 depthwiseConvLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
762
Cathal Corbett06902652022-04-14 17:55:11 +0100763 armnn::IConnectableLayer* const weightsLayer = network->AddConstantLayer(weights);
764 weightsLayer->GetOutputSlot(0).Connect(depthwiseConvLayer->GetInputSlot(1u));
765 weightsLayer->GetOutputSlot(0).SetTensorInfo(weights.GetInfo());
766
767 armnn::IConnectableLayer* const biasLayer = network->AddConstantLayer(biases);
768 biasLayer->GetOutputSlot(0).Connect(depthwiseConvLayer->GetInputSlot(2u));
769 biasLayer->GetOutputSlot(0).SetTensorInfo(biases.GetInfo());
770
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000771 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100772 CHECK(deserializedNetwork);
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000773
Finn Williamsb454c5c2021-02-09 15:56:23 +0000774 const std::vector<armnn::ConstTensor>& constants {weights, biases};
775 LayerVerifierBaseWithDescriptorAndConstants<armnn::DepthwiseConvolution2dDescriptor> verifier(
Cathal Corbett06902652022-04-14 17:55:11 +0100776 layerName, {inputInfo, kernelInfo, biasInfo}, {outputInfo}, descriptor, constants);
777 deserializedNetwork->ExecuteStrategy(verifier);
778}
779
780TEST_CASE("SerializeDepthwiseConvolution2dWeightsAndBiasesAsConstantLayers")
781{
782 const std::string layerName("depthwiseConvolution2d");
783 const armnn::TensorInfo inputInfo ({ 1, 5, 5, 1 }, armnn::DataType::Float32);
784 const armnn::TensorInfo outputInfo({ 1, 3, 3, 1 }, armnn::DataType::Float32);
785
786 const armnn::TensorInfo weightsInfo({ 1, 3, 3, 1 }, armnn::DataType::Float32, 0.0f, 0, true);
787 const armnn::TensorInfo biasesInfo ({ 1 }, armnn::DataType::Float32, 0.0f, 0, true);
788
789 std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements());
790 armnn::ConstTensor weights(weightsInfo, weightsData);
791
792 std::vector<float> biasesData = GenerateRandomData<float>(biasesInfo.GetNumElements());
793 armnn::ConstTensor biases(biasesInfo, biasesData);
794
795 armnn::DepthwiseConvolution2dDescriptor descriptor;
796 descriptor.m_PadLeft = 1;
797 descriptor.m_PadRight = 1;
798 descriptor.m_PadTop = 1;
799 descriptor.m_PadBottom = 1;
800 descriptor.m_StrideX = 2;
801 descriptor.m_StrideY = 2;
802 descriptor.m_DilationX = 2;
803 descriptor.m_DilationY = 2;
804 descriptor.m_BiasEnabled = true;
805 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
806
807 armnn::INetworkPtr network = armnn::INetwork::Create();
808 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
809 armnn::IConnectableLayer* const weightsLayer = network->AddConstantLayer(weights, "Weights");
810 armnn::IConnectableLayer* const biasesLayer = network->AddConstantLayer(biases, "Biases");
811 armnn::IConnectableLayer* const convLayer = network->AddDepthwiseConvolution2dLayer(descriptor,
812 layerName.c_str());
813 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
814
815 inputLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(0));
816 weightsLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(1));
817 biasesLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(2));
818 convLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
819
820 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
821 weightsLayer->GetOutputSlot(0).SetTensorInfo(weightsInfo);
822 biasesLayer->GetOutputSlot(0).SetTensorInfo(biasesInfo);
823 convLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
824
825 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
826 CHECK(deserializedNetwork);
827
828 const std::vector<armnn::ConstTensor>& constants {weights, biases};
829 LayerVerifierBaseWithDescriptorAndConstants<armnn::DepthwiseConvolution2dDescriptor> verifier(
830 layerName, {inputInfo, weightsInfo, biasesInfo}, {outputInfo}, descriptor, constants);
831
Finn Williamsb454c5c2021-02-09 15:56:23 +0000832 deserializedNetwork->ExecuteStrategy(verifier);
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000833}
834
Sadik Armagan1625efc2021-06-10 18:24:34 +0100835TEST_CASE("SerializeDequantize")
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000836{
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000837 const std::string layerName("dequantize");
Derek Lambertif90c56d2020-01-10 17:14:08 +0000838 const armnn::TensorInfo inputInfo({ 1, 5, 2, 3 }, armnn::DataType::QAsymmU8, 0.5f, 1);
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000839 const armnn::TensorInfo outputInfo({ 1, 5, 2, 3 }, armnn::DataType::Float32);
840
841 armnn::INetworkPtr network = armnn::INetwork::Create();
842 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
843 armnn::IConnectableLayer* const dequantizeLayer = network->AddDequantizeLayer(layerName.c_str());
844 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
845
846 inputLayer->GetOutputSlot(0).Connect(dequantizeLayer->GetInputSlot(0));
847 dequantizeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
848
849 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
850 dequantizeLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
851
852 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100853 CHECK(deserializedNetwork);
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000854
Finn Williamsb454c5c2021-02-09 15:56:23 +0000855 LayerVerifierBase verifier(layerName, {inputInfo}, {outputInfo});
856 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000857}
858
Sadik Armagan1625efc2021-06-10 18:24:34 +0100859TEST_CASE("SerializeDeserializeDetectionPostProcess")
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000860{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000861 const std::string layerName("detectionPostProcess");
862
863 const std::vector<armnn::TensorInfo> inputInfos({
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000864 armnn::TensorInfo({ 1, 6, 4 }, armnn::DataType::Float32),
865 armnn::TensorInfo({ 1, 6, 3}, armnn::DataType::Float32)
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000866 });
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000867
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000868 const std::vector<armnn::TensorInfo> outputInfos({
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000869 armnn::TensorInfo({ 1, 3, 4 }, armnn::DataType::Float32),
870 armnn::TensorInfo({ 1, 3 }, armnn::DataType::Float32),
871 armnn::TensorInfo({ 1, 3 }, armnn::DataType::Float32),
872 armnn::TensorInfo({ 1 }, armnn::DataType::Float32)
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000873 });
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000874
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000875 armnn::DetectionPostProcessDescriptor descriptor;
876 descriptor.m_UseRegularNms = true;
877 descriptor.m_MaxDetections = 3;
878 descriptor.m_MaxClassesPerDetection = 1;
879 descriptor.m_DetectionsPerClass =1;
880 descriptor.m_NmsScoreThreshold = 0.0;
881 descriptor.m_NmsIouThreshold = 0.5;
882 descriptor.m_NumClasses = 2;
883 descriptor.m_ScaleY = 10.0;
884 descriptor.m_ScaleX = 10.0;
885 descriptor.m_ScaleH = 5.0;
886 descriptor.m_ScaleW = 5.0;
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000887
Cathal Corbett5b8093c2021-10-22 11:12:07 +0100888 const armnn::TensorInfo anchorsInfo({ 6, 4 }, armnn::DataType::Float32, 0.0f, 0, true);
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000889 const std::vector<float> anchorsData({
890 0.5f, 0.5f, 1.0f, 1.0f,
891 0.5f, 0.5f, 1.0f, 1.0f,
892 0.5f, 0.5f, 1.0f, 1.0f,
893 0.5f, 10.5f, 1.0f, 1.0f,
894 0.5f, 10.5f, 1.0f, 1.0f,
895 0.5f, 100.5f, 1.0f, 1.0f
896 });
897 armnn::ConstTensor anchors(anchorsInfo, anchorsData);
898
899 armnn::INetworkPtr network = armnn::INetwork::Create();
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000900 armnn::IConnectableLayer* const detectionLayer =
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000901 network->AddDetectionPostProcessLayer(descriptor, anchors, layerName.c_str());
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000902
903 for (unsigned int i = 0; i < 2; i++)
904 {
905 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(static_cast<int>(i));
906 inputLayer->GetOutputSlot(0).Connect(detectionLayer->GetInputSlot(i));
907 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfos[i]);
908 }
909
910 for (unsigned int i = 0; i < 4; i++)
911 {
912 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(static_cast<int>(i));
913 detectionLayer->GetOutputSlot(i).Connect(outputLayer->GetInputSlot(0));
914 detectionLayer->GetOutputSlot(i).SetTensorInfo(outputInfos[i]);
915 }
916
917 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100918 CHECK(deserializedNetwork);
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000919
Finn Williamsb454c5c2021-02-09 15:56:23 +0000920 const std::vector<armnn::ConstTensor>& constants {anchors};
921 LayerVerifierBaseWithDescriptorAndConstants<armnn::DetectionPostProcessDescriptor> verifier(
922 layerName, inputInfos, outputInfos, descriptor, constants);
923 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000924}
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000925
Sadik Armagan1625efc2021-06-10 18:24:34 +0100926TEST_CASE("SerializeDivision")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000927{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000928 const std::string layerName("division");
929 const armnn::TensorInfo info({ 1, 5, 2, 3 }, armnn::DataType::Float32);
930
931 armnn::INetworkPtr network = armnn::INetwork::Create();
932 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
933 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
Mike Kelly52e90bf2023-03-15 15:06:23 +0000934 ARMNN_NO_DEPRECATE_WARN_BEGIN
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000935 armnn::IConnectableLayer* const divisionLayer = network->AddDivisionLayer(layerName.c_str());
Mike Kelly52e90bf2023-03-15 15:06:23 +0000936 ARMNN_NO_DEPRECATE_WARN_END
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000937 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
938
939 inputLayer0->GetOutputSlot(0).Connect(divisionLayer->GetInputSlot(0));
940 inputLayer1->GetOutputSlot(0).Connect(divisionLayer->GetInputSlot(1));
941 divisionLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
942
943 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
944 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
945 divisionLayer->GetOutputSlot(0).SetTensorInfo(info);
946
947 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100948 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000949
Finn Williamsb454c5c2021-02-09 15:56:23 +0000950 LayerVerifierBase verifier(layerName, {info, info}, {info});
951 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000952}
953
Jan Eilers1b2654f2021-09-24 15:45:46 +0100954TEST_CASE("SerializeDeserializeComparisonEqual")
Aron Virginas-Tar6d2e6592019-10-22 11:44:47 +0100955{
Finn Williamsb454c5c2021-02-09 15:56:23 +0000956 const std::string layerName("EqualLayer");
957 const armnn::TensorInfo inputTensorInfo1 = armnn::TensorInfo({2, 1, 2, 4}, armnn::DataType::Float32);
958 const armnn::TensorInfo inputTensorInfo2 = armnn::TensorInfo({2, 1, 2, 4}, armnn::DataType::Float32);
959 const armnn::TensorInfo outputTensorInfo = armnn::TensorInfo({2, 1, 2, 4}, armnn::DataType::Boolean);
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100960
961 armnn::INetworkPtr network = armnn::INetwork::Create();
Finn Williamsb454c5c2021-02-09 15:56:23 +0000962 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(0);
963 armnn::IConnectableLayer* const inputLayer2 = network->AddInputLayer(1);
Jan Eilers1b2654f2021-09-24 15:45:46 +0100964 armnn::ComparisonDescriptor equalDescriptor(armnn::ComparisonOperation::Equal);
965 armnn::IConnectableLayer* const equalLayer = network->AddComparisonLayer(equalDescriptor, layerName.c_str());
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100966 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
967
Finn Williamsb454c5c2021-02-09 15:56:23 +0000968 inputLayer1->GetOutputSlot(0).Connect(equalLayer->GetInputSlot(0));
969 inputLayer1->GetOutputSlot(0).SetTensorInfo(inputTensorInfo1);
970 inputLayer2->GetOutputSlot(0).Connect(equalLayer->GetInputSlot(1));
971 inputLayer2->GetOutputSlot(0).SetTensorInfo(inputTensorInfo2);
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100972 equalLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
Finn Williamsb454c5c2021-02-09 15:56:23 +0000973 equalLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100974
975 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100976 CHECK(deserializedNetwork);
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100977
Finn Williamsb454c5c2021-02-09 15:56:23 +0000978 LayerVerifierBase verifier(layerName, {inputTensorInfo1, inputTensorInfo2}, {outputTensorInfo});
979 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tar6d2e6592019-10-22 11:44:47 +0100980}
981
Mike Kelly3ec30772023-03-08 13:47:17 +0000982void SerializeElementwiseBinaryTest(armnn::BinaryOperation binaryOperation)
983{
984 auto layerName = GetBinaryOperationAsCString(binaryOperation);
985 const armnn::TensorInfo tensorInfo({ 1, 5, 2, 3 }, armnn::DataType::Float32);
986 armnn::ElementwiseBinaryDescriptor descriptor(binaryOperation);
987
988 armnn::INetworkPtr network = armnn::INetwork::Create();
989 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
990 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
991 armnn::IConnectableLayer* const elementwiseBinaryLayer = network->AddElementwiseBinaryLayer(descriptor,
992 layerName);
993 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
994
995 inputLayer0->GetOutputSlot(0).Connect(elementwiseBinaryLayer->GetInputSlot(0));
996 inputLayer1->GetOutputSlot(0).Connect(elementwiseBinaryLayer->GetInputSlot(1));
997 elementwiseBinaryLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
998
999 inputLayer0->GetOutputSlot(0).SetTensorInfo(tensorInfo);
1000 inputLayer1->GetOutputSlot(0).SetTensorInfo(tensorInfo);
1001 elementwiseBinaryLayer->GetOutputSlot(0).SetTensorInfo(tensorInfo);
1002
1003 std::string serializedNetwork = SerializeNetwork(*network);
1004 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(serializedNetwork);
1005 CHECK(deserializedNetwork);
1006
1007 LayerVerifierBaseWithDescriptor<armnn::ElementwiseBinaryDescriptor>
1008 verifier(layerName, { tensorInfo, tensorInfo }, { tensorInfo }, descriptor);
1009 deserializedNetwork->ExecuteStrategy(verifier);
1010}
1011
1012TEST_CASE("SerializeElementwiseBinary")
1013{
1014 using op = armnn::BinaryOperation;
1015 std::initializer_list<op> allBinaryOperations = {op::Add, op::Div, op::Maximum, op::Minimum, op::Mul, op::Sub};
1016
1017 for (auto binaryOperation : allBinaryOperations)
1018 {
1019 SerializeElementwiseBinaryTest(binaryOperation);
1020 }
1021}
1022
Teresa Charlin50de4fa2021-05-31 18:47:33 +01001023void SerializeElementwiseUnaryTest(armnn::UnaryOperation unaryOperation)
1024{
1025 auto layerName = GetUnaryOperationAsCString(unaryOperation);
1026
1027 const armnn::TensorShape shape{2, 1, 2, 2};
1028
1029 const armnn::TensorInfo inputInfo = armnn::TensorInfo(shape, armnn::DataType::Float32);
1030 const armnn::TensorInfo outputInfo = armnn::TensorInfo(shape, armnn::DataType::Float32);
1031
1032 armnn::ElementwiseUnaryDescriptor descriptor(unaryOperation);
1033
1034 armnn::INetworkPtr network = armnn::INetwork::Create();
1035 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1036 armnn::IConnectableLayer* const elementwiseUnaryLayer =
1037 network->AddElementwiseUnaryLayer(descriptor, layerName);
1038 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1039
1040 inputLayer->GetOutputSlot(0).Connect(elementwiseUnaryLayer->GetInputSlot(0));
1041 elementwiseUnaryLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1042
1043 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
1044 elementwiseUnaryLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1045
1046 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
1047
1048 CHECK(deserializedNetwork);
1049
1050 LayerVerifierBaseWithDescriptor<armnn::ElementwiseUnaryDescriptor>
1051 verifier(layerName, { inputInfo }, { outputInfo }, descriptor);
1052
1053 deserializedNetwork->ExecuteStrategy(verifier);
1054}
1055
1056TEST_CASE("SerializeElementwiseUnary")
1057{
1058 using op = armnn::UnaryOperation;
1059 std::initializer_list<op> allUnaryOperations = {op::Abs, op::Exp, op::Sqrt, op::Rsqrt, op::Neg,
1060 op::LogicalNot, op::Log, op::Sin};
1061
1062 for (auto unaryOperation : allUnaryOperations)
1063 {
1064 SerializeElementwiseUnaryTest(unaryOperation);
1065 }
1066}
1067
Sadik Armagan1625efc2021-06-10 18:24:34 +01001068TEST_CASE("SerializeFill")
Keith Davis300ad562020-06-04 16:34:23 +01001069{
Keith Davis300ad562020-06-04 16:34:23 +01001070 const std::string layerName("fill");
Teresa Charlin4b10fef2020-07-29 09:36:41 +01001071 const armnn::TensorInfo inputInfo({4}, armnn::DataType::Signed32);
Keith Davis300ad562020-06-04 16:34:23 +01001072 const armnn::TensorInfo outputInfo({1, 3, 3, 1}, armnn::DataType::Float32);
1073
1074 armnn::FillDescriptor descriptor(1.0f);
1075
1076 armnn::INetworkPtr network = armnn::INetwork::Create();
1077 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1078 armnn::IConnectableLayer* const fillLayer = network->AddFillLayer(descriptor, layerName.c_str());
1079 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1080
1081 inputLayer->GetOutputSlot(0).Connect(fillLayer->GetInputSlot(0));
1082 fillLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1083
1084 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
1085 fillLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1086
1087 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001088 CHECK(deserializedNetwork);
Keith Davis300ad562020-06-04 16:34:23 +01001089
Finn Williamsb454c5c2021-02-09 15:56:23 +00001090 LayerVerifierBaseWithDescriptor<armnn::FillDescriptor> verifier(layerName, {inputInfo}, {outputInfo}, descriptor);
Keith Davis300ad562020-06-04 16:34:23 +01001091
Finn Williamsb454c5c2021-02-09 15:56:23 +00001092 deserializedNetwork->ExecuteStrategy(verifier);
Keith Davis300ad562020-06-04 16:34:23 +01001093}
1094
Sadik Armagan1625efc2021-06-10 18:24:34 +01001095TEST_CASE("SerializeFloor")
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01001096{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001097 const std::string layerName("floor");
1098 const armnn::TensorInfo info({4,4}, armnn::DataType::Float32);
1099
1100 armnn::INetworkPtr network = armnn::INetwork::Create();
1101 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1102 armnn::IConnectableLayer* const floorLayer = network->AddFloorLayer(layerName.c_str());
1103 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1104
1105 inputLayer->GetOutputSlot(0).Connect(floorLayer->GetInputSlot(0));
1106 floorLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1107
1108 inputLayer->GetOutputSlot(0).SetTensorInfo(info);
1109 floorLayer->GetOutputSlot(0).SetTensorInfo(info);
1110
1111 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001112 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001113
Finn Williamsb454c5c2021-02-09 15:56:23 +00001114 LayerVerifierBase verifier(layerName, {info}, {info});
1115 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001116}
1117
Matthew Sloyan81beae32021-07-13 19:46:11 +01001118using FullyConnectedDescriptor = armnn::FullyConnectedDescriptor;
1119class FullyConnectedLayerVerifier : public LayerVerifierBaseWithDescriptor<FullyConnectedDescriptor>
1120{
1121public:
1122 FullyConnectedLayerVerifier(const std::string& layerName,
1123 const std::vector<armnn::TensorInfo>& inputInfos,
1124 const std::vector<armnn::TensorInfo>& outputInfos,
1125 const FullyConnectedDescriptor& descriptor)
1126 : LayerVerifierBaseWithDescriptor<FullyConnectedDescriptor>(layerName, inputInfos, outputInfos, descriptor) {}
1127
1128 void ExecuteStrategy(const armnn::IConnectableLayer* layer,
1129 const armnn::BaseDescriptor& descriptor,
1130 const std::vector<armnn::ConstTensor>& constants,
1131 const char* name,
1132 const armnn::LayerBindingId id = 0) override
1133 {
1134 armnn::IgnoreUnused(constants, id);
1135 switch (layer->GetType())
1136 {
1137 case armnn::LayerType::Input: break;
1138 case armnn::LayerType::Output: break;
1139 case armnn::LayerType::Constant: break;
1140 default:
1141 {
1142 VerifyNameAndConnections(layer, name);
1143 const FullyConnectedDescriptor& layerDescriptor =
1144 static_cast<const FullyConnectedDescriptor&>(descriptor);
1145 CHECK(layerDescriptor.m_ConstantWeights == m_Descriptor.m_ConstantWeights);
1146 CHECK(layerDescriptor.m_BiasEnabled == m_Descriptor.m_BiasEnabled);
1147 CHECK(layerDescriptor.m_TransposeWeightMatrix == m_Descriptor.m_TransposeWeightMatrix);
1148 }
1149 }
1150 }
1151};
1152
Sadik Armagan1625efc2021-06-10 18:24:34 +01001153TEST_CASE("SerializeFullyConnected")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001154{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001155 const std::string layerName("fullyConnected");
1156 const armnn::TensorInfo inputInfo ({ 2, 5, 1, 1 }, armnn::DataType::Float32);
1157 const armnn::TensorInfo outputInfo({ 2, 3 }, armnn::DataType::Float32);
1158
Cathal Corbett5b8093c2021-10-22 11:12:07 +01001159 const armnn::TensorInfo weightsInfo({ 5, 3 }, armnn::DataType::Float32, 0.0f, 0, true);
1160 const armnn::TensorInfo biasesInfo ({ 3 }, armnn::DataType::Float32, 0.0f, 0, true);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001161 std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements());
1162 std::vector<float> biasesData = GenerateRandomData<float>(biasesInfo.GetNumElements());
1163 armnn::ConstTensor weights(weightsInfo, weightsData);
1164 armnn::ConstTensor biases(biasesInfo, biasesData);
1165
1166 armnn::FullyConnectedDescriptor descriptor;
1167 descriptor.m_BiasEnabled = true;
1168 descriptor.m_TransposeWeightMatrix = false;
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001169 descriptor.m_ConstantWeights = true;
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001170
1171 armnn::INetworkPtr network = armnn::INetwork::Create();
1172 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
Francis Murtaghbb6c6492022-02-09 15:13:38 +00001173 armnn::IConnectableLayer* const weightsInputLayer = network->AddInputLayer(1);
1174 armnn::IConnectableLayer* const biasInputLayer = network->AddInputLayer(2);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001175 armnn::IConnectableLayer* const fullyConnectedLayer =
Francis Murtaghbb6c6492022-02-09 15:13:38 +00001176 network->AddFullyConnectedLayer(descriptor,
1177 layerName.c_str());
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001178 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1179
1180 inputLayer->GetOutputSlot(0).Connect(fullyConnectedLayer->GetInputSlot(0));
Francis Murtaghbb6c6492022-02-09 15:13:38 +00001181 weightsInputLayer->GetOutputSlot(0).Connect(fullyConnectedLayer->GetInputSlot(1));
1182 biasInputLayer->GetOutputSlot(0).Connect(fullyConnectedLayer->GetInputSlot(2));
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001183 fullyConnectedLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1184
1185 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
Francis Murtaghbb6c6492022-02-09 15:13:38 +00001186 weightsInputLayer->GetOutputSlot(0).SetTensorInfo(weightsInfo);
1187 biasInputLayer->GetOutputSlot(0).SetTensorInfo(biasesInfo);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001188 fullyConnectedLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1189
1190 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001191 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001192
Matthew Sloyan81beae32021-07-13 19:46:11 +01001193 FullyConnectedLayerVerifier verifier(layerName, {inputInfo, weightsInfo, biasesInfo}, {outputInfo}, descriptor);
Finn Williamsb454c5c2021-02-09 15:56:23 +00001194 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001195}
1196
Matthew Sloyan81beae32021-07-13 19:46:11 +01001197TEST_CASE("SerializeFullyConnectedWeightsAndBiasesAsInputs")
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001198{
1199 const std::string layerName("fullyConnected_weights_as_inputs");
1200 const armnn::TensorInfo inputInfo ({ 2, 5, 1, 1 }, armnn::DataType::Float32);
1201 const armnn::TensorInfo outputInfo({ 2, 3 }, armnn::DataType::Float32);
1202
1203 const armnn::TensorInfo weightsInfo({ 5, 3 }, armnn::DataType::Float32);
1204 const armnn::TensorInfo biasesInfo ({ 3 }, armnn::DataType::Float32);
1205
1206 armnn::Optional<armnn::ConstTensor> weights = armnn::EmptyOptional();
1207 armnn::Optional<armnn::ConstTensor> bias = armnn::EmptyOptional();
1208
1209 armnn::FullyConnectedDescriptor descriptor;
1210 descriptor.m_BiasEnabled = true;
1211 descriptor.m_TransposeWeightMatrix = false;
1212 descriptor.m_ConstantWeights = false;
1213
1214 armnn::INetworkPtr network = armnn::INetwork::Create();
1215 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1216 armnn::IConnectableLayer* const weightsInputLayer = network->AddInputLayer(1);
1217 armnn::IConnectableLayer* const biasInputLayer = network->AddInputLayer(2);
1218 armnn::IConnectableLayer* const fullyConnectedLayer =
1219 network->AddFullyConnectedLayer(descriptor,
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001220 layerName.c_str());
1221 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1222
1223 inputLayer->GetOutputSlot(0).Connect(fullyConnectedLayer->GetInputSlot(0));
1224 weightsInputLayer->GetOutputSlot(0).Connect(fullyConnectedLayer->GetInputSlot(1));
1225 biasInputLayer->GetOutputSlot(0).Connect(fullyConnectedLayer->GetInputSlot(2));
1226 fullyConnectedLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1227
1228 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
1229 weightsInputLayer->GetOutputSlot(0).SetTensorInfo(weightsInfo);
1230 biasInputLayer->GetOutputSlot(0).SetTensorInfo(biasesInfo);
1231 fullyConnectedLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1232
1233 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001234 CHECK(deserializedNetwork);
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001235
1236 const std::vector<armnn::ConstTensor> constants {};
1237 LayerVerifierBaseWithDescriptorAndConstants<armnn::FullyConnectedDescriptor> verifier(
1238 layerName, {inputInfo, weightsInfo, biasesInfo}, {outputInfo}, descriptor, constants);
1239 deserializedNetwork->ExecuteStrategy(verifier);
1240}
1241
Matthew Sloyan81beae32021-07-13 19:46:11 +01001242TEST_CASE("SerializeFullyConnectedWeightsAndBiasesAsConstantLayers")
1243{
1244 const std::string layerName("fullyConnected_weights_as_inputs");
1245 const armnn::TensorInfo inputInfo ({ 2, 5, 1, 1 }, armnn::DataType::Float32);
1246 const armnn::TensorInfo outputInfo({ 2, 3 }, armnn::DataType::Float32);
1247
Cathal Corbett5b8093c2021-10-22 11:12:07 +01001248 const armnn::TensorInfo weightsInfo({ 5, 3 }, armnn::DataType::Float32, 0.0f, 0, true);
1249 const armnn::TensorInfo biasesInfo ({ 3 }, armnn::DataType::Float32, 0.0f, 0, true);
Matthew Sloyan81beae32021-07-13 19:46:11 +01001250
1251 std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements());
1252 std::vector<float> biasesData = GenerateRandomData<float>(biasesInfo.GetNumElements());
1253 armnn::ConstTensor weights(weightsInfo, weightsData);
1254 armnn::ConstTensor biases(biasesInfo, biasesData);
1255
1256 armnn::FullyConnectedDescriptor descriptor;
1257 descriptor.m_BiasEnabled = true;
1258 descriptor.m_TransposeWeightMatrix = false;
1259 descriptor.m_ConstantWeights = true;
1260
1261 armnn::INetworkPtr network = armnn::INetwork::Create();
1262 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1263 armnn::IConnectableLayer* const weightsLayer = network->AddConstantLayer(weights, "Weights");
1264 armnn::IConnectableLayer* const biasesLayer = network->AddConstantLayer(biases, "Biases");
1265 armnn::IConnectableLayer* const fullyConnectedLayer = network->AddFullyConnectedLayer(descriptor,layerName.c_str());
1266 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1267
1268 inputLayer->GetOutputSlot(0).Connect(fullyConnectedLayer->GetInputSlot(0));
1269 weightsLayer->GetOutputSlot(0).Connect(fullyConnectedLayer->GetInputSlot(1));
1270 biasesLayer->GetOutputSlot(0).Connect(fullyConnectedLayer->GetInputSlot(2));
1271 fullyConnectedLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1272
1273 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
1274 weightsLayer->GetOutputSlot(0).SetTensorInfo(weightsInfo);
1275 biasesLayer->GetOutputSlot(0).SetTensorInfo(biasesInfo);
1276 fullyConnectedLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1277
1278 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
1279 CHECK(deserializedNetwork);
1280
1281 FullyConnectedLayerVerifier verifier(layerName, {inputInfo, weightsInfo, biasesInfo}, {outputInfo}, descriptor);
1282 deserializedNetwork->ExecuteStrategy(verifier);
1283}
1284
Sadik Armagan1625efc2021-06-10 18:24:34 +01001285TEST_CASE("SerializeGather")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001286{
Teresa Charlin52664732020-06-29 16:27:03 +01001287 using GatherDescriptor = armnn::GatherDescriptor;
1288 class GatherLayerVerifier : public LayerVerifierBaseWithDescriptor<GatherDescriptor>
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001289 {
1290 public:
1291 GatherLayerVerifier(const std::string& layerName,
1292 const std::vector<armnn::TensorInfo>& inputInfos,
Teresa Charlin52664732020-06-29 16:27:03 +01001293 const std::vector<armnn::TensorInfo>& outputInfos,
1294 const GatherDescriptor& descriptor)
1295 : LayerVerifierBaseWithDescriptor<GatherDescriptor>(layerName, inputInfos, outputInfos, descriptor) {}
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001296
Finn Williamsb454c5c2021-02-09 15:56:23 +00001297 void ExecuteStrategy(const armnn::IConnectableLayer* layer,
1298 const armnn::BaseDescriptor& descriptor,
1299 const std::vector<armnn::ConstTensor>& constants,
1300 const char* name,
1301 const armnn::LayerBindingId id = 0) override
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001302 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001303 armnn::IgnoreUnused(constants, id);
1304 switch (layer->GetType())
1305 {
1306 case armnn::LayerType::Input: break;
1307 case armnn::LayerType::Output: break;
1308 case armnn::LayerType::Constant: break;
1309 default:
1310 {
1311 VerifyNameAndConnections(layer, name);
1312 const GatherDescriptor& layerDescriptor = static_cast<const GatherDescriptor&>(descriptor);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001313 CHECK(layerDescriptor.m_Axis == m_Descriptor.m_Axis);
Finn Williamsb454c5c2021-02-09 15:56:23 +00001314 }
1315 }
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001316 }
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001317 };
1318
1319 const std::string layerName("gather");
Derek Lambertif90c56d2020-01-10 17:14:08 +00001320 armnn::TensorInfo paramsInfo({ 8 }, armnn::DataType::QAsymmU8);
1321 armnn::TensorInfo outputInfo({ 3 }, armnn::DataType::QAsymmU8);
Cathal Corbett5b8093c2021-10-22 11:12:07 +01001322 const armnn::TensorInfo indicesInfo({ 3 }, armnn::DataType::Signed32, 0.0f, 0, true);
Teresa Charlin52664732020-06-29 16:27:03 +01001323 GatherDescriptor descriptor;
1324 descriptor.m_Axis = 1;
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001325
1326 paramsInfo.SetQuantizationScale(1.0f);
1327 paramsInfo.SetQuantizationOffset(0);
1328 outputInfo.SetQuantizationScale(1.0f);
1329 outputInfo.SetQuantizationOffset(0);
1330
1331 const std::vector<int32_t>& indicesData = {7, 6, 5};
1332
1333 armnn::INetworkPtr network = armnn::INetwork::Create();
1334 armnn::IConnectableLayer *const inputLayer = network->AddInputLayer(0);
1335 armnn::IConnectableLayer *const constantLayer =
1336 network->AddConstantLayer(armnn::ConstTensor(indicesInfo, indicesData));
Teresa Charlin52664732020-06-29 16:27:03 +01001337 armnn::IConnectableLayer *const gatherLayer = network->AddGatherLayer(descriptor, layerName.c_str());
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001338 armnn::IConnectableLayer *const outputLayer = network->AddOutputLayer(0);
1339
1340 inputLayer->GetOutputSlot(0).Connect(gatherLayer->GetInputSlot(0));
1341 constantLayer->GetOutputSlot(0).Connect(gatherLayer->GetInputSlot(1));
1342 gatherLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1343
1344 inputLayer->GetOutputSlot(0).SetTensorInfo(paramsInfo);
1345 constantLayer->GetOutputSlot(0).SetTensorInfo(indicesInfo);
1346 gatherLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1347
1348 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001349 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001350
Teresa Charlin52664732020-06-29 16:27:03 +01001351 GatherLayerVerifier verifier(layerName, {paramsInfo, indicesInfo}, {outputInfo}, descriptor);
Finn Williamsb454c5c2021-02-09 15:56:23 +00001352 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001353}
1354
Teresa Charlin6966bfa2022-04-25 17:14:50 +01001355TEST_CASE("SerializeGatherNd")
1356{
1357 class GatherNdLayerVerifier : public LayerVerifierBase
1358 {
1359 public:
1360 GatherNdLayerVerifier(const std::string& layerName,
1361 const std::vector<armnn::TensorInfo>& inputInfos,
1362 const std::vector<armnn::TensorInfo>& outputInfos)
1363 : LayerVerifierBase(layerName, inputInfos, outputInfos) {}
1364
1365 void ExecuteStrategy(const armnn::IConnectableLayer* layer,
Mike Kelly51b8c312022-05-24 11:34:02 +01001366 const armnn::BaseDescriptor&,
Teresa Charlin6966bfa2022-04-25 17:14:50 +01001367 const std::vector<armnn::ConstTensor>& constants,
1368 const char* name,
1369 const armnn::LayerBindingId id = 0) override
1370 {
1371 armnn::IgnoreUnused(constants, id);
1372 switch (layer->GetType())
1373 {
1374 case armnn::LayerType::Input:
1375 case armnn::LayerType::Output:
1376 case armnn::LayerType::Constant:
1377 break;
1378 default:
1379 {
1380 VerifyNameAndConnections(layer, name);
1381 }
1382 }
1383 }
1384 };
1385
1386 const std::string layerName("gatherNd");
1387 armnn::TensorInfo paramsInfo({ 6, 3 }, armnn::DataType::QAsymmU8);
1388 armnn::TensorInfo outputInfo({ 3, 3 }, armnn::DataType::QAsymmU8);
1389 const armnn::TensorInfo indicesInfo({ 3, 1 }, armnn::DataType::Signed32, 0.0f, 0, true);
1390
1391 paramsInfo.SetQuantizationScale(1.0f);
1392 paramsInfo.SetQuantizationOffset(0);
1393 outputInfo.SetQuantizationScale(1.0f);
1394 outputInfo.SetQuantizationOffset(0);
1395
1396 const std::vector<int32_t>& indicesData = {5, 1, 0};
1397
1398 armnn::INetworkPtr network = armnn::INetwork::Create();
1399 armnn::IConnectableLayer *const inputLayer = network->AddInputLayer(0);
1400 armnn::IConnectableLayer *const constantLayer =
1401 network->AddConstantLayer(armnn::ConstTensor(indicesInfo, indicesData));
1402 armnn::IConnectableLayer *const gatherNdLayer = network->AddGatherNdLayer(layerName.c_str());
1403 armnn::IConnectableLayer *const outputLayer = network->AddOutputLayer(0);
1404
1405 inputLayer->GetOutputSlot(0).Connect(gatherNdLayer->GetInputSlot(0));
1406 constantLayer->GetOutputSlot(0).Connect(gatherNdLayer->GetInputSlot(1));
1407 gatherNdLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1408
1409 inputLayer->GetOutputSlot(0).SetTensorInfo(paramsInfo);
1410 constantLayer->GetOutputSlot(0).SetTensorInfo(indicesInfo);
1411 gatherNdLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1412
1413 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
1414 CHECK(deserializedNetwork);
1415
1416 GatherNdLayerVerifier verifier(layerName, {paramsInfo, indicesInfo}, {outputInfo});
1417 deserializedNetwork->ExecuteStrategy(verifier);
1418}
Aron Virginas-Tar6d2e6592019-10-22 11:44:47 +01001419
Jan Eilers1b2654f2021-09-24 15:45:46 +01001420TEST_CASE("SerializeComparisonGreater")
Aron Virginas-Tar781ced92019-10-03 11:15:39 +01001421{
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01001422 const std::string layerName("greater");
1423
1424 const armnn::TensorShape shape{2, 1, 2, 4};
1425
1426 const armnn::TensorInfo inputInfo = armnn::TensorInfo(shape, armnn::DataType::Float32);
1427 const armnn::TensorInfo outputInfo = armnn::TensorInfo(shape, armnn::DataType::Boolean);
1428
1429 armnn::INetworkPtr network = armnn::INetwork::Create();
1430 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
1431 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
Jan Eilers1b2654f2021-09-24 15:45:46 +01001432 armnn::ComparisonDescriptor greaterDescriptor(armnn::ComparisonOperation::Greater);
1433 armnn::IConnectableLayer* const equalLayer = network->AddComparisonLayer(greaterDescriptor, layerName.c_str());
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01001434 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1435
1436 inputLayer0->GetOutputSlot(0).Connect(equalLayer->GetInputSlot(0));
1437 inputLayer1->GetOutputSlot(0).Connect(equalLayer->GetInputSlot(1));
1438 equalLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1439
1440 inputLayer0->GetOutputSlot(0).SetTensorInfo(inputInfo);
1441 inputLayer1->GetOutputSlot(0).SetTensorInfo(inputInfo);
1442 equalLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1443
1444 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001445 CHECK(deserializedNetwork);
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01001446
Finn Williamsb454c5c2021-02-09 15:56:23 +00001447 LayerVerifierBase verifier(layerName, { inputInfo, inputInfo }, { outputInfo });
1448 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01001449}
1450
Aron Virginas-Tar6d2e6592019-10-22 11:44:47 +01001451
Sadik Armagan1625efc2021-06-10 18:24:34 +01001452TEST_CASE("SerializeInstanceNormalization")
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01001453{
Aron Virginas-Tar781ced92019-10-03 11:15:39 +01001454 const std::string layerName("instanceNormalization");
1455 const armnn::TensorInfo info({ 1, 2, 1, 5 }, armnn::DataType::Float32);
1456
1457 armnn::InstanceNormalizationDescriptor descriptor;
1458 descriptor.m_Gamma = 1.1f;
1459 descriptor.m_Beta = 0.1f;
1460 descriptor.m_Eps = 0.0001f;
1461 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
1462
1463 armnn::INetworkPtr network = armnn::INetwork::Create();
1464 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1465 armnn::IConnectableLayer* const instanceNormLayer =
1466 network->AddInstanceNormalizationLayer(descriptor, layerName.c_str());
1467 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1468
1469 inputLayer->GetOutputSlot(0).Connect(instanceNormLayer->GetInputSlot(0));
1470 instanceNormLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1471
1472 inputLayer->GetOutputSlot(0).SetTensorInfo(info);
1473 instanceNormLayer->GetOutputSlot(0).SetTensorInfo(info);
1474
1475 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001476 CHECK(deserializedNetwork);
Aron Virginas-Tar781ced92019-10-03 11:15:39 +01001477
Finn Williamsb454c5c2021-02-09 15:56:23 +00001478 LayerVerifierBaseWithDescriptor<armnn::InstanceNormalizationDescriptor> verifier(
1479 layerName, {info}, {info}, descriptor);
1480 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tar781ced92019-10-03 11:15:39 +01001481}
1482
Sadik Armagan1625efc2021-06-10 18:24:34 +01001483TEST_CASE("SerializeL2Normalization")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001484{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001485 const std::string l2NormLayerName("l2Normalization");
1486 const armnn::TensorInfo info({1, 2, 1, 5}, armnn::DataType::Float32);
1487
1488 armnn::L2NormalizationDescriptor desc;
1489 desc.m_DataLayout = armnn::DataLayout::NCHW;
Ferran Balaguer0dcffec2019-06-18 16:25:06 +01001490 desc.m_Eps = 0.0001f;
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001491
1492 armnn::INetworkPtr network = armnn::INetwork::Create();
1493 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
1494 armnn::IConnectableLayer* const l2NormLayer = network->AddL2NormalizationLayer(desc, l2NormLayerName.c_str());
1495 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1496
1497 inputLayer0->GetOutputSlot(0).Connect(l2NormLayer->GetInputSlot(0));
1498 l2NormLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1499
1500 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
1501 l2NormLayer->GetOutputSlot(0).SetTensorInfo(info);
1502
1503 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001504 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001505
Finn Williamsb454c5c2021-02-09 15:56:23 +00001506 LayerVerifierBaseWithDescriptor<armnn::L2NormalizationDescriptor> verifier(
1507 l2NormLayerName, {info}, {info}, desc);
1508 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001509}
1510
Sadik Armagan1625efc2021-06-10 18:24:34 +01001511TEST_CASE("EnsureL2NormalizationBackwardCompatibility")
Ferran Balaguer0dcffec2019-06-18 16:25:06 +01001512{
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001513 // The hex data below is a flat buffer containing a simple network with one input
Ferran Balaguer0dcffec2019-06-18 16:25:06 +01001514 // a L2Normalization layer and an output layer with dimensions as per the tensor infos below.
1515 //
1516 // This test verifies that we can still read back these old style
1517 // models without the normalization epsilon value.
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001518 const std::vector<uint8_t> l2NormalizationModel =
Ferran Balaguer0dcffec2019-06-18 16:25:06 +01001519 {
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001520 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x0A, 0x00,
1521 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
1522 0x3C, 0x01, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
1523 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xE8, 0xFE, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x0B,
1524 0x04, 0x00, 0x00, 0x00, 0xD6, 0xFE, 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x08, 0x00,
1525 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x9E, 0xFF, 0xFF, 0xFF, 0x02, 0x00, 0x00, 0x00,
1526 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00,
1527 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1528 0x4C, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
1529 0x00, 0x20, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00,
1530 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
1531 0x0E, 0x00, 0x18, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x14, 0x00, 0x0E, 0x00, 0x00, 0x00,
1532 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x20, 0x00,
1533 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x6C, 0x32, 0x4E, 0x6F, 0x72, 0x6D, 0x61, 0x6C, 0x69, 0x7A, 0x61, 0x74,
1534 0x69, 0x6F, 0x6E, 0x00, 0x01, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00,
1535 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
1536 0x52, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00,
1537 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
1538 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1539 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x07, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09,
1540 0x04, 0x00, 0x00, 0x00, 0xF6, 0xFF, 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0A, 0x00,
1541 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x00, 0x00,
1542 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00,
1543 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1544 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0A, 0x00, 0x00, 0x00,
1545 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x08, 0x00,
1546 0x07, 0x00, 0x0C, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
1547 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
1548 0x05, 0x00, 0x00, 0x00, 0x00
1549 };
1550
1551 armnn::INetworkPtr deserializedNetwork =
1552 DeserializeNetwork(std::string(l2NormalizationModel.begin(), l2NormalizationModel.end()));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001553 CHECK(deserializedNetwork);
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001554
Ferran Balaguer0dcffec2019-06-18 16:25:06 +01001555 const std::string layerName("l2Normalization");
1556 const armnn::TensorInfo inputInfo = armnn::TensorInfo({1, 2, 1, 5}, armnn::DataType::Float32);
1557
1558 armnn::L2NormalizationDescriptor desc;
1559 desc.m_DataLayout = armnn::DataLayout::NCHW;
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001560 // Since this variable does not exist in the l2NormalizationModel dump, the default value will be loaded
Ferran Balaguer0dcffec2019-06-18 16:25:06 +01001561 desc.m_Eps = 1e-12f;
1562
Finn Williamsb454c5c2021-02-09 15:56:23 +00001563 LayerVerifierBaseWithDescriptor<armnn::L2NormalizationDescriptor> verifier(
1564 layerName, {inputInfo}, {inputInfo}, desc);
1565 deserializedNetwork->ExecuteStrategy(verifier);
Ferran Balaguer0dcffec2019-06-18 16:25:06 +01001566}
1567
Sadik Armagan1625efc2021-06-10 18:24:34 +01001568TEST_CASE("SerializeLogicalBinary")
James Conroyaba90cd2020-11-06 16:28:18 +00001569{
James Conroyaba90cd2020-11-06 16:28:18 +00001570 const std::string layerName("logicalBinaryAnd");
1571
1572 const armnn::TensorShape shape{2, 1, 2, 2};
1573
1574 const armnn::TensorInfo inputInfo = armnn::TensorInfo(shape, armnn::DataType::Boolean);
1575 const armnn::TensorInfo outputInfo = armnn::TensorInfo(shape, armnn::DataType::Boolean);
1576
1577 armnn::LogicalBinaryDescriptor descriptor(armnn::LogicalBinaryOperation::LogicalAnd);
1578
1579 armnn::INetworkPtr network = armnn::INetwork::Create();
1580 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
1581 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
1582 armnn::IConnectableLayer* const logicalBinaryLayer = network->AddLogicalBinaryLayer(descriptor, layerName.c_str());
1583 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1584
1585 inputLayer0->GetOutputSlot(0).Connect(logicalBinaryLayer->GetInputSlot(0));
1586 inputLayer1->GetOutputSlot(0).Connect(logicalBinaryLayer->GetInputSlot(1));
1587 logicalBinaryLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1588
1589 inputLayer0->GetOutputSlot(0).SetTensorInfo(inputInfo);
1590 inputLayer1->GetOutputSlot(0).SetTensorInfo(inputInfo);
1591 logicalBinaryLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1592
1593 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001594 CHECK(deserializedNetwork);
James Conroyaba90cd2020-11-06 16:28:18 +00001595
Finn Williamsb454c5c2021-02-09 15:56:23 +00001596 LayerVerifierBaseWithDescriptor<armnn::LogicalBinaryDescriptor> verifier(
1597 layerName, { inputInfo, inputInfo }, { outputInfo }, descriptor);
1598 deserializedNetwork->ExecuteStrategy(verifier);
James Conroyaba90cd2020-11-06 16:28:18 +00001599}
1600
Sadik Armagan1625efc2021-06-10 18:24:34 +01001601TEST_CASE("SerializeLogSoftmax")
Sadik Armagan26257852019-10-14 13:00:47 +01001602{
Sadik Armagan26257852019-10-14 13:00:47 +01001603 const std::string layerName("log_softmax");
1604 const armnn::TensorInfo info({1, 10}, armnn::DataType::Float32);
1605
1606 armnn::LogSoftmaxDescriptor descriptor;
1607 descriptor.m_Beta = 1.0f;
1608 descriptor.m_Axis = -1;
1609
1610 armnn::INetworkPtr network = armnn::INetwork::Create();
1611 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1612 armnn::IConnectableLayer* const logSoftmaxLayer = network->AddLogSoftmaxLayer(descriptor, layerName.c_str());
1613 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1614
1615 inputLayer->GetOutputSlot(0).Connect(logSoftmaxLayer->GetInputSlot(0));
1616 logSoftmaxLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1617
1618 inputLayer->GetOutputSlot(0).SetTensorInfo(info);
1619 logSoftmaxLayer->GetOutputSlot(0).SetTensorInfo(info);
1620
1621 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001622 CHECK(deserializedNetwork);
Sadik Armagan26257852019-10-14 13:00:47 +01001623
Finn Williamsb454c5c2021-02-09 15:56:23 +00001624 LayerVerifierBaseWithDescriptor<armnn::LogSoftmaxDescriptor> verifier(layerName, {info}, {info}, descriptor);
1625 deserializedNetwork->ExecuteStrategy(verifier);
Sadik Armagan26257852019-10-14 13:00:47 +01001626}
1627
Sadik Armagan1625efc2021-06-10 18:24:34 +01001628TEST_CASE("SerializeMaximum")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001629{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001630 const std::string layerName("maximum");
1631 const armnn::TensorInfo info({ 1, 2, 2, 3 }, armnn::DataType::Float32);
1632
1633 armnn::INetworkPtr network = armnn::INetwork::Create();
1634 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
1635 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
Mike Kelly52e90bf2023-03-15 15:06:23 +00001636 ARMNN_NO_DEPRECATE_WARN_BEGIN
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001637 armnn::IConnectableLayer* const maximumLayer = network->AddMaximumLayer(layerName.c_str());
Mike Kelly52e90bf2023-03-15 15:06:23 +00001638 ARMNN_NO_DEPRECATE_WARN_END
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001639 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1640
1641 inputLayer0->GetOutputSlot(0).Connect(maximumLayer->GetInputSlot(0));
1642 inputLayer1->GetOutputSlot(0).Connect(maximumLayer->GetInputSlot(1));
1643 maximumLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1644
1645 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
1646 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
1647 maximumLayer->GetOutputSlot(0).SetTensorInfo(info);
1648
1649 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001650 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001651
Finn Williamsb454c5c2021-02-09 15:56:23 +00001652 LayerVerifierBase verifier(layerName, {info, info}, {info});
1653 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001654}
1655
Sadik Armagan1625efc2021-06-10 18:24:34 +01001656TEST_CASE("SerializeMean")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001657{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001658 const std::string layerName("mean");
1659 const armnn::TensorInfo inputInfo({1, 1, 3, 2}, armnn::DataType::Float32);
1660 const armnn::TensorInfo outputInfo({1, 1, 1, 2}, armnn::DataType::Float32);
1661
1662 armnn::MeanDescriptor descriptor;
1663 descriptor.m_Axis = { 2 };
1664 descriptor.m_KeepDims = true;
1665
1666 armnn::INetworkPtr network = armnn::INetwork::Create();
1667 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1668 armnn::IConnectableLayer* const meanLayer = network->AddMeanLayer(descriptor, layerName.c_str());
1669 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1670
1671 inputLayer->GetOutputSlot(0).Connect(meanLayer->GetInputSlot(0));
1672 meanLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1673
1674 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
1675 meanLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1676
1677 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001678 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001679
Finn Williamsb454c5c2021-02-09 15:56:23 +00001680 LayerVerifierBaseWithDescriptor<armnn::MeanDescriptor> verifier(layerName, {inputInfo}, {outputInfo}, descriptor);
1681 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001682}
1683
Sadik Armagan1625efc2021-06-10 18:24:34 +01001684TEST_CASE("SerializeMerge")
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +01001685{
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +01001686 const std::string layerName("merge");
1687 const armnn::TensorInfo info({ 1, 2, 2, 3 }, armnn::DataType::Float32);
1688
1689 armnn::INetworkPtr network = armnn::INetwork::Create();
1690 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
1691 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
1692 armnn::IConnectableLayer* const mergeLayer = network->AddMergeLayer(layerName.c_str());
1693 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1694
1695 inputLayer0->GetOutputSlot(0).Connect(mergeLayer->GetInputSlot(0));
1696 inputLayer1->GetOutputSlot(0).Connect(mergeLayer->GetInputSlot(1));
1697 mergeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1698
1699 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
1700 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
1701 mergeLayer->GetOutputSlot(0).SetTensorInfo(info);
1702
1703 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001704 CHECK(deserializedNetwork);
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +01001705
Finn Williamsb454c5c2021-02-09 15:56:23 +00001706 LayerVerifierBase verifier(layerName, {info, info}, {info});
1707 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +01001708}
1709
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01001710class MergerLayerVerifier : public LayerVerifierBaseWithDescriptor<armnn::OriginsDescriptor>
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001711{
Jim Flynn5fa83932019-05-09 15:35:43 +01001712public:
1713 MergerLayerVerifier(const std::string& layerName,
1714 const std::vector<armnn::TensorInfo>& inputInfos,
1715 const std::vector<armnn::TensorInfo>& outputInfos,
1716 const armnn::OriginsDescriptor& descriptor)
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01001717 : LayerVerifierBaseWithDescriptor<armnn::OriginsDescriptor>(layerName, inputInfos, outputInfos, descriptor) {}
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001718
Finn Williamsb454c5c2021-02-09 15:56:23 +00001719 void ExecuteStrategy(const armnn::IConnectableLayer* layer,
1720 const armnn::BaseDescriptor& descriptor,
1721 const std::vector<armnn::ConstTensor>& constants,
1722 const char* name,
1723 const armnn::LayerBindingId id = 0) override
Jim Flynn5fa83932019-05-09 15:35:43 +01001724 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001725 armnn::IgnoreUnused(descriptor, constants, id);
1726 switch (layer->GetType())
1727 {
1728 case armnn::LayerType::Input: break;
1729 case armnn::LayerType::Output: break;
1730 case armnn::LayerType::Merge:
1731 {
1732 throw armnn::Exception("MergerLayer should have translated to ConcatLayer");
1733 break;
1734 }
1735 case armnn::LayerType::Concat:
1736 {
1737 VerifyNameAndConnections(layer, name);
1738 const armnn::MergerDescriptor& layerDescriptor =
1739 static_cast<const armnn::MergerDescriptor&>(descriptor);
1740 VerifyDescriptor(layerDescriptor);
1741 break;
1742 }
1743 default:
1744 {
1745 throw armnn::Exception("Unexpected layer type in Merge test model");
1746 }
1747 }
Jim Flynn5fa83932019-05-09 15:35:43 +01001748 }
Jim Flynn5fa83932019-05-09 15:35:43 +01001749};
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001750
Sadik Armagan1625efc2021-06-10 18:24:34 +01001751TEST_CASE("EnsureMergerLayerBackwardCompatibility")
Jim Flynn5fa83932019-05-09 15:35:43 +01001752{
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001753 // The hex data below is a flat buffer containing a simple network with two inputs
Jim Flynne242f2d2019-05-22 14:24:13 +01001754 // a merger layer (now deprecated) and an output layer with dimensions as per the tensor infos below.
1755 //
1756 // This test verifies that we can still read back these old style
Jim Flynn5fa83932019-05-09 15:35:43 +01001757 // models replacing the MergerLayers with ConcatLayers with the same parameters.
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001758 const std::vector<uint8_t> mergerModel =
Jim Flynn5fa83932019-05-09 15:35:43 +01001759 {
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001760 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x0A, 0x00,
1761 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
1762 0x38, 0x02, 0x00, 0x00, 0x8C, 0x01, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x02, 0x00,
1763 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
1764 0xF4, 0xFD, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x0B, 0x04, 0x00, 0x00, 0x00, 0x92, 0xFE, 0xFF, 0xFF, 0x04, 0x00,
1765 0x00, 0x00, 0x9A, 0xFE, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x7E, 0xFE, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00,
1766 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00,
1767 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1768 0xF8, 0xFE, 0xFF, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0xFE, 0xFF, 0xFF, 0x00, 0x00,
1769 0x00, 0x1F, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00,
1770 0x68, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00,
1771 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
1772 0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x22, 0xFF, 0xFF, 0xFF, 0x04, 0x00,
1773 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1774 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
1775 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFF, 0xFF, 0xFF,
1776 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x1C, 0x00,
1777 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x6D, 0x65, 0x72, 0x67, 0x65, 0x72, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
1778 0x5C, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x34, 0xFF,
1779 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x92, 0xFE, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00,
1780 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00,
1781 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00,
1782 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00,
1783 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0E, 0x00,
1784 0x07, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00,
1785 0x06, 0x00, 0x08, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0E, 0x00,
1786 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
1787 0x0E, 0x00, 0x18, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x14, 0x00, 0x0E, 0x00, 0x00, 0x00,
1788 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00,
1789 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
1790 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00,
1791 0x00, 0x00, 0x66, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1792 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00,
1793 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x07, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09,
1794 0x04, 0x00, 0x00, 0x00, 0xF6, 0xFF, 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0A, 0x00,
1795 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x00, 0x00,
1796 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00,
1797 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1798 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0A, 0x00, 0x00, 0x00,
1799 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x08, 0x00,
1800 0x07, 0x00, 0x0C, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
1801 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
1802 0x02, 0x00, 0x00, 0x00
1803 };
1804
1805 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(std::string(mergerModel.begin(), mergerModel.end()));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001806 CHECK(deserializedNetwork);
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001807
1808 const armnn::TensorInfo inputInfo = armnn::TensorInfo({ 2, 3, 2, 2 }, armnn::DataType::Float32);
1809 const armnn::TensorInfo outputInfo = armnn::TensorInfo({ 4, 3, 2, 2 }, armnn::DataType::Float32);
Jim Flynn5fa83932019-05-09 15:35:43 +01001810
1811 const std::vector<armnn::TensorShape> shapes({inputInfo.GetShape(), inputInfo.GetShape()});
1812
1813 armnn::OriginsDescriptor descriptor =
Jim Flynn825af452019-05-20 12:49:28 +01001814 armnn::CreateDescriptorForConcatenation(shapes.begin(), shapes.end(), 0);
Jim Flynn5fa83932019-05-09 15:35:43 +01001815
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001816 MergerLayerVerifier verifier("merger", { inputInfo, inputInfo }, { outputInfo }, descriptor);
Finn Williamsb454c5c2021-02-09 15:56:23 +00001817 deserializedNetwork->ExecuteStrategy(verifier);
Jim Flynn5fa83932019-05-09 15:35:43 +01001818}
1819
Sadik Armagan1625efc2021-06-10 18:24:34 +01001820TEST_CASE("SerializeConcat")
Jim Flynne242f2d2019-05-22 14:24:13 +01001821{
1822 const std::string layerName("concat");
1823 const armnn::TensorInfo inputInfo = armnn::TensorInfo({2, 3, 2, 2}, armnn::DataType::Float32);
1824 const armnn::TensorInfo outputInfo = armnn::TensorInfo({4, 3, 2, 2}, armnn::DataType::Float32);
1825
1826 const std::vector<armnn::TensorShape> shapes({inputInfo.GetShape(), inputInfo.GetShape()});
1827
1828 armnn::OriginsDescriptor descriptor =
1829 armnn::CreateDescriptorForConcatenation(shapes.begin(), shapes.end(), 0);
1830
1831 armnn::INetworkPtr network = armnn::INetwork::Create();
1832 armnn::IConnectableLayer* const inputLayerOne = network->AddInputLayer(0);
1833 armnn::IConnectableLayer* const inputLayerTwo = network->AddInputLayer(1);
1834 armnn::IConnectableLayer* const concatLayer = network->AddConcatLayer(descriptor, layerName.c_str());
1835 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1836
1837 inputLayerOne->GetOutputSlot(0).Connect(concatLayer->GetInputSlot(0));
1838 inputLayerTwo->GetOutputSlot(0).Connect(concatLayer->GetInputSlot(1));
1839 concatLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1840
1841 inputLayerOne->GetOutputSlot(0).SetTensorInfo(inputInfo);
1842 inputLayerTwo->GetOutputSlot(0).SetTensorInfo(inputInfo);
1843 concatLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1844
1845 std::string concatLayerNetwork = SerializeNetwork(*network);
1846 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(concatLayerNetwork);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001847 CHECK(deserializedNetwork);
Jim Flynne242f2d2019-05-22 14:24:13 +01001848
1849 // NOTE: using the MergerLayerVerifier to ensure that it is a concat layer and not a
1850 // merger layer that gets placed into the graph.
1851 MergerLayerVerifier verifier(layerName, {inputInfo, inputInfo}, {outputInfo}, descriptor);
Finn Williamsb454c5c2021-02-09 15:56:23 +00001852 deserializedNetwork->ExecuteStrategy(verifier);
Jim Flynne242f2d2019-05-22 14:24:13 +01001853}
1854
Sadik Armagan1625efc2021-06-10 18:24:34 +01001855TEST_CASE("SerializeMinimum")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001856{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001857 const std::string layerName("minimum");
1858 const armnn::TensorInfo info({ 1, 2, 2, 3 }, armnn::DataType::Float32);
1859
1860 armnn::INetworkPtr network = armnn::INetwork::Create();
1861 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
1862 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
Mike Kelly52e90bf2023-03-15 15:06:23 +00001863 ARMNN_NO_DEPRECATE_WARN_BEGIN
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001864 armnn::IConnectableLayer* const minimumLayer = network->AddMinimumLayer(layerName.c_str());
Mike Kelly52e90bf2023-03-15 15:06:23 +00001865 ARMNN_NO_DEPRECATE_WARN_END
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001866 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1867
1868 inputLayer0->GetOutputSlot(0).Connect(minimumLayer->GetInputSlot(0));
1869 inputLayer1->GetOutputSlot(0).Connect(minimumLayer->GetInputSlot(1));
1870 minimumLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1871
1872 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
1873 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
1874 minimumLayer->GetOutputSlot(0).SetTensorInfo(info);
1875
1876 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001877 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001878
Finn Williamsb454c5c2021-02-09 15:56:23 +00001879 LayerVerifierBase verifier(layerName, {info, info}, {info});
1880 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001881}
1882
Sadik Armagan1625efc2021-06-10 18:24:34 +01001883TEST_CASE("SerializeMultiplication")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001884{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001885 const std::string layerName("multiplication");
1886 const armnn::TensorInfo info({ 1, 5, 2, 3 }, armnn::DataType::Float32);
1887
1888 armnn::INetworkPtr network = armnn::INetwork::Create();
1889 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
1890 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
Mike Kelly52e90bf2023-03-15 15:06:23 +00001891 ARMNN_NO_DEPRECATE_WARN_BEGIN
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001892 armnn::IConnectableLayer* const multiplicationLayer = network->AddMultiplicationLayer(layerName.c_str());
Mike Kelly52e90bf2023-03-15 15:06:23 +00001893 ARMNN_NO_DEPRECATE_WARN_END
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001894 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1895
1896 inputLayer0->GetOutputSlot(0).Connect(multiplicationLayer->GetInputSlot(0));
1897 inputLayer1->GetOutputSlot(0).Connect(multiplicationLayer->GetInputSlot(1));
1898 multiplicationLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1899
1900 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
1901 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
1902 multiplicationLayer->GetOutputSlot(0).SetTensorInfo(info);
1903
1904 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001905 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001906
Finn Williamsb454c5c2021-02-09 15:56:23 +00001907 LayerVerifierBase verifier(layerName, {info, info}, {info});
1908 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001909}
1910
Sadik Armagan1625efc2021-06-10 18:24:34 +01001911TEST_CASE("SerializePrelu")
Ellen Norris-Thompson51982472019-06-19 11:46:21 +01001912{
Ellen Norris-Thompson51982472019-06-19 11:46:21 +01001913 const std::string layerName("prelu");
1914
1915 armnn::TensorInfo inputTensorInfo ({ 4, 1, 2 }, armnn::DataType::Float32);
1916 armnn::TensorInfo alphaTensorInfo ({ 5, 4, 3, 1 }, armnn::DataType::Float32);
1917 armnn::TensorInfo outputTensorInfo({ 5, 4, 3, 2 }, armnn::DataType::Float32);
1918
1919 armnn::INetworkPtr network = armnn::INetwork::Create();
1920 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1921 armnn::IConnectableLayer* const alphaLayer = network->AddInputLayer(1);
1922 armnn::IConnectableLayer* const preluLayer = network->AddPreluLayer(layerName.c_str());
1923 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1924
1925 inputLayer->GetOutputSlot(0).Connect(preluLayer->GetInputSlot(0));
1926 alphaLayer->GetOutputSlot(0).Connect(preluLayer->GetInputSlot(1));
1927 preluLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1928
1929 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
1930 alphaLayer->GetOutputSlot(0).SetTensorInfo(alphaTensorInfo);
1931 preluLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
1932
1933 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001934 CHECK(deserializedNetwork);
Ellen Norris-Thompson51982472019-06-19 11:46:21 +01001935
Finn Williamsb454c5c2021-02-09 15:56:23 +00001936 LayerVerifierBase verifier(layerName, {inputTensorInfo, alphaTensorInfo}, {outputTensorInfo});
1937 deserializedNetwork->ExecuteStrategy(verifier);
Ellen Norris-Thompson51982472019-06-19 11:46:21 +01001938}
1939
Sadik Armagan1625efc2021-06-10 18:24:34 +01001940TEST_CASE("SerializeNormalization")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001941{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001942 const std::string layerName("normalization");
1943 const armnn::TensorInfo info({2, 1, 2, 2}, armnn::DataType::Float32);
1944
1945 armnn::NormalizationDescriptor desc;
1946 desc.m_DataLayout = armnn::DataLayout::NCHW;
1947 desc.m_NormSize = 3;
1948 desc.m_Alpha = 1;
1949 desc.m_Beta = 1;
1950 desc.m_K = 1;
1951
1952 armnn::INetworkPtr network = armnn::INetwork::Create();
1953 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1954 armnn::IConnectableLayer* const normalizationLayer = network->AddNormalizationLayer(desc, layerName.c_str());
1955 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1956
1957 inputLayer->GetOutputSlot(0).Connect(normalizationLayer->GetInputSlot(0));
1958 normalizationLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1959
1960 inputLayer->GetOutputSlot(0).SetTensorInfo(info);
1961 normalizationLayer->GetOutputSlot(0).SetTensorInfo(info);
1962
1963 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001964 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001965
Finn Williamsb454c5c2021-02-09 15:56:23 +00001966 LayerVerifierBaseWithDescriptor<armnn::NormalizationDescriptor> verifier(layerName, {info}, {info}, desc);
1967 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001968}
1969
Sadik Armagan1625efc2021-06-10 18:24:34 +01001970TEST_CASE("SerializePad")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001971{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001972 const std::string layerName("pad");
1973 const armnn::TensorInfo inputTensorInfo = armnn::TensorInfo({1, 2, 3, 4}, armnn::DataType::Float32);
1974 const armnn::TensorInfo outputTensorInfo = armnn::TensorInfo({1, 3, 5, 7}, armnn::DataType::Float32);
1975
1976 armnn::PadDescriptor desc({{0, 0}, {1, 0}, {1, 1}, {1, 2}});
1977
1978 armnn::INetworkPtr network = armnn::INetwork::Create();
1979 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1980 armnn::IConnectableLayer* const padLayer = network->AddPadLayer(desc, layerName.c_str());
1981 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1982
1983 inputLayer->GetOutputSlot(0).Connect(padLayer->GetInputSlot(0));
1984 padLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1985
1986 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
1987 padLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
1988
1989 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001990 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001991
Finn Williamsb454c5c2021-02-09 15:56:23 +00001992 LayerVerifierBaseWithDescriptor<armnn::PadDescriptor> verifier(layerName,
1993 {inputTensorInfo},
1994 {outputTensorInfo},
1995 desc);
1996 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001997}
1998
Matthew Sloyan2e5d0b22021-10-21 14:05:31 +01001999TEST_CASE("SerializePadReflect")
2000{
2001 const std::string layerName("padReflect");
2002 const armnn::TensorInfo inputTensorInfo = armnn::TensorInfo({1, 2, 3, 4}, armnn::DataType::Float32);
2003 const armnn::TensorInfo outputTensorInfo = armnn::TensorInfo({1, 3, 5, 7}, armnn::DataType::Float32);
2004
2005 armnn::PadDescriptor desc({{0, 0}, {1, 0}, {1, 1}, {1, 2}});
2006 desc.m_PaddingMode = armnn::PaddingMode::Reflect;
2007
2008 armnn::INetworkPtr network = armnn::INetwork::Create();
2009 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2010 armnn::IConnectableLayer* const padLayer = network->AddPadLayer(desc, layerName.c_str());
2011 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2012
2013 inputLayer->GetOutputSlot(0).Connect(padLayer->GetInputSlot(0));
2014 padLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2015
2016 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
2017 padLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
2018
2019 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
2020 CHECK(deserializedNetwork);
2021
2022 LayerVerifierBaseWithDescriptor<armnn::PadDescriptor> verifier(layerName,
2023 {inputTensorInfo},
2024 {outputTensorInfo},
2025 desc);
2026 deserializedNetwork->ExecuteStrategy(verifier);
2027}
2028
Sadik Armagan1625efc2021-06-10 18:24:34 +01002029TEST_CASE("EnsurePadBackwardCompatibility")
Jim Flynn965c7c62019-06-24 14:32:41 +01002030{
2031 // The PadDescriptor is being extended with a float PadValue (so a value other than 0
2032 // can be used to pad the tensor.
2033 //
2034 // This test contains a binary representation of a simple input->pad->output network
2035 // prior to this change to test that the descriptor has been updated in a backward
2036 // compatible way with respect to Deserialization of older binary dumps
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01002037 const std::vector<uint8_t> padModel =
Jim Flynn965c7c62019-06-24 14:32:41 +01002038 {
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01002039 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x0A, 0x00,
2040 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
2041 0x54, 0x01, 0x00, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
2042 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xD0, 0xFE, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x0B,
2043 0x04, 0x00, 0x00, 0x00, 0x96, 0xFF, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x9E, 0xFF, 0xFF, 0xFF, 0x04, 0x00,
2044 0x00, 0x00, 0x72, 0xFF, 0xFF, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
2045 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
2046 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00,
2047 0x00, 0x00, 0x00, 0x00, 0x24, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x16, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00,
2048 0x0E, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00,
2049 0x00, 0x00, 0x06, 0x00, 0x08, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00,
2050 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2051 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
2052 0x0E, 0x00, 0x18, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x14, 0x00, 0x0E, 0x00, 0x00, 0x00,
2053 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00,
2054 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x70, 0x61, 0x64, 0x00, 0x01, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00,
2055 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00,
2056 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x52, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00,
2057 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00,
2058 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00,
2059 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x07, 0x00, 0x08, 0x00, 0x08, 0x00,
2060 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xF6, 0xFF, 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x00,
2061 0x00, 0x00, 0x06, 0x00, 0x0A, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00,
2062 0x0E, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x0E, 0x00, 0x00, 0x00,
2063 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
2064 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00,
2065 0x08, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
2066 0x0A, 0x00, 0x10, 0x00, 0x08, 0x00, 0x07, 0x00, 0x0C, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
2067 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00,
2068 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00
2069 };
2070
2071 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(std::string(padModel.begin(), padModel.end()));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002072 CHECK(deserializedNetwork);
Jim Flynn965c7c62019-06-24 14:32:41 +01002073
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01002074 const armnn::TensorInfo inputInfo = armnn::TensorInfo({ 1, 2, 3, 4 }, armnn::DataType::Float32);
2075 const armnn::TensorInfo outputInfo = armnn::TensorInfo({ 1, 3, 5, 7 }, armnn::DataType::Float32);
Jim Flynn965c7c62019-06-24 14:32:41 +01002076
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01002077 armnn::PadDescriptor descriptor({{ 0, 0 }, { 1, 0 }, { 1, 1 }, { 1, 2 }});
Jim Flynn965c7c62019-06-24 14:32:41 +01002078
Finn Williamsb454c5c2021-02-09 15:56:23 +00002079 LayerVerifierBaseWithDescriptor<armnn::PadDescriptor> verifier("pad", { inputInfo }, { outputInfo }, descriptor);
2080 deserializedNetwork->ExecuteStrategy(verifier);
Jim Flynn965c7c62019-06-24 14:32:41 +01002081}
2082
Sadik Armagan1625efc2021-06-10 18:24:34 +01002083TEST_CASE("SerializePermute")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002084{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002085 const std::string layerName("permute");
2086 const armnn::TensorInfo inputTensorInfo({4, 3, 2, 1}, armnn::DataType::Float32);
2087 const armnn::TensorInfo outputTensorInfo({1, 2, 3, 4}, armnn::DataType::Float32);
2088
2089 armnn::PermuteDescriptor descriptor(armnn::PermutationVector({3, 2, 1, 0}));
2090
2091 armnn::INetworkPtr network = armnn::INetwork::Create();
2092 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2093 armnn::IConnectableLayer* const permuteLayer = network->AddPermuteLayer(descriptor, layerName.c_str());
2094 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2095
2096 inputLayer->GetOutputSlot(0).Connect(permuteLayer->GetInputSlot(0));
2097 permuteLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2098
2099 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
2100 permuteLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
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::PermuteDescriptor> verifier(
2106 layerName, {inputTensorInfo}, {outputTensorInfo}, descriptor);
2107 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002108}
2109
Sadik Armagan1625efc2021-06-10 18:24:34 +01002110TEST_CASE("SerializePooling2d")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002111{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002112 const std::string layerName("pooling2d");
2113 const armnn::TensorInfo inputInfo({1, 2, 2, 1}, armnn::DataType::Float32);
2114 const armnn::TensorInfo outputInfo({1, 1, 1, 1}, armnn::DataType::Float32);
2115
2116 armnn::Pooling2dDescriptor desc;
2117 desc.m_DataLayout = armnn::DataLayout::NHWC;
2118 desc.m_PadTop = 0;
2119 desc.m_PadBottom = 0;
2120 desc.m_PadLeft = 0;
2121 desc.m_PadRight = 0;
2122 desc.m_PoolType = armnn::PoolingAlgorithm::Average;
2123 desc.m_OutputShapeRounding = armnn::OutputShapeRounding::Floor;
2124 desc.m_PaddingMethod = armnn::PaddingMethod::Exclude;
2125 desc.m_PoolHeight = 2;
2126 desc.m_PoolWidth = 2;
2127 desc.m_StrideX = 2;
2128 desc.m_StrideY = 2;
2129
2130 armnn::INetworkPtr network = armnn::INetwork::Create();
2131 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2132 armnn::IConnectableLayer* const pooling2dLayer = network->AddPooling2dLayer(desc, layerName.c_str());
2133 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2134
2135 inputLayer->GetOutputSlot(0).Connect(pooling2dLayer->GetInputSlot(0));
2136 pooling2dLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2137
2138 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2139 pooling2dLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2140
2141 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002142 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002143
Finn Williamsb454c5c2021-02-09 15:56:23 +00002144 LayerVerifierBaseWithDescriptor<armnn::Pooling2dDescriptor> verifier(
2145 layerName, {inputInfo}, {outputInfo}, desc);
2146 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002147}
2148
Tamas Nyirid998a1c2021-11-05 14:55:33 +00002149TEST_CASE("SerializePooling3d")
2150{
2151 const std::string layerName("pooling3d");
2152 const armnn::TensorInfo inputInfo({1, 1, 2, 2, 2}, armnn::DataType::Float32);
2153 const armnn::TensorInfo outputInfo({1, 1, 1, 1, 1}, armnn::DataType::Float32);
2154
2155 armnn::Pooling3dDescriptor desc;
2156 desc.m_DataLayout = armnn::DataLayout::NDHWC;
2157 desc.m_PadFront = 0;
2158 desc.m_PadBack = 0;
2159 desc.m_PadTop = 0;
2160 desc.m_PadBottom = 0;
2161 desc.m_PadLeft = 0;
2162 desc.m_PadRight = 0;
2163 desc.m_PoolType = armnn::PoolingAlgorithm::Average;
2164 desc.m_OutputShapeRounding = armnn::OutputShapeRounding::Floor;
2165 desc.m_PaddingMethod = armnn::PaddingMethod::Exclude;
2166 desc.m_PoolHeight = 2;
2167 desc.m_PoolWidth = 2;
2168 desc.m_PoolDepth = 2;
2169 desc.m_StrideX = 2;
2170 desc.m_StrideY = 2;
2171 desc.m_StrideZ = 2;
2172
2173 armnn::INetworkPtr network = armnn::INetwork::Create();
2174 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2175 armnn::IConnectableLayer* const pooling3dLayer = network->AddPooling3dLayer(desc, layerName.c_str());
2176 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2177
2178 inputLayer->GetOutputSlot(0).Connect(pooling3dLayer->GetInputSlot(0));
2179 pooling3dLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2180
2181 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2182 pooling3dLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2183
2184 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
2185 CHECK(deserializedNetwork);
2186
2187 LayerVerifierBaseWithDescriptor<armnn::Pooling3dDescriptor> verifier(
2188 layerName, {inputInfo}, {outputInfo}, desc);
2189 deserializedNetwork->ExecuteStrategy(verifier);
2190}
2191
Sadik Armagan1625efc2021-06-10 18:24:34 +01002192TEST_CASE("SerializeQuantize")
Derek Lamberti87acb272019-03-27 16:51:31 +00002193{
Derek Lamberti87acb272019-03-27 16:51:31 +00002194 const std::string layerName("quantize");
2195 const armnn::TensorInfo info({ 1, 2, 2, 3 }, armnn::DataType::Float32);
2196
2197 armnn::INetworkPtr network = armnn::INetwork::Create();
2198 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2199 armnn::IConnectableLayer* const quantizeLayer = network->AddQuantizeLayer(layerName.c_str());
2200 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2201
2202 inputLayer->GetOutputSlot(0).Connect(quantizeLayer->GetInputSlot(0));
2203 quantizeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2204
2205 inputLayer->GetOutputSlot(0).SetTensorInfo(info);
2206 quantizeLayer->GetOutputSlot(0).SetTensorInfo(info);
2207
2208 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002209 CHECK(deserializedNetwork);
Derek Lamberti87acb272019-03-27 16:51:31 +00002210
Finn Williamsb454c5c2021-02-09 15:56:23 +00002211 LayerVerifierBase verifier(layerName, {info}, {info});
2212 deserializedNetwork->ExecuteStrategy(verifier);
Derek Lamberti87acb272019-03-27 16:51:31 +00002213}
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01002214
Sadik Armagan1625efc2021-06-10 18:24:34 +01002215TEST_CASE("SerializeRank")
Finn Williams2605b232020-06-10 15:53:46 +01002216{
Finn Williams2605b232020-06-10 15:53:46 +01002217 const std::string layerName("rank");
2218 const armnn::TensorInfo inputInfo({1, 9}, armnn::DataType::Float32);
2219 const armnn::TensorInfo outputInfo({1}, armnn::DataType::Signed32);
2220
2221 armnn::INetworkPtr network = armnn::INetwork::Create();
2222 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2223 armnn::IConnectableLayer* const rankLayer = network->AddRankLayer(layerName.c_str());
2224 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2225
2226 inputLayer->GetOutputSlot(0).Connect(rankLayer->GetInputSlot(0));
2227 rankLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2228
2229 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2230 rankLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2231
2232 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002233 CHECK(deserializedNetwork);
Finn Williams2605b232020-06-10 15:53:46 +01002234
Finn Williamsb454c5c2021-02-09 15:56:23 +00002235 LayerVerifierBase verifier(layerName, {inputInfo}, {outputInfo});
2236 deserializedNetwork->ExecuteStrategy(verifier);
Finn Williams2605b232020-06-10 15:53:46 +01002237}
2238
Sadik Armagan1625efc2021-06-10 18:24:34 +01002239TEST_CASE("SerializeReduceSum")
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +00002240{
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +00002241 const std::string layerName("Reduce_Sum");
2242 const armnn::TensorInfo inputInfo({1, 1, 3, 2}, armnn::DataType::Float32);
2243 const armnn::TensorInfo outputInfo({1, 1, 1, 2}, armnn::DataType::Float32);
2244
2245 armnn::ReduceDescriptor descriptor;
2246 descriptor.m_vAxis = { 2 };
2247 descriptor.m_ReduceOperation = armnn::ReduceOperation::Sum;
2248
2249 armnn::INetworkPtr network = armnn::INetwork::Create();
2250 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2251 armnn::IConnectableLayer* const reduceSumLayer = network->AddReduceLayer(descriptor, layerName.c_str());
2252 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2253
2254 inputLayer->GetOutputSlot(0).Connect(reduceSumLayer->GetInputSlot(0));
2255 reduceSumLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2256
2257 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2258 reduceSumLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2259
2260 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002261 CHECK(deserializedNetwork);
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +00002262
Finn Williamsb454c5c2021-02-09 15:56:23 +00002263 LayerVerifierBaseWithDescriptor<armnn::ReduceDescriptor> verifier(layerName, {inputInfo}, {outputInfo}, descriptor);
2264 deserializedNetwork->ExecuteStrategy(verifier);
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +00002265}
2266
Sadik Armagan1625efc2021-06-10 18:24:34 +01002267TEST_CASE("SerializeReshape")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002268{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002269 const std::string layerName("reshape");
2270 const armnn::TensorInfo inputInfo({1, 9}, armnn::DataType::Float32);
2271 const armnn::TensorInfo outputInfo({3, 3}, armnn::DataType::Float32);
2272
2273 armnn::ReshapeDescriptor descriptor({3, 3});
2274
2275 armnn::INetworkPtr network = armnn::INetwork::Create();
2276 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2277 armnn::IConnectableLayer* const reshapeLayer = network->AddReshapeLayer(descriptor, layerName.c_str());
2278 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2279
2280 inputLayer->GetOutputSlot(0).Connect(reshapeLayer->GetInputSlot(0));
2281 reshapeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2282
2283 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2284 reshapeLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2285
2286 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002287 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002288
Finn Williamsb454c5c2021-02-09 15:56:23 +00002289 LayerVerifierBaseWithDescriptor<armnn::ReshapeDescriptor> verifier(
2290 layerName, {inputInfo}, {outputInfo}, descriptor);
2291 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002292}
2293
Sadik Armagan1625efc2021-06-10 18:24:34 +01002294TEST_CASE("SerializeResize")
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01002295{
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01002296 const std::string layerName("resize");
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002297 const armnn::TensorInfo inputInfo = armnn::TensorInfo({1, 3, 5, 5}, armnn::DataType::Float32);
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01002298 const armnn::TensorInfo outputInfo = armnn::TensorInfo({1, 3, 2, 4}, armnn::DataType::Float32);
2299
2300 armnn::ResizeDescriptor desc;
Aron Virginas-Tar169d2f12019-07-01 19:01:44 +01002301 desc.m_TargetWidth = 4;
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01002302 desc.m_TargetHeight = 2;
Aron Virginas-Tar169d2f12019-07-01 19:01:44 +01002303 desc.m_Method = armnn::ResizeMethod::NearestNeighbor;
David Monahan4a0c9b92020-05-30 09:48:39 +01002304 desc.m_AlignCorners = true;
2305 desc.m_HalfPixelCenters = true;
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01002306
2307 armnn::INetworkPtr network = armnn::INetwork::Create();
2308 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2309 armnn::IConnectableLayer* const resizeLayer = network->AddResizeLayer(desc, layerName.c_str());
2310 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2311
2312 inputLayer->GetOutputSlot(0).Connect(resizeLayer->GetInputSlot(0));
2313 resizeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2314
2315 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2316 resizeLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2317
2318 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002319 CHECK(deserializedNetwork);
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01002320
Finn Williamsb454c5c2021-02-09 15:56:23 +00002321 LayerVerifierBaseWithDescriptor<armnn::ResizeDescriptor> verifier(layerName, {inputInfo}, {outputInfo}, desc);
2322 deserializedNetwork->ExecuteStrategy(verifier);
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01002323}
2324
Jan Eilers1b2654f2021-09-24 15:45:46 +01002325class ResizeBilinearLayerVerifier : public LayerVerifierBaseWithDescriptor<armnn::ResizeDescriptor>
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002326{
2327public:
2328 ResizeBilinearLayerVerifier(const std::string& layerName,
2329 const std::vector<armnn::TensorInfo>& inputInfos,
2330 const std::vector<armnn::TensorInfo>& outputInfos,
Jan Eilers1b2654f2021-09-24 15:45:46 +01002331 const armnn::ResizeDescriptor& descriptor)
2332 : LayerVerifierBaseWithDescriptor<armnn::ResizeDescriptor>(
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002333 layerName, inputInfos, outputInfos, descriptor) {}
2334
Finn Williamsb454c5c2021-02-09 15:56:23 +00002335 void ExecuteStrategy(const armnn::IConnectableLayer* layer,
2336 const armnn::BaseDescriptor& descriptor,
2337 const std::vector<armnn::ConstTensor>& constants,
2338 const char* name,
2339 const armnn::LayerBindingId id = 0) override
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002340 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00002341 armnn::IgnoreUnused(descriptor, constants, id);
2342 switch (layer->GetType())
2343 {
2344 case armnn::LayerType::Input: break;
2345 case armnn::LayerType::Output: break;
2346 case armnn::LayerType::Resize:
2347 {
2348 VerifyNameAndConnections(layer, name);
2349 const armnn::ResizeDescriptor& layerDescriptor =
2350 static_cast<const armnn::ResizeDescriptor&>(descriptor);
Sadik Armagan1625efc2021-06-10 18:24:34 +01002351 CHECK(layerDescriptor.m_Method == armnn::ResizeMethod::Bilinear);
2352 CHECK(layerDescriptor.m_TargetWidth == m_Descriptor.m_TargetWidth);
2353 CHECK(layerDescriptor.m_TargetHeight == m_Descriptor.m_TargetHeight);
2354 CHECK(layerDescriptor.m_DataLayout == m_Descriptor.m_DataLayout);
2355 CHECK(layerDescriptor.m_AlignCorners == m_Descriptor.m_AlignCorners);
2356 CHECK(layerDescriptor.m_HalfPixelCenters == m_Descriptor.m_HalfPixelCenters);
Finn Williamsb454c5c2021-02-09 15:56:23 +00002357 break;
2358 }
2359 default:
2360 {
2361 throw armnn::Exception("Unexpected layer type in test model. ResizeBiliniar "
2362 "should have translated to Resize");
2363 }
2364 }
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002365 }
2366};
2367
Sadik Armagan1625efc2021-06-10 18:24:34 +01002368TEST_CASE("SerializeResizeBilinear")
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002369{
2370 const std::string layerName("resizeBilinear");
2371 const armnn::TensorInfo inputInfo = armnn::TensorInfo({1, 3, 5, 5}, armnn::DataType::Float32);
2372 const armnn::TensorInfo outputInfo = armnn::TensorInfo({1, 3, 2, 4}, armnn::DataType::Float32);
2373
Jan Eilers1b2654f2021-09-24 15:45:46 +01002374 armnn::ResizeDescriptor desc;
2375 desc.m_Method = armnn::ResizeMethod::Bilinear;
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002376 desc.m_TargetWidth = 4u;
2377 desc.m_TargetHeight = 2u;
David Monahan4a0c9b92020-05-30 09:48:39 +01002378 desc.m_AlignCorners = true;
2379 desc.m_HalfPixelCenters = true;
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002380
2381 armnn::INetworkPtr network = armnn::INetwork::Create();
2382 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
Jan Eilers1b2654f2021-09-24 15:45:46 +01002383 armnn::IConnectableLayer* const resizeLayer = network->AddResizeLayer(desc, layerName.c_str());
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002384 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2385
2386 inputLayer->GetOutputSlot(0).Connect(resizeLayer->GetInputSlot(0));
2387 resizeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2388
2389 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2390 resizeLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2391
2392 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002393 CHECK(deserializedNetwork);
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002394
2395 ResizeBilinearLayerVerifier verifier(layerName, {inputInfo}, {outputInfo}, desc);
Finn Williamsb454c5c2021-02-09 15:56:23 +00002396 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002397}
2398
Sadik Armagan1625efc2021-06-10 18:24:34 +01002399TEST_CASE("EnsureResizeBilinearBackwardCompatibility")
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002400{
2401 // The hex data below is a flat buffer containing a simple network with an input,
Jan Eilers1b2654f2021-09-24 15:45:46 +01002402 // a ResizeBilinearLayer (now deprecated and removed) and an output
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002403 //
2404 // This test verifies that we can still deserialize this old-style model by replacing
2405 // the ResizeBilinearLayer with an equivalent ResizeLayer
2406 const std::vector<uint8_t> resizeBilinearModel =
2407 {
2408 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x0A, 0x00,
2409 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
2410 0x50, 0x01, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
2411 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xD4, 0xFE, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x0B,
2412 0x04, 0x00, 0x00, 0x00, 0xC2, 0xFE, 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x08, 0x00,
2413 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x8A, 0xFF, 0xFF, 0xFF, 0x02, 0x00, 0x00, 0x00,
2414 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00,
2415 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2416 0x38, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
2417 0x00, 0x1A, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00,
2418 0x34, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x12, 0x00, 0x08, 0x00, 0x0C, 0x00,
2419 0x07, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
2420 0x00, 0x00, 0x0E, 0x00, 0x18, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x14, 0x00, 0x0E, 0x00,
2421 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00,
2422 0x20, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x72, 0x65, 0x73, 0x69, 0x7A, 0x65, 0x42, 0x69, 0x6C, 0x69,
2423 0x6E, 0x65, 0x61, 0x72, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
2424 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00,
2425 0x00, 0x00, 0x52, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2426 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00,
2427 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2428 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x07, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
2429 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xF6, 0xFF, 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00,
2430 0x0A, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x14, 0x00,
2431 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
2432 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2433 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0A, 0x00,
2434 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x10, 0x00,
2435 0x08, 0x00, 0x07, 0x00, 0x0C, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00,
2436 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00,
2437 0x00, 0x00, 0x05, 0x00, 0x00, 0x00
2438 };
2439
2440 armnn::INetworkPtr deserializedNetwork =
2441 DeserializeNetwork(std::string(resizeBilinearModel.begin(), resizeBilinearModel.end()));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002442 CHECK(deserializedNetwork);
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002443
2444 const armnn::TensorInfo inputInfo = armnn::TensorInfo({1, 3, 5, 5}, armnn::DataType::Float32);
2445 const armnn::TensorInfo outputInfo = armnn::TensorInfo({1, 3, 2, 4}, armnn::DataType::Float32);
2446
Jan Eilers1b2654f2021-09-24 15:45:46 +01002447 armnn::ResizeDescriptor descriptor;
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002448 descriptor.m_TargetWidth = 4u;
2449 descriptor.m_TargetHeight = 2u;
2450
2451 ResizeBilinearLayerVerifier verifier("resizeBilinear", { inputInfo }, { outputInfo }, descriptor);
Finn Williamsb454c5c2021-02-09 15:56:23 +00002452 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002453}
2454
Keith Davis3ae3f972021-05-21 16:33:48 +01002455TEST_CASE("SerializeShape")
2456{
2457 const std::string layerName("shape");
2458 const armnn::TensorInfo inputInfo({1, 3, 3, 1}, armnn::DataType::Signed32);
2459 const armnn::TensorInfo outputInfo({ 4 }, armnn::DataType::Signed32);
2460
2461 armnn::INetworkPtr network = armnn::INetwork::Create();
2462 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2463 armnn::IConnectableLayer* const shapeLayer = network->AddShapeLayer(layerName.c_str());
2464 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2465
2466 inputLayer->GetOutputSlot(0).Connect(shapeLayer->GetInputSlot(0));
2467 shapeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2468
2469 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2470 shapeLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2471
2472 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
2473 CHECK(deserializedNetwork);
2474
2475 LayerVerifierBase verifier(layerName, {inputInfo}, {outputInfo});
2476
2477 deserializedNetwork->ExecuteStrategy(verifier);
2478}
2479
Sadik Armagan1625efc2021-06-10 18:24:34 +01002480TEST_CASE("SerializeSlice")
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +01002481{
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +01002482 const std::string layerName{"slice"};
2483
2484 const armnn::TensorInfo inputInfo = armnn::TensorInfo({3, 2, 3, 1}, armnn::DataType::Float32);
2485 const armnn::TensorInfo outputInfo = armnn::TensorInfo({2, 2, 2, 1}, armnn::DataType::Float32);
2486
2487 armnn::SliceDescriptor descriptor({ 0, 0, 1, 0}, {2, 2, 2, 1});
2488
2489 armnn::INetworkPtr network = armnn::INetwork::Create();
2490
2491 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2492 armnn::IConnectableLayer* const sliceLayer = network->AddSliceLayer(descriptor, layerName.c_str());
2493 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2494
2495 inputLayer->GetOutputSlot(0).Connect(sliceLayer->GetInputSlot(0));
2496 sliceLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2497
2498 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2499 sliceLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2500
2501 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002502 CHECK(deserializedNetwork);
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +01002503
Finn Williamsb454c5c2021-02-09 15:56:23 +00002504 LayerVerifierBaseWithDescriptor<armnn::SliceDescriptor> verifier(layerName, {inputInfo}, {outputInfo}, descriptor);
2505 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +01002506}
2507
Sadik Armagan1625efc2021-06-10 18:24:34 +01002508TEST_CASE("SerializeSoftmax")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002509{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002510 const std::string layerName("softmax");
2511 const armnn::TensorInfo info({1, 10}, armnn::DataType::Float32);
2512
2513 armnn::SoftmaxDescriptor descriptor;
2514 descriptor.m_Beta = 1.0f;
2515
2516 armnn::INetworkPtr network = armnn::INetwork::Create();
2517 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2518 armnn::IConnectableLayer* const softmaxLayer = network->AddSoftmaxLayer(descriptor, layerName.c_str());
2519 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2520
2521 inputLayer->GetOutputSlot(0).Connect(softmaxLayer->GetInputSlot(0));
2522 softmaxLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2523
2524 inputLayer->GetOutputSlot(0).SetTensorInfo(info);
2525 softmaxLayer->GetOutputSlot(0).SetTensorInfo(info);
2526
2527 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002528 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002529
Finn Williamsb454c5c2021-02-09 15:56:23 +00002530 LayerVerifierBaseWithDescriptor<armnn::SoftmaxDescriptor> verifier(layerName, {info}, {info}, descriptor);
2531 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002532}
2533
Sadik Armagan1625efc2021-06-10 18:24:34 +01002534TEST_CASE("SerializeSpaceToBatchNd")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002535{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002536 const std::string layerName("spaceToBatchNd");
2537 const armnn::TensorInfo inputInfo({2, 1, 2, 4}, armnn::DataType::Float32);
2538 const armnn::TensorInfo outputInfo({8, 1, 1, 3}, armnn::DataType::Float32);
2539
2540 armnn::SpaceToBatchNdDescriptor desc;
2541 desc.m_DataLayout = armnn::DataLayout::NCHW;
2542 desc.m_BlockShape = {2, 2};
2543 desc.m_PadList = {{0, 0}, {2, 0}};
2544
2545 armnn::INetworkPtr network = armnn::INetwork::Create();
2546 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2547 armnn::IConnectableLayer* const spaceToBatchNdLayer = network->AddSpaceToBatchNdLayer(desc, layerName.c_str());
2548 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2549
2550 inputLayer->GetOutputSlot(0).Connect(spaceToBatchNdLayer->GetInputSlot(0));
2551 spaceToBatchNdLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2552
2553 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2554 spaceToBatchNdLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2555
2556 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002557 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002558
Finn Williamsb454c5c2021-02-09 15:56:23 +00002559 LayerVerifierBaseWithDescriptor<armnn::SpaceToBatchNdDescriptor> verifier(
2560 layerName, {inputInfo}, {outputInfo}, desc);
2561 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002562}
2563
Sadik Armagan1625efc2021-06-10 18:24:34 +01002564TEST_CASE("SerializeSpaceToDepth")
Aron Virginas-Taraa067142019-06-11 16:01:44 +01002565{
Aron Virginas-Taraa067142019-06-11 16:01:44 +01002566 const std::string layerName("spaceToDepth");
2567
2568 const armnn::TensorInfo inputInfo ({ 1, 16, 8, 3 }, armnn::DataType::Float32);
2569 const armnn::TensorInfo outputInfo({ 1, 8, 4, 12 }, armnn::DataType::Float32);
2570
2571 armnn::SpaceToDepthDescriptor desc;
2572 desc.m_BlockSize = 2;
2573 desc.m_DataLayout = armnn::DataLayout::NHWC;
2574
2575 armnn::INetworkPtr network = armnn::INetwork::Create();
2576 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2577 armnn::IConnectableLayer* const spaceToDepthLayer = network->AddSpaceToDepthLayer(desc, layerName.c_str());
2578 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2579
2580 inputLayer->GetOutputSlot(0).Connect(spaceToDepthLayer->GetInputSlot(0));
2581 spaceToDepthLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2582
2583 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2584 spaceToDepthLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2585
2586 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002587 CHECK(deserializedNetwork);
Aron Virginas-Taraa067142019-06-11 16:01:44 +01002588
Finn Williamsb454c5c2021-02-09 15:56:23 +00002589 LayerVerifierBaseWithDescriptor<armnn::SpaceToDepthDescriptor> verifier(
2590 layerName, {inputInfo}, {outputInfo}, desc);
2591 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Taraa067142019-06-11 16:01:44 +01002592}
2593
Sadik Armagan1625efc2021-06-10 18:24:34 +01002594TEST_CASE("SerializeSplitter")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002595{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002596 const unsigned int numViews = 3;
2597 const unsigned int numDimensions = 4;
2598 const unsigned int inputShape[] = {1, 18, 4, 4};
2599 const unsigned int outputShape[] = {1, 6, 4, 4};
2600
2601 // This is modelled on how the caffe parser sets up a splitter layer to partition an input along dimension one.
2602 unsigned int splitterDimSizes[4] = {static_cast<unsigned int>(inputShape[0]),
2603 static_cast<unsigned int>(inputShape[1]),
2604 static_cast<unsigned int>(inputShape[2]),
2605 static_cast<unsigned int>(inputShape[3])};
2606 splitterDimSizes[1] /= numViews;
2607 armnn::ViewsDescriptor desc(numViews, numDimensions);
2608
2609 for (unsigned int g = 0; g < numViews; ++g)
2610 {
2611 desc.SetViewOriginCoord(g, 1, splitterDimSizes[1] * g);
2612
2613 for (unsigned int dimIdx=0; dimIdx < 4; dimIdx++)
2614 {
2615 desc.SetViewSize(g, dimIdx, splitterDimSizes[dimIdx]);
2616 }
2617 }
2618
2619 const std::string layerName("splitter");
2620 const armnn::TensorInfo inputInfo(numDimensions, inputShape, armnn::DataType::Float32);
2621 const armnn::TensorInfo outputInfo(numDimensions, outputShape, armnn::DataType::Float32);
2622
2623 armnn::INetworkPtr network = armnn::INetwork::Create();
2624 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2625 armnn::IConnectableLayer* const splitterLayer = network->AddSplitterLayer(desc, layerName.c_str());
2626 armnn::IConnectableLayer* const outputLayer0 = network->AddOutputLayer(0);
2627 armnn::IConnectableLayer* const outputLayer1 = network->AddOutputLayer(1);
2628 armnn::IConnectableLayer* const outputLayer2 = network->AddOutputLayer(2);
2629
2630 inputLayer->GetOutputSlot(0).Connect(splitterLayer->GetInputSlot(0));
2631 splitterLayer->GetOutputSlot(0).Connect(outputLayer0->GetInputSlot(0));
2632 splitterLayer->GetOutputSlot(1).Connect(outputLayer1->GetInputSlot(0));
2633 splitterLayer->GetOutputSlot(2).Connect(outputLayer2->GetInputSlot(0));
2634
2635 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2636 splitterLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2637 splitterLayer->GetOutputSlot(1).SetTensorInfo(outputInfo);
2638 splitterLayer->GetOutputSlot(2).SetTensorInfo(outputInfo);
2639
2640 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002641 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002642
Finn Williamsb454c5c2021-02-09 15:56:23 +00002643 LayerVerifierBaseWithDescriptor<armnn::ViewsDescriptor> verifier(
2644 layerName, {inputInfo}, {outputInfo, outputInfo, outputInfo}, desc);
2645 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002646}
2647
Sadik Armagan1625efc2021-06-10 18:24:34 +01002648TEST_CASE("SerializeStack")
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01002649{
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01002650 const std::string layerName("stack");
2651
2652 armnn::TensorInfo inputTensorInfo ({4, 3, 5}, armnn::DataType::Float32);
2653 armnn::TensorInfo outputTensorInfo({4, 3, 2, 5}, armnn::DataType::Float32);
2654
2655 armnn::StackDescriptor descriptor(2, 2, {4, 3, 5});
2656
2657 armnn::INetworkPtr network = armnn::INetwork::Create();
2658 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(0);
2659 armnn::IConnectableLayer* const inputLayer2 = network->AddInputLayer(1);
2660 armnn::IConnectableLayer* const stackLayer = network->AddStackLayer(descriptor, layerName.c_str());
2661 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2662
2663 inputLayer1->GetOutputSlot(0).Connect(stackLayer->GetInputSlot(0));
2664 inputLayer2->GetOutputSlot(0).Connect(stackLayer->GetInputSlot(1));
2665 stackLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2666
2667 inputLayer1->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
2668 inputLayer2->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
2669 stackLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
2670
2671 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002672 CHECK(deserializedNetwork);
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01002673
Finn Williamsb454c5c2021-02-09 15:56:23 +00002674 LayerVerifierBaseWithDescriptor<armnn::StackDescriptor> verifier(
2675 layerName, {inputTensorInfo, inputTensorInfo}, {outputTensorInfo}, descriptor);
2676 deserializedNetwork->ExecuteStrategy(verifier);
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01002677}
2678
Sadik Armagan1625efc2021-06-10 18:24:34 +01002679TEST_CASE("SerializeStandIn")
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01002680{
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01002681 const std::string layerName("standIn");
2682
2683 armnn::TensorInfo tensorInfo({ 1u }, armnn::DataType::Float32);
2684 armnn::StandInDescriptor descriptor(2u, 2u);
2685
2686 armnn::INetworkPtr network = armnn::INetwork::Create();
2687 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
2688 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
2689 armnn::IConnectableLayer* const standInLayer = network->AddStandInLayer(descriptor, layerName.c_str());
2690 armnn::IConnectableLayer* const outputLayer0 = network->AddOutputLayer(0);
2691 armnn::IConnectableLayer* const outputLayer1 = network->AddOutputLayer(1);
2692
2693 inputLayer0->GetOutputSlot(0).Connect(standInLayer->GetInputSlot(0));
2694 inputLayer0->GetOutputSlot(0).SetTensorInfo(tensorInfo);
2695
2696 inputLayer1->GetOutputSlot(0).Connect(standInLayer->GetInputSlot(1));
2697 inputLayer1->GetOutputSlot(0).SetTensorInfo(tensorInfo);
2698
2699 standInLayer->GetOutputSlot(0).Connect(outputLayer0->GetInputSlot(0));
2700 standInLayer->GetOutputSlot(0).SetTensorInfo(tensorInfo);
2701
2702 standInLayer->GetOutputSlot(1).Connect(outputLayer1->GetInputSlot(0));
2703 standInLayer->GetOutputSlot(1).SetTensorInfo(tensorInfo);
2704
2705 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002706 CHECK(deserializedNetwork);
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01002707
Finn Williamsb454c5c2021-02-09 15:56:23 +00002708 LayerVerifierBaseWithDescriptor<armnn::StandInDescriptor> verifier(
2709 layerName, { tensorInfo, tensorInfo }, { tensorInfo, tensorInfo }, descriptor);
2710 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01002711}
2712
Sadik Armagan1625efc2021-06-10 18:24:34 +01002713TEST_CASE("SerializeStridedSlice")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002714{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002715 const std::string layerName("stridedSlice");
2716 const armnn::TensorInfo inputInfo = armnn::TensorInfo({3, 2, 3, 1}, armnn::DataType::Float32);
2717 const armnn::TensorInfo outputInfo = armnn::TensorInfo({3, 1}, armnn::DataType::Float32);
2718
2719 armnn::StridedSliceDescriptor desc({0, 0, 1, 0}, {1, 1, 1, 1}, {1, 1, 1, 1});
2720 desc.m_EndMask = (1 << 4) - 1;
2721 desc.m_ShrinkAxisMask = (1 << 1) | (1 << 2);
2722 desc.m_DataLayout = armnn::DataLayout::NCHW;
2723
2724 armnn::INetworkPtr network = armnn::INetwork::Create();
2725 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2726 armnn::IConnectableLayer* const stridedSliceLayer = network->AddStridedSliceLayer(desc, layerName.c_str());
2727 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2728
2729 inputLayer->GetOutputSlot(0).Connect(stridedSliceLayer->GetInputSlot(0));
2730 stridedSliceLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2731
2732 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2733 stridedSliceLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2734
2735 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002736 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002737
Finn Williamsb454c5c2021-02-09 15:56:23 +00002738 LayerVerifierBaseWithDescriptor<armnn::StridedSliceDescriptor> verifier(
2739 layerName, {inputInfo}, {outputInfo}, desc);
2740 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002741}
2742
Sadik Armagan1625efc2021-06-10 18:24:34 +01002743TEST_CASE("SerializeSubtraction")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002744{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002745 const std::string layerName("subtraction");
2746 const armnn::TensorInfo info({ 1, 4 }, armnn::DataType::Float32);
2747
2748 armnn::INetworkPtr network = armnn::INetwork::Create();
2749 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
2750 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
Mike Kelly52e90bf2023-03-15 15:06:23 +00002751 ARMNN_NO_DEPRECATE_WARN_BEGIN
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002752 armnn::IConnectableLayer* const subtractionLayer = network->AddSubtractionLayer(layerName.c_str());
Mike Kelly52e90bf2023-03-15 15:06:23 +00002753 ARMNN_NO_DEPRECATE_WARN_END
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002754 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2755
2756 inputLayer0->GetOutputSlot(0).Connect(subtractionLayer->GetInputSlot(0));
2757 inputLayer1->GetOutputSlot(0).Connect(subtractionLayer->GetInputSlot(1));
2758 subtractionLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2759
2760 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
2761 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
2762 subtractionLayer->GetOutputSlot(0).SetTensorInfo(info);
2763
2764 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002765 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002766
Finn Williamsb454c5c2021-02-09 15:56:23 +00002767 LayerVerifierBase verifier(layerName, {info, info}, {info});
2768 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +00002769}
2770
Sadik Armagan1625efc2021-06-10 18:24:34 +01002771TEST_CASE("SerializeSwitch")
Sadik Armaganeff363d2019-04-05 15:25:46 +01002772{
2773 class SwitchLayerVerifier : public LayerVerifierBase
2774 {
2775 public:
2776 SwitchLayerVerifier(const std::string& layerName,
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01002777 const std::vector<armnn::TensorInfo>& inputInfos,
2778 const std::vector<armnn::TensorInfo>& outputInfos)
Finn Williamsb454c5c2021-02-09 15:56:23 +00002779 : LayerVerifierBase(layerName, inputInfos, outputInfos) {}
Sadik Armaganeff363d2019-04-05 15:25:46 +01002780
Finn Williamsb454c5c2021-02-09 15:56:23 +00002781 void ExecuteStrategy(const armnn::IConnectableLayer* layer,
2782 const armnn::BaseDescriptor& descriptor,
2783 const std::vector<armnn::ConstTensor>& constants,
2784 const char* name,
2785 const armnn::LayerBindingId id = 0) override
Sadik Armaganeff363d2019-04-05 15:25:46 +01002786 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00002787 armnn::IgnoreUnused(descriptor, constants, id);
2788 switch (layer->GetType())
2789 {
2790 case armnn::LayerType::Input: break;
2791 case armnn::LayerType::Output: break;
2792 case armnn::LayerType::Constant: break;
2793 case armnn::LayerType::Switch:
2794 {
2795 VerifyNameAndConnections(layer, name);
2796 break;
2797 }
2798 default:
2799 {
2800 throw armnn::Exception("Unexpected layer type in Switch test model");
2801 }
2802 }
Sadik Armaganeff363d2019-04-05 15:25:46 +01002803 }
Sadik Armaganeff363d2019-04-05 15:25:46 +01002804 };
2805
2806 const std::string layerName("switch");
Cathal Corbett5b8093c2021-10-22 11:12:07 +01002807 const armnn::TensorInfo info({ 1, 4 }, armnn::DataType::Float32, 0.0f, 0, true);
Sadik Armaganeff363d2019-04-05 15:25:46 +01002808
2809 std::vector<float> constantData = GenerateRandomData<float>(info.GetNumElements());
2810 armnn::ConstTensor constTensor(info, constantData);
2811
2812 armnn::INetworkPtr network = armnn::INetwork::Create();
2813 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2814 armnn::IConnectableLayer* const constantLayer = network->AddConstantLayer(constTensor, "constant");
2815 armnn::IConnectableLayer* const switchLayer = network->AddSwitchLayer(layerName.c_str());
2816 armnn::IConnectableLayer* const trueOutputLayer = network->AddOutputLayer(0);
2817 armnn::IConnectableLayer* const falseOutputLayer = network->AddOutputLayer(1);
2818
2819 inputLayer->GetOutputSlot(0).Connect(switchLayer->GetInputSlot(0));
2820 constantLayer->GetOutputSlot(0).Connect(switchLayer->GetInputSlot(1));
2821 switchLayer->GetOutputSlot(0).Connect(trueOutputLayer->GetInputSlot(0));
2822 switchLayer->GetOutputSlot(1).Connect(falseOutputLayer->GetInputSlot(0));
2823
2824 inputLayer->GetOutputSlot(0).SetTensorInfo(info);
2825 constantLayer->GetOutputSlot(0).SetTensorInfo(info);
2826 switchLayer->GetOutputSlot(0).SetTensorInfo(info);
2827 switchLayer->GetOutputSlot(1).SetTensorInfo(info);
2828
2829 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002830 CHECK(deserializedNetwork);
Sadik Armaganeff363d2019-04-05 15:25:46 +01002831
2832 SwitchLayerVerifier verifier(layerName, {info, info}, {info, info});
Finn Williamsb454c5c2021-02-09 15:56:23 +00002833 deserializedNetwork->ExecuteStrategy(verifier);
Sadik Armaganeff363d2019-04-05 15:25:46 +01002834}
2835
Sadik Armagan1625efc2021-06-10 18:24:34 +01002836TEST_CASE("SerializeTranspose")
Mike Kellyc9ea45a2020-02-28 18:11:58 +00002837{
Mike Kellyc9ea45a2020-02-28 18:11:58 +00002838 const std::string layerName("transpose");
2839 const armnn::TensorInfo inputTensorInfo({4, 3, 2, 1}, armnn::DataType::Float32);
2840 const armnn::TensorInfo outputTensorInfo({1, 2, 3, 4}, armnn::DataType::Float32);
2841
2842 armnn::TransposeDescriptor descriptor(armnn::PermutationVector({3, 2, 1, 0}));
2843
2844 armnn::INetworkPtr network = armnn::INetwork::Create();
2845 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2846 armnn::IConnectableLayer* const transposeLayer = network->AddTransposeLayer(descriptor, layerName.c_str());
2847 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2848
2849 inputLayer->GetOutputSlot(0).Connect(transposeLayer->GetInputSlot(0));
2850 transposeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2851
2852 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
2853 transposeLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
2854
2855 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002856 CHECK(deserializedNetwork);
Mike Kellyc9ea45a2020-02-28 18:11:58 +00002857
Finn Williamsb454c5c2021-02-09 15:56:23 +00002858 LayerVerifierBaseWithDescriptor<armnn::TransposeDescriptor> verifier(
2859 layerName, {inputTensorInfo}, {outputTensorInfo}, descriptor);
2860 deserializedNetwork->ExecuteStrategy(verifier);
Mike Kellyc9ea45a2020-02-28 18:11:58 +00002861}
2862
Sadik Armagan1625efc2021-06-10 18:24:34 +01002863TEST_CASE("SerializeTransposeConvolution2d")
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01002864{
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01002865 const std::string layerName("transposeConvolution2d");
2866 const armnn::TensorInfo inputInfo ({ 1, 7, 7, 1 }, armnn::DataType::Float32);
2867 const armnn::TensorInfo outputInfo({ 1, 9, 9, 1 }, armnn::DataType::Float32);
2868
Cathal Corbett5b8093c2021-10-22 11:12:07 +01002869 const armnn::TensorInfo weightsInfo({ 1, 3, 3, 1 }, armnn::DataType::Float32, 0.0f, 0, true);
2870 const armnn::TensorInfo biasesInfo ({ 1 }, armnn::DataType::Float32, 0.0f, 0, true);
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01002871
2872 std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements());
2873 armnn::ConstTensor weights(weightsInfo, weightsData);
2874
2875 std::vector<float> biasesData = GenerateRandomData<float>(biasesInfo.GetNumElements());
2876 armnn::ConstTensor biases(biasesInfo, biasesData);
2877
2878 armnn::TransposeConvolution2dDescriptor descriptor;
2879 descriptor.m_PadLeft = 1;
2880 descriptor.m_PadRight = 1;
2881 descriptor.m_PadTop = 1;
2882 descriptor.m_PadBottom = 1;
2883 descriptor.m_StrideX = 1;
2884 descriptor.m_StrideY = 1;
2885 descriptor.m_BiasEnabled = true;
2886 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
2887
2888 armnn::INetworkPtr network = armnn::INetwork::Create();
2889 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2890 armnn::IConnectableLayer* const convLayer =
2891 network->AddTransposeConvolution2dLayer(descriptor,
2892 weights,
2893 armnn::Optional<armnn::ConstTensor>(biases),
2894 layerName.c_str());
2895 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2896
2897 inputLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(0));
2898 convLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2899
2900 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2901 convLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2902
2903 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002904 CHECK(deserializedNetwork);
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01002905
Finn Williamsb454c5c2021-02-09 15:56:23 +00002906 const std::vector<armnn::ConstTensor> constants {weights, biases};
2907 LayerVerifierBaseWithDescriptorAndConstants<armnn::TransposeConvolution2dDescriptor> verifier(
2908 layerName, {inputInfo}, {outputInfo}, descriptor, constants);
2909 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01002910}
2911
Sadik Armagan1625efc2021-06-10 18:24:34 +01002912TEST_CASE("SerializeDeserializeNonLinearNetwork")
Sadik Armagandb059fd2019-03-20 12:28:32 +00002913{
2914 class ConstantLayerVerifier : public LayerVerifierBase
2915 {
2916 public:
2917 ConstantLayerVerifier(const std::string& layerName,
2918 const std::vector<armnn::TensorInfo>& inputInfos,
2919 const std::vector<armnn::TensorInfo>& outputInfos,
2920 const armnn::ConstTensor& layerInput)
2921 : LayerVerifierBase(layerName, inputInfos, outputInfos)
2922 , m_LayerInput(layerInput) {}
2923
Finn Williamsb454c5c2021-02-09 15:56:23 +00002924 void ExecuteStrategy(const armnn::IConnectableLayer* layer,
2925 const armnn::BaseDescriptor& descriptor,
2926 const std::vector<armnn::ConstTensor>& constants,
2927 const char* name,
2928 const armnn::LayerBindingId id = 0) override
Sadik Armagandb059fd2019-03-20 12:28:32 +00002929 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00002930 armnn::IgnoreUnused(descriptor, constants, id);
2931 switch (layer->GetType())
2932 {
2933 case armnn::LayerType::Input: break;
2934 case armnn::LayerType::Output: break;
2935 case armnn::LayerType::Addition: break;
2936 case armnn::LayerType::Constant:
2937 {
2938 VerifyNameAndConnections(layer, name);
2939 CompareConstTensor(constants.at(0), m_LayerInput);
2940 break;
2941 }
Mike Kelly3ec30772023-03-08 13:47:17 +00002942 case armnn::LayerType::ElementwiseBinary: break;
Finn Williamsb454c5c2021-02-09 15:56:23 +00002943 default:
2944 {
2945 throw armnn::Exception("Unexpected layer type in test model");
2946 }
2947 }
Sadik Armagandb059fd2019-03-20 12:28:32 +00002948 }
2949
Sadik Armagandb059fd2019-03-20 12:28:32 +00002950 private:
2951 armnn::ConstTensor m_LayerInput;
2952 };
2953
2954 const std::string layerName("constant");
Cathal Corbett5b8093c2021-10-22 11:12:07 +01002955 const armnn::TensorInfo info({ 2, 3 }, armnn::DataType::Float32, 0.0f, 0, true);
Sadik Armagandb059fd2019-03-20 12:28:32 +00002956
2957 std::vector<float> constantData = GenerateRandomData<float>(info.GetNumElements());
2958 armnn::ConstTensor constTensor(info, constantData);
2959
2960 armnn::INetworkPtr network(armnn::INetwork::Create());
2961 armnn::IConnectableLayer* input = network->AddInputLayer(0);
Mike Kelly52e90bf2023-03-15 15:06:23 +00002962 ARMNN_NO_DEPRECATE_WARN_BEGIN
Sadik Armagandb059fd2019-03-20 12:28:32 +00002963 armnn::IConnectableLayer* add = network->AddAdditionLayer();
Mike Kelly52e90bf2023-03-15 15:06:23 +00002964 ARMNN_NO_DEPRECATE_WARN_END
Sadik Armagandb059fd2019-03-20 12:28:32 +00002965 armnn::IConnectableLayer* constant = network->AddConstantLayer(constTensor, layerName.c_str());
2966 armnn::IConnectableLayer* output = network->AddOutputLayer(0);
2967
2968 input->GetOutputSlot(0).Connect(add->GetInputSlot(0));
2969 constant->GetOutputSlot(0).Connect(add->GetInputSlot(1));
2970 add->GetOutputSlot(0).Connect(output->GetInputSlot(0));
2971
2972 input->GetOutputSlot(0).SetTensorInfo(info);
2973 constant->GetOutputSlot(0).SetTensorInfo(info);
2974 add->GetOutputSlot(0).SetTensorInfo(info);
2975
2976 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002977 CHECK(deserializedNetwork);
Sadik Armagandb059fd2019-03-20 12:28:32 +00002978
2979 ConstantLayerVerifier verifier(layerName, {}, {info}, constTensor);
Finn Williamsb454c5c2021-02-09 15:56:23 +00002980 deserializedNetwork->ExecuteStrategy(verifier);
James Conroy8d333182020-05-13 10:27:58 +01002981}
2982
Teresa Charlin50de4fa2021-05-31 18:47:33 +01002983}