blob: 2f8fd73717242412febed73b06d50be6f2ce3c6e [file] [log] [blame]
Mike Kelly8c1701a2019-02-11 17:01:27 +00001//
Teresa Charlin52664732020-06-29 16:27:03 +01002// Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
Mike Kelly8c1701a2019-02-11 17:01:27 +00003// SPDX-License-Identifier: MIT
4//
5
Mike Kelly8c1701a2019-02-11 17:01:27 +00006#include "../Serializer.hpp"
Finn Williamsb454c5c2021-02-09 15:56:23 +00007#include "SerializerTestUtils.hpp"
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00008
Matthew Benthamff130e22020-01-17 11:47:42 +00009#include <armnn/Descriptors.hpp>
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +000010#include <armnn/INetwork.hpp>
Matthew Benthamff130e22020-01-17 11:47:42 +000011#include <armnn/TypesUtils.hpp>
12#include <armnn/LstmParams.hpp>
13#include <armnn/QuantizedLstmParams.hpp>
Derek Lamberti0028d1b2019-02-20 13:57:42 +000014#include <armnnDeserializer/IDeserializer.hpp>
Finn Williamsb454c5c2021-02-09 15:56:23 +000015#include <armnn/utility/IgnoreUnused.hpp>
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +000016
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +000017#include <random>
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +000018#include <vector>
19
Sadik Armagan1625efc2021-06-10 18:24:34 +010020#include <doctest/doctest.h>
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +000021
Derek Lamberti0028d1b2019-02-20 13:57:42 +000022using armnnDeserializer::IDeserializer;
Mike Kelly8c1701a2019-02-11 17:01:27 +000023
Sadik Armagan1625efc2021-06-10 18:24:34 +010024TEST_SUITE("SerializerTests")
25{
Finn Williamsb454c5c2021-02-09 15:56:23 +000026
Sadik Armagan1625efc2021-06-10 18:24:34 +010027TEST_CASE("SerializeAddition")
Mike Kelly8c1701a2019-02-11 17:01:27 +000028{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +000029 const std::string layerName("addition");
30 const armnn::TensorInfo tensorInfo({1, 2, 3}, armnn::DataType::Float32);
31
Mike Kelly8c1701a2019-02-11 17:01:27 +000032 armnn::INetworkPtr network = armnn::INetwork::Create();
33 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
34 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +000035 armnn::IConnectableLayer* const additionLayer = network->AddAdditionLayer(layerName.c_str());
36 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
Mike Kelly8c1701a2019-02-11 17:01:27 +000037
Éanna Ó Catháin633f8592019-02-25 16:26:29 +000038 inputLayer0->GetOutputSlot(0).Connect(additionLayer->GetInputSlot(0));
39 inputLayer1->GetOutputSlot(0).Connect(additionLayer->GetInputSlot(1));
Éanna Ó Catháin633f8592019-02-25 16:26:29 +000040 additionLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
Mike Kelly8c1701a2019-02-11 17:01:27 +000041
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +000042 inputLayer0->GetOutputSlot(0).SetTensorInfo(tensorInfo);
43 inputLayer1->GetOutputSlot(0).SetTensorInfo(tensorInfo);
44 additionLayer->GetOutputSlot(0).SetTensorInfo(tensorInfo);
Jim Flynn3091b062019-02-15 14:45:04 +000045
Finn Williamsb454c5c2021-02-09 15:56:23 +000046 std::string serializedNetwork = SerializeNetwork(*network);
47 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(serializedNetwork);
Sadik Armagan1625efc2021-06-10 18:24:34 +010048 CHECK(deserializedNetwork);
Éanna Ó Catháin633f8592019-02-25 16:26:29 +000049
Finn Williamsb454c5c2021-02-09 15:56:23 +000050 LayerVerifierBase verifier(layerName, {tensorInfo, tensorInfo}, {tensorInfo});
51 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +000052}
Jim Flynnac25a1b2019-02-28 10:40:49 +000053
Mike Kelly1f140f72021-04-06 12:25:55 +010054void SerializeArgMinMaxTest(armnn::DataType dataType)
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +010055{
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +010056 const std::string layerName("argminmax");
57 const armnn::TensorInfo inputInfo({1, 2, 3}, armnn::DataType::Float32);
Mike Kelly1f140f72021-04-06 12:25:55 +010058 const armnn::TensorInfo outputInfo({1, 3}, dataType);
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +010059
60 armnn::ArgMinMaxDescriptor descriptor;
61 descriptor.m_Function = armnn::ArgMinMaxFunction::Max;
62 descriptor.m_Axis = 1;
63
64 armnn::INetworkPtr network = armnn::INetwork::Create();
65 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
66 armnn::IConnectableLayer* const argMinMaxLayer = network->AddArgMinMaxLayer(descriptor, layerName.c_str());
67 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
68
69 inputLayer->GetOutputSlot(0).Connect(argMinMaxLayer->GetInputSlot(0));
70 argMinMaxLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
71
72 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
73 argMinMaxLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
74
75 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +010076 CHECK(deserializedNetwork);
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +010077
Finn Williamsb454c5c2021-02-09 15:56:23 +000078 LayerVerifierBaseWithDescriptor<armnn::ArgMinMaxDescriptor> verifier(layerName,
79 {inputInfo},
80 {outputInfo},
81 descriptor);
82 deserializedNetwork->ExecuteStrategy(verifier);
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +010083}
84
Sadik Armagan1625efc2021-06-10 18:24:34 +010085TEST_CASE("SerializeArgMinMaxSigned32")
Mike Kelly1f140f72021-04-06 12:25:55 +010086{
87 SerializeArgMinMaxTest(armnn::DataType::Signed32);
88}
89
Sadik Armagan1625efc2021-06-10 18:24:34 +010090TEST_CASE("SerializeArgMinMaxSigned64")
Mike Kelly1f140f72021-04-06 12:25:55 +010091{
92 SerializeArgMinMaxTest(armnn::DataType::Signed64);
93}
94
Sadik Armagan1625efc2021-06-10 18:24:34 +010095TEST_CASE("SerializeBatchNormalization")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +000096{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +000097 const std::string layerName("batchNormalization");
98 const armnn::TensorInfo inputInfo ({ 1, 3, 3, 1 }, armnn::DataType::Float32);
99 const armnn::TensorInfo outputInfo({ 1, 3, 3, 1 }, armnn::DataType::Float32);
100
101 const armnn::TensorInfo meanInfo({1}, armnn::DataType::Float32);
102 const armnn::TensorInfo varianceInfo({1}, armnn::DataType::Float32);
103 const armnn::TensorInfo betaInfo({1}, armnn::DataType::Float32);
104 const armnn::TensorInfo gammaInfo({1}, armnn::DataType::Float32);
105
106 armnn::BatchNormalizationDescriptor descriptor;
107 descriptor.m_Eps = 0.0010000000475f;
108 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
109
110 std::vector<float> meanData({5.0});
111 std::vector<float> varianceData({2.0});
112 std::vector<float> betaData({1.0});
113 std::vector<float> gammaData({0.0});
114
Finn Williamsb454c5c2021-02-09 15:56:23 +0000115 std::vector<armnn::ConstTensor> constants;
116 constants.emplace_back(armnn::ConstTensor(meanInfo, meanData));
117 constants.emplace_back(armnn::ConstTensor(varianceInfo, varianceData));
118 constants.emplace_back(armnn::ConstTensor(betaInfo, betaData));
119 constants.emplace_back(armnn::ConstTensor(gammaInfo, gammaData));
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000120
121 armnn::INetworkPtr network = armnn::INetwork::Create();
122 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
123 armnn::IConnectableLayer* const batchNormalizationLayer =
Finn Williamsb454c5c2021-02-09 15:56:23 +0000124 network->AddBatchNormalizationLayer(descriptor,
125 constants[0],
126 constants[1],
127 constants[2],
128 constants[3],
129 layerName.c_str());
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000130 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
131
132 inputLayer->GetOutputSlot(0).Connect(batchNormalizationLayer->GetInputSlot(0));
133 batchNormalizationLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
134
135 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
136 batchNormalizationLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
137
138 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100139 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000140
Finn Williamsb454c5c2021-02-09 15:56:23 +0000141 LayerVerifierBaseWithDescriptorAndConstants<armnn::BatchNormalizationDescriptor> verifier(
142 layerName, {inputInfo}, {outputInfo}, descriptor, constants);
143 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000144}
145
Sadik Armagan1625efc2021-06-10 18:24:34 +0100146TEST_CASE("SerializeBatchToSpaceNd")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000147{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000148 const std::string layerName("spaceToBatchNd");
149 const armnn::TensorInfo inputInfo({4, 1, 2, 2}, armnn::DataType::Float32);
150 const armnn::TensorInfo outputInfo({1, 1, 4, 4}, armnn::DataType::Float32);
151
152 armnn::BatchToSpaceNdDescriptor desc;
153 desc.m_DataLayout = armnn::DataLayout::NCHW;
154 desc.m_BlockShape = {2, 2};
155 desc.m_Crops = {{0, 0}, {0, 0}};
156
157 armnn::INetworkPtr network = armnn::INetwork::Create();
158 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
159 armnn::IConnectableLayer* const batchToSpaceNdLayer = network->AddBatchToSpaceNdLayer(desc, layerName.c_str());
160 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
161
162 inputLayer->GetOutputSlot(0).Connect(batchToSpaceNdLayer->GetInputSlot(0));
163 batchToSpaceNdLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
164
165 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
166 batchToSpaceNdLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
167
168 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100169 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000170
Finn Williamsb454c5c2021-02-09 15:56:23 +0000171 LayerVerifierBaseWithDescriptor<armnn::BatchToSpaceNdDescriptor> verifier(layerName,
172 {inputInfo},
173 {outputInfo},
174 desc);
175 deserializedNetwork->ExecuteStrategy(verifier);
Mike Kelly8c1701a2019-02-11 17:01:27 +0000176}
177
Sadik Armagan1625efc2021-06-10 18:24:34 +0100178TEST_CASE("SerializeCast")
mathad01b392e982021-04-07 12:07:30 +0100179{
180 const std::string layerName("cast");
181
182 const armnn::TensorShape shape{1, 5, 2, 3};
183
184 const armnn::TensorInfo inputInfo = armnn::TensorInfo(shape, armnn::DataType::Signed32);
185 const armnn::TensorInfo outputInfo = armnn::TensorInfo(shape, armnn::DataType::Float32);
186
187 armnn::INetworkPtr network = armnn::INetwork::Create();
188 armnn::IConnectableLayer* inputLayer = network->AddInputLayer(0);
189 armnn::IConnectableLayer* castLayer = network->AddCastLayer(layerName.c_str());
190 armnn::IConnectableLayer* outputLayer = network->AddOutputLayer(0);
191
192 inputLayer->GetOutputSlot(0).Connect(castLayer->GetInputSlot(0));
193 castLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
194
195 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
196 castLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
197
198 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100199 CHECK(deserializedNetwork);
mathad01b392e982021-04-07 12:07:30 +0100200
201 LayerVerifierBase verifier(layerName, {inputInfo}, {outputInfo});
202 deserializedNetwork->ExecuteStrategy(verifier);
203}
204
Simon Obute51f67772021-09-03 15:50:13 +0100205TEST_CASE("SerializeChannelShuffle")
206{
207 const std::string layerName("channelShuffle");
208 const armnn::TensorInfo inputInfo({1, 9}, armnn::DataType::Float32);
209 const armnn::TensorInfo outputInfo({1, 9}, armnn::DataType::Float32);
210
211 armnn::ChannelShuffleDescriptor descriptor({3, 1});
212
213 armnn::INetworkPtr network = armnn::INetwork::Create();
214 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
215 armnn::IConnectableLayer* const ChannelShuffleLayer =
216 network->AddChannelShuffleLayer(descriptor, layerName.c_str());
217 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
218
219 inputLayer->GetOutputSlot(0).Connect(ChannelShuffleLayer->GetInputSlot(0));
220 ChannelShuffleLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
221
222 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
223 ChannelShuffleLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
224
225 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
226 CHECK(deserializedNetwork);
227
228 LayerVerifierBaseWithDescriptor<armnn::ChannelShuffleDescriptor> verifier(
229 layerName, {inputInfo}, {outputInfo}, descriptor);
230 deserializedNetwork->ExecuteStrategy(verifier);
231}
232
Sadik Armagan1625efc2021-06-10 18:24:34 +0100233TEST_CASE("SerializeComparison")
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100234{
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100235 const std::string layerName("comparison");
236
237 const armnn::TensorShape shape{2, 1, 2, 4};
238
239 const armnn::TensorInfo inputInfo = armnn::TensorInfo(shape, armnn::DataType::Float32);
240 const armnn::TensorInfo outputInfo = armnn::TensorInfo(shape, armnn::DataType::Boolean);
241
242 armnn::ComparisonDescriptor descriptor(armnn::ComparisonOperation::NotEqual);
243
244 armnn::INetworkPtr network = armnn::INetwork::Create();
245 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
246 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
247 armnn::IConnectableLayer* const comparisonLayer = network->AddComparisonLayer(descriptor, layerName.c_str());
248 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
249
250 inputLayer0->GetOutputSlot(0).Connect(comparisonLayer->GetInputSlot(0));
251 inputLayer1->GetOutputSlot(0).Connect(comparisonLayer->GetInputSlot(1));
252 comparisonLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
253
254 inputLayer0->GetOutputSlot(0).SetTensorInfo(inputInfo);
255 inputLayer1->GetOutputSlot(0).SetTensorInfo(inputInfo);
256 comparisonLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
257
258 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100259 CHECK(deserializedNetwork);
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100260
Finn Williamsb454c5c2021-02-09 15:56:23 +0000261 LayerVerifierBaseWithDescriptor<armnn::ComparisonDescriptor> verifier(layerName,
262 { inputInfo, inputInfo },
263 { outputInfo },
264 descriptor);
265 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100266}
267
Sadik Armagan1625efc2021-06-10 18:24:34 +0100268TEST_CASE("SerializeConstant")
Conor Kennedy76277882019-02-26 08:29:54 +0000269{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000270 class ConstantLayerVerifier : public LayerVerifierBase
Conor Kennedy76277882019-02-26 08:29:54 +0000271 {
272 public:
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000273 ConstantLayerVerifier(const std::string& layerName,
274 const std::vector<armnn::TensorInfo>& inputInfos,
275 const std::vector<armnn::TensorInfo>& outputInfos,
Finn Williamsb454c5c2021-02-09 15:56:23 +0000276 const std::vector<armnn::ConstTensor>& constants)
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100277 : LayerVerifierBase(layerName, inputInfos, outputInfos)
Finn Williamsb454c5c2021-02-09 15:56:23 +0000278 , m_Constants(constants) {}
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000279
Finn Williamsb454c5c2021-02-09 15:56:23 +0000280 void ExecuteStrategy(const armnn::IConnectableLayer* layer,
281 const armnn::BaseDescriptor& descriptor,
282 const std::vector<armnn::ConstTensor>& constants,
283 const char* name,
284 const armnn::LayerBindingId id = 0) override
Conor Kennedy76277882019-02-26 08:29:54 +0000285 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000286 armnn::IgnoreUnused(descriptor, id);
287
288 switch (layer->GetType())
289 {
290 case armnn::LayerType::Input: break;
291 case armnn::LayerType::Output: break;
292 case armnn::LayerType::Addition: break;
293 default:
294 {
295 this->VerifyNameAndConnections(layer, name);
296
297 for (std::size_t i = 0; i < constants.size(); i++)
298 {
299 CompareConstTensor(constants[i], m_Constants[i]);
300 }
301 }
302 }
Conor Kennedy76277882019-02-26 08:29:54 +0000303 }
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000304
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000305 private:
Finn Williamsb454c5c2021-02-09 15:56:23 +0000306 const std::vector<armnn::ConstTensor> m_Constants;
Conor Kennedy76277882019-02-26 08:29:54 +0000307 };
308
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000309 const std::string layerName("constant");
310 const armnn::TensorInfo info({ 2, 3 }, armnn::DataType::Float32);
Conor Kennedy76277882019-02-26 08:29:54 +0000311
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000312 std::vector<float> constantData = GenerateRandomData<float>(info.GetNumElements());
313 armnn::ConstTensor constTensor(info, constantData);
Conor Kennedy76277882019-02-26 08:29:54 +0000314
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000315 armnn::INetworkPtr network(armnn::INetwork::Create());
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000316 armnn::IConnectableLayer* input = network->AddInputLayer(0);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000317 armnn::IConnectableLayer* constant = network->AddConstantLayer(constTensor, layerName.c_str());
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000318 armnn::IConnectableLayer* add = network->AddAdditionLayer();
319 armnn::IConnectableLayer* output = network->AddOutputLayer(0);
Conor Kennedy76277882019-02-26 08:29:54 +0000320
321 input->GetOutputSlot(0).Connect(add->GetInputSlot(0));
322 constant->GetOutputSlot(0).Connect(add->GetInputSlot(1));
323 add->GetOutputSlot(0).Connect(output->GetInputSlot(0));
324
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000325 input->GetOutputSlot(0).SetTensorInfo(info);
326 constant->GetOutputSlot(0).SetTensorInfo(info);
327 add->GetOutputSlot(0).SetTensorInfo(info);
Conor Kennedy76277882019-02-26 08:29:54 +0000328
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000329 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100330 CHECK(deserializedNetwork);
Conor Kennedy76277882019-02-26 08:29:54 +0000331
Finn Williamsb454c5c2021-02-09 15:56:23 +0000332 ConstantLayerVerifier verifier(layerName, {}, {info}, {constTensor});
333 deserializedNetwork->ExecuteStrategy(verifier);
Conor Kennedy76277882019-02-26 08:29:54 +0000334}
335
Sadik Armagan1625efc2021-06-10 18:24:34 +0100336TEST_CASE("SerializeConvolution2d")
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000337{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000338 const std::string layerName("convolution2d");
339 const armnn::TensorInfo inputInfo ({ 1, 5, 5, 1 }, armnn::DataType::Float32);
340 const armnn::TensorInfo outputInfo({ 1, 3, 3, 1 }, armnn::DataType::Float32);
Saoirse Stewart263829c2019-02-19 15:54:14 +0000341
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000342 const armnn::TensorInfo weightsInfo({ 1, 3, 3, 1 }, armnn::DataType::Float32);
343 const armnn::TensorInfo biasesInfo ({ 1 }, armnn::DataType::Float32);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000344
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000345 std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements());
346 armnn::ConstTensor weights(weightsInfo, weightsData);
347
348 std::vector<float> biasesData = GenerateRandomData<float>(biasesInfo.GetNumElements());
349 armnn::ConstTensor biases(biasesInfo, biasesData);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000350
351 armnn::Convolution2dDescriptor descriptor;
352 descriptor.m_PadLeft = 1;
353 descriptor.m_PadRight = 1;
354 descriptor.m_PadTop = 1;
355 descriptor.m_PadBottom = 1;
356 descriptor.m_StrideX = 2;
357 descriptor.m_StrideY = 2;
Aron Virginas-Tar5e1b0cf2019-06-21 14:20:11 +0100358 descriptor.m_DilationX = 2;
359 descriptor.m_DilationY = 2;
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000360 descriptor.m_BiasEnabled = true;
361 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
362
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000363 armnn::INetworkPtr network = armnn::INetwork::Create();
364 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000365 armnn::IConnectableLayer* const convLayer =
Matteo Martincighfc598e12019-05-14 10:36:13 +0100366 network->AddConvolution2dLayer(descriptor,
367 weights,
368 armnn::Optional<armnn::ConstTensor>(biases),
369 layerName.c_str());
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000370 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000371
372 inputLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(0));
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000373 convLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000374
375 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000376 convLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
377
378 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100379 CHECK(deserializedNetwork);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000380
Finn Williamsb454c5c2021-02-09 15:56:23 +0000381 const std::vector<armnn::ConstTensor>& constants {weights, biases};
382 LayerVerifierBaseWithDescriptorAndConstants<armnn::Convolution2dDescriptor> verifier(
383 layerName, {inputInfo}, {outputInfo}, descriptor, constants);
384 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000385}
386
Sadik Armagan1625efc2021-06-10 18:24:34 +0100387TEST_CASE("SerializeConvolution2dWithPerAxisParams")
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000388{
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000389 using namespace armnn;
390
391 const std::string layerName("convolution2dWithPerAxis");
392 const TensorInfo inputInfo ({ 1, 3, 1, 2 }, DataType::QAsymmU8, 0.55f, 128);
393 const TensorInfo outputInfo({ 1, 3, 1, 3 }, DataType::QAsymmU8, 0.75f, 128);
394
395 const std::vector<float> quantScales{ 0.75f, 0.65f, 0.85f };
396 constexpr unsigned int quantDimension = 0;
397
398 const TensorInfo kernelInfo({ 3, 1, 1, 2 }, DataType::QSymmS8, quantScales, quantDimension);
399
400 const std::vector<float> biasQuantScales{ 0.25f, 0.50f, 0.75f };
401 const TensorInfo biasInfo({ 3 }, DataType::Signed32, biasQuantScales, quantDimension);
402
403 std::vector<int8_t> kernelData = GenerateRandomData<int8_t>(kernelInfo.GetNumElements());
404 armnn::ConstTensor weights(kernelInfo, kernelData);
405 std::vector<int32_t> biasData = GenerateRandomData<int32_t>(biasInfo.GetNumElements());
406 armnn::ConstTensor biases(biasInfo, biasData);
407
408 Convolution2dDescriptor descriptor;
409 descriptor.m_StrideX = 1;
410 descriptor.m_StrideY = 1;
411 descriptor.m_PadLeft = 0;
412 descriptor.m_PadRight = 0;
413 descriptor.m_PadTop = 0;
414 descriptor.m_PadBottom = 0;
415 descriptor.m_BiasEnabled = true;
416 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
417
418 armnn::INetworkPtr network = armnn::INetwork::Create();
419 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
420 armnn::IConnectableLayer* const convLayer =
421 network->AddConvolution2dLayer(descriptor,
422 weights,
423 armnn::Optional<armnn::ConstTensor>(biases),
424 layerName.c_str());
425 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
426
427 inputLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(0));
428 convLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
429
430 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
431 convLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
432
433 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100434 CHECK(deserializedNetwork);
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000435
Finn Williamsb454c5c2021-02-09 15:56:23 +0000436 const std::vector<armnn::ConstTensor>& constants {weights, biases};
437 LayerVerifierBaseWithDescriptorAndConstants<Convolution2dDescriptor> verifier(
438 layerName, {inputInfo}, {outputInfo}, descriptor, constants);
439 deserializedNetwork->ExecuteStrategy(verifier);
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000440}
441
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100442TEST_CASE("SerializeConvolution3d")
443{
444 const std::string layerName("convolution3d");
445 const armnn::TensorInfo inputInfo ({ 1, 5, 5, 5, 1 }, armnn::DataType::Float32);
446 const armnn::TensorInfo outputInfo({ 1, 2, 2, 2, 1 }, armnn::DataType::Float32);
447
448 const armnn::TensorInfo weightsInfo({ 3, 3, 3, 1, 1 }, armnn::DataType::Float32);
449 const armnn::TensorInfo biasesInfo ({ 1 }, armnn::DataType::Float32);
450
451 std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements());
452 armnn::ConstTensor weights(weightsInfo, weightsData);
453
454 std::vector<float> biasesData = GenerateRandomData<float>(biasesInfo.GetNumElements());
455 armnn::ConstTensor biases(biasesInfo, biasesData);
456
457 armnn::Convolution3dDescriptor descriptor;
458 descriptor.m_PadLeft = 0;
459 descriptor.m_PadRight = 0;
460 descriptor.m_PadTop = 0;
461 descriptor.m_PadBottom = 0;
462 descriptor.m_PadFront = 0;
463 descriptor.m_PadBack = 0;
464 descriptor.m_DilationX = 1;
465 descriptor.m_DilationY = 1;
466 descriptor.m_DilationZ = 1;
467 descriptor.m_StrideX = 2;
468 descriptor.m_StrideY = 2;
469 descriptor.m_StrideZ = 2;
470 descriptor.m_BiasEnabled = true;
471 descriptor.m_DataLayout = armnn::DataLayout::NDHWC;
472
473 armnn::INetworkPtr network = armnn::INetwork::Create();
474 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
475 armnn::IConnectableLayer* const convLayer =
476 network->AddConvolution3dLayer(descriptor,
477 weights,
478 armnn::Optional<armnn::ConstTensor>(biases),
479 layerName.c_str());
480 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
481
482 inputLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(0));
483 convLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
484
485 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
486 convLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
487
488 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
489 CHECK(deserializedNetwork);
490
491 const std::vector<armnn::ConstTensor>& constants {weights, biases};
492 LayerVerifierBaseWithDescriptorAndConstants<armnn::Convolution3dDescriptor> verifier(
493 layerName, {inputInfo}, {outputInfo}, descriptor, constants);
494 deserializedNetwork->ExecuteStrategy(verifier);
495}
496
Sadik Armagan1625efc2021-06-10 18:24:34 +0100497TEST_CASE("SerializeDepthToSpace")
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100498{
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100499 const std::string layerName("depthToSpace");
500
501 const armnn::TensorInfo inputInfo ({ 1, 8, 4, 12 }, armnn::DataType::Float32);
502 const armnn::TensorInfo outputInfo({ 1, 16, 8, 3 }, armnn::DataType::Float32);
503
504 armnn::DepthToSpaceDescriptor desc;
505 desc.m_BlockSize = 2;
506 desc.m_DataLayout = armnn::DataLayout::NHWC;
507
508 armnn::INetworkPtr network = armnn::INetwork::Create();
509 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
510 armnn::IConnectableLayer* const depthToSpaceLayer = network->AddDepthToSpaceLayer(desc, layerName.c_str());
511 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
512
513 inputLayer->GetOutputSlot(0).Connect(depthToSpaceLayer->GetInputSlot(0));
514 depthToSpaceLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
515
516 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
517 depthToSpaceLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
518
519 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100520 CHECK(deserializedNetwork);
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100521
Finn Williamsb454c5c2021-02-09 15:56:23 +0000522 LayerVerifierBaseWithDescriptor<armnn::DepthToSpaceDescriptor> verifier(layerName, {inputInfo}, {outputInfo}, desc);
523 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100524}
525
Sadik Armagan1625efc2021-06-10 18:24:34 +0100526TEST_CASE("SerializeDepthwiseConvolution2d")
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000527{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000528 const std::string layerName("depwiseConvolution2d");
529 const armnn::TensorInfo inputInfo ({ 1, 5, 5, 3 }, armnn::DataType::Float32);
530 const armnn::TensorInfo outputInfo({ 1, 3, 3, 3 }, armnn::DataType::Float32);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000531
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000532 const armnn::TensorInfo weightsInfo({ 1, 3, 3, 3 }, armnn::DataType::Float32);
533 const armnn::TensorInfo biasesInfo ({ 3 }, armnn::DataType::Float32);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000534
535 std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements());
536 armnn::ConstTensor weights(weightsInfo, weightsData);
537
538 std::vector<int32_t> biasesData = GenerateRandomData<int32_t>(biasesInfo.GetNumElements());
539 armnn::ConstTensor biases(biasesInfo, biasesData);
540
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000541 armnn::DepthwiseConvolution2dDescriptor descriptor;
Aron Virginas-Tar5e1b0cf2019-06-21 14:20:11 +0100542 descriptor.m_PadLeft = 1;
543 descriptor.m_PadRight = 1;
544 descriptor.m_PadTop = 1;
545 descriptor.m_PadBottom = 1;
546 descriptor.m_StrideX = 2;
547 descriptor.m_StrideY = 2;
548 descriptor.m_DilationX = 2;
549 descriptor.m_DilationY = 2;
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000550 descriptor.m_BiasEnabled = true;
551 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
552
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000553 armnn::INetworkPtr network = armnn::INetwork::Create();
554 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
555 armnn::IConnectableLayer* const depthwiseConvLayer =
Matteo Martincighfc598e12019-05-14 10:36:13 +0100556 network->AddDepthwiseConvolution2dLayer(descriptor,
557 weights,
558 armnn::Optional<armnn::ConstTensor>(biases),
559 layerName.c_str());
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000560 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
561
562 inputLayer->GetOutputSlot(0).Connect(depthwiseConvLayer->GetInputSlot(0));
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000563 depthwiseConvLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000564
565 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000566 depthwiseConvLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
567
568 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100569 CHECK(deserializedNetwork);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000570
Finn Williamsb454c5c2021-02-09 15:56:23 +0000571 const std::vector<armnn::ConstTensor>& constants {weights, biases};
572 LayerVerifierBaseWithDescriptorAndConstants<armnn::DepthwiseConvolution2dDescriptor> verifier(
573 layerName, {inputInfo}, {outputInfo}, descriptor, constants);
574 deserializedNetwork->ExecuteStrategy(verifier);
Jim Flynn18ce3382019-03-08 11:08:30 +0000575}
576
Sadik Armagan1625efc2021-06-10 18:24:34 +0100577TEST_CASE("SerializeDepthwiseConvolution2dWithPerAxisParams")
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000578{
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000579 using namespace armnn;
580
581 const std::string layerName("depwiseConvolution2dWithPerAxis");
582 const TensorInfo inputInfo ({ 1, 3, 3, 2 }, DataType::QAsymmU8, 0.55f, 128);
583 const TensorInfo outputInfo({ 1, 2, 2, 4 }, DataType::QAsymmU8, 0.75f, 128);
584
585 const std::vector<float> quantScales{ 0.75f, 0.80f, 0.90f, 0.95f };
586 const unsigned int quantDimension = 0;
587 TensorInfo kernelInfo({ 2, 2, 2, 2 }, DataType::QSymmS8, quantScales, quantDimension);
588
589 const std::vector<float> biasQuantScales{ 0.25f, 0.35f, 0.45f, 0.55f };
590 constexpr unsigned int biasQuantDimension = 0;
591 TensorInfo biasInfo({ 4 }, DataType::Signed32, biasQuantScales, biasQuantDimension);
592
593 std::vector<int8_t> kernelData = GenerateRandomData<int8_t>(kernelInfo.GetNumElements());
594 armnn::ConstTensor weights(kernelInfo, kernelData);
595 std::vector<int32_t> biasData = GenerateRandomData<int32_t>(biasInfo.GetNumElements());
596 armnn::ConstTensor biases(biasInfo, biasData);
597
598 DepthwiseConvolution2dDescriptor descriptor;
599 descriptor.m_StrideX = 1;
600 descriptor.m_StrideY = 1;
601 descriptor.m_PadLeft = 0;
602 descriptor.m_PadRight = 0;
603 descriptor.m_PadTop = 0;
604 descriptor.m_PadBottom = 0;
605 descriptor.m_DilationX = 1;
606 descriptor.m_DilationY = 1;
607 descriptor.m_BiasEnabled = true;
608 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
609
610 armnn::INetworkPtr network = armnn::INetwork::Create();
611 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
612 armnn::IConnectableLayer* const depthwiseConvLayer =
613 network->AddDepthwiseConvolution2dLayer(descriptor,
614 weights,
615 armnn::Optional<armnn::ConstTensor>(biases),
616 layerName.c_str());
617 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
618
619 inputLayer->GetOutputSlot(0).Connect(depthwiseConvLayer->GetInputSlot(0));
620 depthwiseConvLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
621
622 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
623 depthwiseConvLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
624
625 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100626 CHECK(deserializedNetwork);
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000627
Finn Williamsb454c5c2021-02-09 15:56:23 +0000628 const std::vector<armnn::ConstTensor>& constants {weights, biases};
629 LayerVerifierBaseWithDescriptorAndConstants<armnn::DepthwiseConvolution2dDescriptor> verifier(
630 layerName, {inputInfo}, {outputInfo}, descriptor, constants);
631 deserializedNetwork->ExecuteStrategy(verifier);
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000632}
633
Sadik Armagan1625efc2021-06-10 18:24:34 +0100634TEST_CASE("SerializeDequantize")
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000635{
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000636 const std::string layerName("dequantize");
Derek Lambertif90c56d2020-01-10 17:14:08 +0000637 const armnn::TensorInfo inputInfo({ 1, 5, 2, 3 }, armnn::DataType::QAsymmU8, 0.5f, 1);
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000638 const armnn::TensorInfo outputInfo({ 1, 5, 2, 3 }, armnn::DataType::Float32);
639
640 armnn::INetworkPtr network = armnn::INetwork::Create();
641 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
642 armnn::IConnectableLayer* const dequantizeLayer = network->AddDequantizeLayer(layerName.c_str());
643 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
644
645 inputLayer->GetOutputSlot(0).Connect(dequantizeLayer->GetInputSlot(0));
646 dequantizeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
647
648 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
649 dequantizeLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
650
651 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100652 CHECK(deserializedNetwork);
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000653
Finn Williamsb454c5c2021-02-09 15:56:23 +0000654 LayerVerifierBase verifier(layerName, {inputInfo}, {outputInfo});
655 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000656}
657
Sadik Armagan1625efc2021-06-10 18:24:34 +0100658TEST_CASE("SerializeDeserializeDetectionPostProcess")
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000659{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000660 const std::string layerName("detectionPostProcess");
661
662 const std::vector<armnn::TensorInfo> inputInfos({
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000663 armnn::TensorInfo({ 1, 6, 4 }, armnn::DataType::Float32),
664 armnn::TensorInfo({ 1, 6, 3}, armnn::DataType::Float32)
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000665 });
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000666
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000667 const std::vector<armnn::TensorInfo> outputInfos({
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000668 armnn::TensorInfo({ 1, 3, 4 }, armnn::DataType::Float32),
669 armnn::TensorInfo({ 1, 3 }, armnn::DataType::Float32),
670 armnn::TensorInfo({ 1, 3 }, armnn::DataType::Float32),
671 armnn::TensorInfo({ 1 }, armnn::DataType::Float32)
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000672 });
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000673
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000674 armnn::DetectionPostProcessDescriptor descriptor;
675 descriptor.m_UseRegularNms = true;
676 descriptor.m_MaxDetections = 3;
677 descriptor.m_MaxClassesPerDetection = 1;
678 descriptor.m_DetectionsPerClass =1;
679 descriptor.m_NmsScoreThreshold = 0.0;
680 descriptor.m_NmsIouThreshold = 0.5;
681 descriptor.m_NumClasses = 2;
682 descriptor.m_ScaleY = 10.0;
683 descriptor.m_ScaleX = 10.0;
684 descriptor.m_ScaleH = 5.0;
685 descriptor.m_ScaleW = 5.0;
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000686
687 const armnn::TensorInfo anchorsInfo({ 6, 4 }, armnn::DataType::Float32);
688 const std::vector<float> anchorsData({
689 0.5f, 0.5f, 1.0f, 1.0f,
690 0.5f, 0.5f, 1.0f, 1.0f,
691 0.5f, 0.5f, 1.0f, 1.0f,
692 0.5f, 10.5f, 1.0f, 1.0f,
693 0.5f, 10.5f, 1.0f, 1.0f,
694 0.5f, 100.5f, 1.0f, 1.0f
695 });
696 armnn::ConstTensor anchors(anchorsInfo, anchorsData);
697
698 armnn::INetworkPtr network = armnn::INetwork::Create();
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000699 armnn::IConnectableLayer* const detectionLayer =
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000700 network->AddDetectionPostProcessLayer(descriptor, anchors, layerName.c_str());
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000701
702 for (unsigned int i = 0; i < 2; i++)
703 {
704 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(static_cast<int>(i));
705 inputLayer->GetOutputSlot(0).Connect(detectionLayer->GetInputSlot(i));
706 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfos[i]);
707 }
708
709 for (unsigned int i = 0; i < 4; i++)
710 {
711 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(static_cast<int>(i));
712 detectionLayer->GetOutputSlot(i).Connect(outputLayer->GetInputSlot(0));
713 detectionLayer->GetOutputSlot(i).SetTensorInfo(outputInfos[i]);
714 }
715
716 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100717 CHECK(deserializedNetwork);
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000718
Finn Williamsb454c5c2021-02-09 15:56:23 +0000719 const std::vector<armnn::ConstTensor>& constants {anchors};
720 LayerVerifierBaseWithDescriptorAndConstants<armnn::DetectionPostProcessDescriptor> verifier(
721 layerName, inputInfos, outputInfos, descriptor, constants);
722 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000723}
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000724
Sadik Armagan1625efc2021-06-10 18:24:34 +0100725TEST_CASE("SerializeDivision")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000726{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000727 const std::string layerName("division");
728 const armnn::TensorInfo info({ 1, 5, 2, 3 }, armnn::DataType::Float32);
729
730 armnn::INetworkPtr network = armnn::INetwork::Create();
731 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
732 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
733 armnn::IConnectableLayer* const divisionLayer = network->AddDivisionLayer(layerName.c_str());
734 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
735
736 inputLayer0->GetOutputSlot(0).Connect(divisionLayer->GetInputSlot(0));
737 inputLayer1->GetOutputSlot(0).Connect(divisionLayer->GetInputSlot(1));
738 divisionLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
739
740 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
741 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
742 divisionLayer->GetOutputSlot(0).SetTensorInfo(info);
743
744 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100745 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000746
Finn Williamsb454c5c2021-02-09 15:56:23 +0000747 LayerVerifierBase verifier(layerName, {info, info}, {info});
748 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000749}
750
Sadik Armagan1625efc2021-06-10 18:24:34 +0100751TEST_CASE("SerializeDeserializeEqual")
Aron Virginas-Tar6d2e6592019-10-22 11:44:47 +0100752{
Finn Williamsb454c5c2021-02-09 15:56:23 +0000753 const std::string layerName("EqualLayer");
754 const armnn::TensorInfo inputTensorInfo1 = armnn::TensorInfo({2, 1, 2, 4}, armnn::DataType::Float32);
755 const armnn::TensorInfo inputTensorInfo2 = armnn::TensorInfo({2, 1, 2, 4}, armnn::DataType::Float32);
756 const armnn::TensorInfo outputTensorInfo = armnn::TensorInfo({2, 1, 2, 4}, armnn::DataType::Boolean);
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100757
758 armnn::INetworkPtr network = armnn::INetwork::Create();
Finn Williamsb454c5c2021-02-09 15:56:23 +0000759 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(0);
760 armnn::IConnectableLayer* const inputLayer2 = network->AddInputLayer(1);
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100761 ARMNN_NO_DEPRECATE_WARN_BEGIN
762 armnn::IConnectableLayer* const equalLayer = network->AddEqualLayer(layerName.c_str());
763 ARMNN_NO_DEPRECATE_WARN_END
764 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
765
Finn Williamsb454c5c2021-02-09 15:56:23 +0000766 inputLayer1->GetOutputSlot(0).Connect(equalLayer->GetInputSlot(0));
767 inputLayer1->GetOutputSlot(0).SetTensorInfo(inputTensorInfo1);
768 inputLayer2->GetOutputSlot(0).Connect(equalLayer->GetInputSlot(1));
769 inputLayer2->GetOutputSlot(0).SetTensorInfo(inputTensorInfo2);
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100770 equalLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
Finn Williamsb454c5c2021-02-09 15:56:23 +0000771 equalLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100772
773 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100774 CHECK(deserializedNetwork);
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100775
Finn Williamsb454c5c2021-02-09 15:56:23 +0000776 LayerVerifierBase verifier(layerName, {inputTensorInfo1, inputTensorInfo2}, {outputTensorInfo});
777 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tar6d2e6592019-10-22 11:44:47 +0100778}
779
Teresa Charlin50de4fa2021-05-31 18:47:33 +0100780void SerializeElementwiseUnaryTest(armnn::UnaryOperation unaryOperation)
781{
782 auto layerName = GetUnaryOperationAsCString(unaryOperation);
783
784 const armnn::TensorShape shape{2, 1, 2, 2};
785
786 const armnn::TensorInfo inputInfo = armnn::TensorInfo(shape, armnn::DataType::Float32);
787 const armnn::TensorInfo outputInfo = armnn::TensorInfo(shape, armnn::DataType::Float32);
788
789 armnn::ElementwiseUnaryDescriptor descriptor(unaryOperation);
790
791 armnn::INetworkPtr network = armnn::INetwork::Create();
792 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
793 armnn::IConnectableLayer* const elementwiseUnaryLayer =
794 network->AddElementwiseUnaryLayer(descriptor, layerName);
795 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
796
797 inputLayer->GetOutputSlot(0).Connect(elementwiseUnaryLayer->GetInputSlot(0));
798 elementwiseUnaryLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
799
800 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
801 elementwiseUnaryLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
802
803 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
804
805 CHECK(deserializedNetwork);
806
807 LayerVerifierBaseWithDescriptor<armnn::ElementwiseUnaryDescriptor>
808 verifier(layerName, { inputInfo }, { outputInfo }, descriptor);
809
810 deserializedNetwork->ExecuteStrategy(verifier);
811}
812
813TEST_CASE("SerializeElementwiseUnary")
814{
815 using op = armnn::UnaryOperation;
816 std::initializer_list<op> allUnaryOperations = {op::Abs, op::Exp, op::Sqrt, op::Rsqrt, op::Neg,
817 op::LogicalNot, op::Log, op::Sin};
818
819 for (auto unaryOperation : allUnaryOperations)
820 {
821 SerializeElementwiseUnaryTest(unaryOperation);
822 }
823}
824
Sadik Armagan1625efc2021-06-10 18:24:34 +0100825TEST_CASE("SerializeFill")
Keith Davis300ad562020-06-04 16:34:23 +0100826{
Keith Davis300ad562020-06-04 16:34:23 +0100827 const std::string layerName("fill");
Teresa Charlin4b10fef2020-07-29 09:36:41 +0100828 const armnn::TensorInfo inputInfo({4}, armnn::DataType::Signed32);
Keith Davis300ad562020-06-04 16:34:23 +0100829 const armnn::TensorInfo outputInfo({1, 3, 3, 1}, armnn::DataType::Float32);
830
831 armnn::FillDescriptor descriptor(1.0f);
832
833 armnn::INetworkPtr network = armnn::INetwork::Create();
834 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
835 armnn::IConnectableLayer* const fillLayer = network->AddFillLayer(descriptor, layerName.c_str());
836 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
837
838 inputLayer->GetOutputSlot(0).Connect(fillLayer->GetInputSlot(0));
839 fillLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
840
841 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
842 fillLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
843
844 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100845 CHECK(deserializedNetwork);
Keith Davis300ad562020-06-04 16:34:23 +0100846
Finn Williamsb454c5c2021-02-09 15:56:23 +0000847 LayerVerifierBaseWithDescriptor<armnn::FillDescriptor> verifier(layerName, {inputInfo}, {outputInfo}, descriptor);
Keith Davis300ad562020-06-04 16:34:23 +0100848
Finn Williamsb454c5c2021-02-09 15:56:23 +0000849 deserializedNetwork->ExecuteStrategy(verifier);
Keith Davis300ad562020-06-04 16:34:23 +0100850}
851
Sadik Armagan1625efc2021-06-10 18:24:34 +0100852TEST_CASE("SerializeFloor")
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100853{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000854 const std::string layerName("floor");
855 const armnn::TensorInfo info({4,4}, armnn::DataType::Float32);
856
857 armnn::INetworkPtr network = armnn::INetwork::Create();
858 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
859 armnn::IConnectableLayer* const floorLayer = network->AddFloorLayer(layerName.c_str());
860 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
861
862 inputLayer->GetOutputSlot(0).Connect(floorLayer->GetInputSlot(0));
863 floorLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
864
865 inputLayer->GetOutputSlot(0).SetTensorInfo(info);
866 floorLayer->GetOutputSlot(0).SetTensorInfo(info);
867
868 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100869 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000870
Finn Williamsb454c5c2021-02-09 15:56:23 +0000871 LayerVerifierBase verifier(layerName, {info}, {info});
872 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000873}
874
Matthew Sloyan81beae32021-07-13 19:46:11 +0100875using FullyConnectedDescriptor = armnn::FullyConnectedDescriptor;
876class FullyConnectedLayerVerifier : public LayerVerifierBaseWithDescriptor<FullyConnectedDescriptor>
877{
878public:
879 FullyConnectedLayerVerifier(const std::string& layerName,
880 const std::vector<armnn::TensorInfo>& inputInfos,
881 const std::vector<armnn::TensorInfo>& outputInfos,
882 const FullyConnectedDescriptor& descriptor)
883 : LayerVerifierBaseWithDescriptor<FullyConnectedDescriptor>(layerName, inputInfos, outputInfos, descriptor) {}
884
885 void ExecuteStrategy(const armnn::IConnectableLayer* layer,
886 const armnn::BaseDescriptor& descriptor,
887 const std::vector<armnn::ConstTensor>& constants,
888 const char* name,
889 const armnn::LayerBindingId id = 0) override
890 {
891 armnn::IgnoreUnused(constants, id);
892 switch (layer->GetType())
893 {
894 case armnn::LayerType::Input: break;
895 case armnn::LayerType::Output: break;
896 case armnn::LayerType::Constant: break;
897 default:
898 {
899 VerifyNameAndConnections(layer, name);
900 const FullyConnectedDescriptor& layerDescriptor =
901 static_cast<const FullyConnectedDescriptor&>(descriptor);
902 CHECK(layerDescriptor.m_ConstantWeights == m_Descriptor.m_ConstantWeights);
903 CHECK(layerDescriptor.m_BiasEnabled == m_Descriptor.m_BiasEnabled);
904 CHECK(layerDescriptor.m_TransposeWeightMatrix == m_Descriptor.m_TransposeWeightMatrix);
905 }
906 }
907 }
908};
909
Sadik Armagan1625efc2021-06-10 18:24:34 +0100910TEST_CASE("SerializeFullyConnected")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000911{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000912 const std::string layerName("fullyConnected");
913 const armnn::TensorInfo inputInfo ({ 2, 5, 1, 1 }, armnn::DataType::Float32);
914 const armnn::TensorInfo outputInfo({ 2, 3 }, armnn::DataType::Float32);
915
916 const armnn::TensorInfo weightsInfo({ 5, 3 }, armnn::DataType::Float32);
917 const armnn::TensorInfo biasesInfo ({ 3 }, armnn::DataType::Float32);
918 std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements());
919 std::vector<float> biasesData = GenerateRandomData<float>(biasesInfo.GetNumElements());
920 armnn::ConstTensor weights(weightsInfo, weightsData);
921 armnn::ConstTensor biases(biasesInfo, biasesData);
922
923 armnn::FullyConnectedDescriptor descriptor;
924 descriptor.m_BiasEnabled = true;
925 descriptor.m_TransposeWeightMatrix = false;
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000926 descriptor.m_ConstantWeights = true;
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000927
928 armnn::INetworkPtr network = armnn::INetwork::Create();
929 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
Matthew Sloyan81beae32021-07-13 19:46:11 +0100930
931 // Old way of handling constant tensors.
932 ARMNN_NO_DEPRECATE_WARN_BEGIN
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000933 armnn::IConnectableLayer* const fullyConnectedLayer =
Matteo Martincighfc598e12019-05-14 10:36:13 +0100934 network->AddFullyConnectedLayer(descriptor,
935 weights,
936 armnn::Optional<armnn::ConstTensor>(biases),
937 layerName.c_str());
Matthew Sloyan81beae32021-07-13 19:46:11 +0100938 ARMNN_NO_DEPRECATE_WARN_END
939
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000940 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
941
942 inputLayer->GetOutputSlot(0).Connect(fullyConnectedLayer->GetInputSlot(0));
943 fullyConnectedLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
944
945 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
946 fullyConnectedLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
947
948 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100949 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000950
Matthew Sloyan81beae32021-07-13 19:46:11 +0100951 FullyConnectedLayerVerifier verifier(layerName, {inputInfo, weightsInfo, biasesInfo}, {outputInfo}, descriptor);
Finn Williamsb454c5c2021-02-09 15:56:23 +0000952 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000953}
954
Matthew Sloyan81beae32021-07-13 19:46:11 +0100955TEST_CASE("SerializeFullyConnectedWeightsAndBiasesAsInputs")
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000956{
957 const std::string layerName("fullyConnected_weights_as_inputs");
958 const armnn::TensorInfo inputInfo ({ 2, 5, 1, 1 }, armnn::DataType::Float32);
959 const armnn::TensorInfo outputInfo({ 2, 3 }, armnn::DataType::Float32);
960
961 const armnn::TensorInfo weightsInfo({ 5, 3 }, armnn::DataType::Float32);
962 const armnn::TensorInfo biasesInfo ({ 3 }, armnn::DataType::Float32);
963
964 armnn::Optional<armnn::ConstTensor> weights = armnn::EmptyOptional();
965 armnn::Optional<armnn::ConstTensor> bias = armnn::EmptyOptional();
966
967 armnn::FullyConnectedDescriptor descriptor;
968 descriptor.m_BiasEnabled = true;
969 descriptor.m_TransposeWeightMatrix = false;
970 descriptor.m_ConstantWeights = false;
971
972 armnn::INetworkPtr network = armnn::INetwork::Create();
973 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
974 armnn::IConnectableLayer* const weightsInputLayer = network->AddInputLayer(1);
975 armnn::IConnectableLayer* const biasInputLayer = network->AddInputLayer(2);
976 armnn::IConnectableLayer* const fullyConnectedLayer =
977 network->AddFullyConnectedLayer(descriptor,
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000978 layerName.c_str());
979 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
980
981 inputLayer->GetOutputSlot(0).Connect(fullyConnectedLayer->GetInputSlot(0));
982 weightsInputLayer->GetOutputSlot(0).Connect(fullyConnectedLayer->GetInputSlot(1));
983 biasInputLayer->GetOutputSlot(0).Connect(fullyConnectedLayer->GetInputSlot(2));
984 fullyConnectedLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
985
986 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
987 weightsInputLayer->GetOutputSlot(0).SetTensorInfo(weightsInfo);
988 biasInputLayer->GetOutputSlot(0).SetTensorInfo(biasesInfo);
989 fullyConnectedLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
990
991 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100992 CHECK(deserializedNetwork);
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000993
994 const std::vector<armnn::ConstTensor> constants {};
995 LayerVerifierBaseWithDescriptorAndConstants<armnn::FullyConnectedDescriptor> verifier(
996 layerName, {inputInfo, weightsInfo, biasesInfo}, {outputInfo}, descriptor, constants);
997 deserializedNetwork->ExecuteStrategy(verifier);
998}
999
Matthew Sloyan81beae32021-07-13 19:46:11 +01001000TEST_CASE("SerializeFullyConnectedWeightsAndBiasesAsConstantLayers")
1001{
1002 const std::string layerName("fullyConnected_weights_as_inputs");
1003 const armnn::TensorInfo inputInfo ({ 2, 5, 1, 1 }, armnn::DataType::Float32);
1004 const armnn::TensorInfo outputInfo({ 2, 3 }, armnn::DataType::Float32);
1005
1006 const armnn::TensorInfo weightsInfo({ 5, 3 }, armnn::DataType::Float32);
1007 const armnn::TensorInfo biasesInfo ({ 3 }, armnn::DataType::Float32);
1008
1009 std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements());
1010 std::vector<float> biasesData = GenerateRandomData<float>(biasesInfo.GetNumElements());
1011 armnn::ConstTensor weights(weightsInfo, weightsData);
1012 armnn::ConstTensor biases(biasesInfo, biasesData);
1013
1014 armnn::FullyConnectedDescriptor descriptor;
1015 descriptor.m_BiasEnabled = true;
1016 descriptor.m_TransposeWeightMatrix = false;
1017 descriptor.m_ConstantWeights = true;
1018
1019 armnn::INetworkPtr network = armnn::INetwork::Create();
1020 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1021 armnn::IConnectableLayer* const weightsLayer = network->AddConstantLayer(weights, "Weights");
1022 armnn::IConnectableLayer* const biasesLayer = network->AddConstantLayer(biases, "Biases");
1023 armnn::IConnectableLayer* const fullyConnectedLayer = network->AddFullyConnectedLayer(descriptor,layerName.c_str());
1024 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1025
1026 inputLayer->GetOutputSlot(0).Connect(fullyConnectedLayer->GetInputSlot(0));
1027 weightsLayer->GetOutputSlot(0).Connect(fullyConnectedLayer->GetInputSlot(1));
1028 biasesLayer->GetOutputSlot(0).Connect(fullyConnectedLayer->GetInputSlot(2));
1029 fullyConnectedLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1030
1031 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
1032 weightsLayer->GetOutputSlot(0).SetTensorInfo(weightsInfo);
1033 biasesLayer->GetOutputSlot(0).SetTensorInfo(biasesInfo);
1034 fullyConnectedLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1035
1036 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
1037 CHECK(deserializedNetwork);
1038
1039 FullyConnectedLayerVerifier verifier(layerName, {inputInfo, weightsInfo, biasesInfo}, {outputInfo}, descriptor);
1040 deserializedNetwork->ExecuteStrategy(verifier);
1041}
1042
Sadik Armagan1625efc2021-06-10 18:24:34 +01001043TEST_CASE("SerializeGather")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001044{
Teresa Charlin52664732020-06-29 16:27:03 +01001045 using GatherDescriptor = armnn::GatherDescriptor;
1046 class GatherLayerVerifier : public LayerVerifierBaseWithDescriptor<GatherDescriptor>
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001047 {
1048 public:
1049 GatherLayerVerifier(const std::string& layerName,
1050 const std::vector<armnn::TensorInfo>& inputInfos,
Teresa Charlin52664732020-06-29 16:27:03 +01001051 const std::vector<armnn::TensorInfo>& outputInfos,
1052 const GatherDescriptor& descriptor)
1053 : LayerVerifierBaseWithDescriptor<GatherDescriptor>(layerName, inputInfos, outputInfos, descriptor) {}
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001054
Finn Williamsb454c5c2021-02-09 15:56:23 +00001055 void ExecuteStrategy(const armnn::IConnectableLayer* layer,
1056 const armnn::BaseDescriptor& descriptor,
1057 const std::vector<armnn::ConstTensor>& constants,
1058 const char* name,
1059 const armnn::LayerBindingId id = 0) override
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001060 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001061 armnn::IgnoreUnused(constants, id);
1062 switch (layer->GetType())
1063 {
1064 case armnn::LayerType::Input: break;
1065 case armnn::LayerType::Output: break;
1066 case armnn::LayerType::Constant: break;
1067 default:
1068 {
1069 VerifyNameAndConnections(layer, name);
1070 const GatherDescriptor& layerDescriptor = static_cast<const GatherDescriptor&>(descriptor);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001071 CHECK(layerDescriptor.m_Axis == m_Descriptor.m_Axis);
Finn Williamsb454c5c2021-02-09 15:56:23 +00001072 }
1073 }
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001074 }
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001075 };
1076
1077 const std::string layerName("gather");
Derek Lambertif90c56d2020-01-10 17:14:08 +00001078 armnn::TensorInfo paramsInfo({ 8 }, armnn::DataType::QAsymmU8);
1079 armnn::TensorInfo outputInfo({ 3 }, armnn::DataType::QAsymmU8);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001080 const armnn::TensorInfo indicesInfo({ 3 }, armnn::DataType::Signed32);
Teresa Charlin52664732020-06-29 16:27:03 +01001081 GatherDescriptor descriptor;
1082 descriptor.m_Axis = 1;
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001083
1084 paramsInfo.SetQuantizationScale(1.0f);
1085 paramsInfo.SetQuantizationOffset(0);
1086 outputInfo.SetQuantizationScale(1.0f);
1087 outputInfo.SetQuantizationOffset(0);
1088
1089 const std::vector<int32_t>& indicesData = {7, 6, 5};
1090
1091 armnn::INetworkPtr network = armnn::INetwork::Create();
1092 armnn::IConnectableLayer *const inputLayer = network->AddInputLayer(0);
1093 armnn::IConnectableLayer *const constantLayer =
1094 network->AddConstantLayer(armnn::ConstTensor(indicesInfo, indicesData));
Teresa Charlin52664732020-06-29 16:27:03 +01001095 armnn::IConnectableLayer *const gatherLayer = network->AddGatherLayer(descriptor, layerName.c_str());
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001096 armnn::IConnectableLayer *const outputLayer = network->AddOutputLayer(0);
1097
1098 inputLayer->GetOutputSlot(0).Connect(gatherLayer->GetInputSlot(0));
1099 constantLayer->GetOutputSlot(0).Connect(gatherLayer->GetInputSlot(1));
1100 gatherLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1101
1102 inputLayer->GetOutputSlot(0).SetTensorInfo(paramsInfo);
1103 constantLayer->GetOutputSlot(0).SetTensorInfo(indicesInfo);
1104 gatherLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1105
1106 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001107 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001108
Teresa Charlin52664732020-06-29 16:27:03 +01001109 GatherLayerVerifier verifier(layerName, {paramsInfo, indicesInfo}, {outputInfo}, descriptor);
Finn Williamsb454c5c2021-02-09 15:56:23 +00001110 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001111}
1112
Aron Virginas-Tar6d2e6592019-10-22 11:44:47 +01001113
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01001114// NOTE: Until the deprecated AddGreaterLayer disappears this test checks that calling
1115// AddGreaterLayer places a ComparisonLayer into the serialized format and that
1116// when this deserialises we have a ComparisonLayer
Sadik Armagan1625efc2021-06-10 18:24:34 +01001117TEST_CASE("SerializeGreaterDeprecated")
Aron Virginas-Tar781ced92019-10-03 11:15:39 +01001118{
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01001119 const std::string layerName("greater");
1120
1121 const armnn::TensorShape shape{2, 1, 2, 4};
1122
1123 const armnn::TensorInfo inputInfo = armnn::TensorInfo(shape, armnn::DataType::Float32);
1124 const armnn::TensorInfo outputInfo = armnn::TensorInfo(shape, armnn::DataType::Boolean);
1125
1126 armnn::INetworkPtr network = armnn::INetwork::Create();
1127 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
1128 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
1129 ARMNN_NO_DEPRECATE_WARN_BEGIN
1130 armnn::IConnectableLayer* const equalLayer = network->AddGreaterLayer(layerName.c_str());
1131 ARMNN_NO_DEPRECATE_WARN_END
1132 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1133
1134 inputLayer0->GetOutputSlot(0).Connect(equalLayer->GetInputSlot(0));
1135 inputLayer1->GetOutputSlot(0).Connect(equalLayer->GetInputSlot(1));
1136 equalLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1137
1138 inputLayer0->GetOutputSlot(0).SetTensorInfo(inputInfo);
1139 inputLayer1->GetOutputSlot(0).SetTensorInfo(inputInfo);
1140 equalLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1141
1142 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001143 CHECK(deserializedNetwork);
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01001144
Finn Williamsb454c5c2021-02-09 15:56:23 +00001145 LayerVerifierBase verifier(layerName, { inputInfo, inputInfo }, { outputInfo });
1146 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01001147}
1148
Aron Virginas-Tar6d2e6592019-10-22 11:44:47 +01001149
Sadik Armagan1625efc2021-06-10 18:24:34 +01001150TEST_CASE("SerializeInstanceNormalization")
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01001151{
Aron Virginas-Tar781ced92019-10-03 11:15:39 +01001152 const std::string layerName("instanceNormalization");
1153 const armnn::TensorInfo info({ 1, 2, 1, 5 }, armnn::DataType::Float32);
1154
1155 armnn::InstanceNormalizationDescriptor descriptor;
1156 descriptor.m_Gamma = 1.1f;
1157 descriptor.m_Beta = 0.1f;
1158 descriptor.m_Eps = 0.0001f;
1159 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
1160
1161 armnn::INetworkPtr network = armnn::INetwork::Create();
1162 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1163 armnn::IConnectableLayer* const instanceNormLayer =
1164 network->AddInstanceNormalizationLayer(descriptor, layerName.c_str());
1165 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1166
1167 inputLayer->GetOutputSlot(0).Connect(instanceNormLayer->GetInputSlot(0));
1168 instanceNormLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1169
1170 inputLayer->GetOutputSlot(0).SetTensorInfo(info);
1171 instanceNormLayer->GetOutputSlot(0).SetTensorInfo(info);
1172
1173 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001174 CHECK(deserializedNetwork);
Aron Virginas-Tar781ced92019-10-03 11:15:39 +01001175
Finn Williamsb454c5c2021-02-09 15:56:23 +00001176 LayerVerifierBaseWithDescriptor<armnn::InstanceNormalizationDescriptor> verifier(
1177 layerName, {info}, {info}, descriptor);
1178 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tar781ced92019-10-03 11:15:39 +01001179}
1180
Sadik Armagan1625efc2021-06-10 18:24:34 +01001181TEST_CASE("SerializeL2Normalization")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001182{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001183 const std::string l2NormLayerName("l2Normalization");
1184 const armnn::TensorInfo info({1, 2, 1, 5}, armnn::DataType::Float32);
1185
1186 armnn::L2NormalizationDescriptor desc;
1187 desc.m_DataLayout = armnn::DataLayout::NCHW;
Ferran Balaguer0dcffec2019-06-18 16:25:06 +01001188 desc.m_Eps = 0.0001f;
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001189
1190 armnn::INetworkPtr network = armnn::INetwork::Create();
1191 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
1192 armnn::IConnectableLayer* const l2NormLayer = network->AddL2NormalizationLayer(desc, l2NormLayerName.c_str());
1193 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1194
1195 inputLayer0->GetOutputSlot(0).Connect(l2NormLayer->GetInputSlot(0));
1196 l2NormLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1197
1198 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
1199 l2NormLayer->GetOutputSlot(0).SetTensorInfo(info);
1200
1201 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001202 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001203
Finn Williamsb454c5c2021-02-09 15:56:23 +00001204 LayerVerifierBaseWithDescriptor<armnn::L2NormalizationDescriptor> verifier(
1205 l2NormLayerName, {info}, {info}, desc);
1206 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001207}
1208
Sadik Armagan1625efc2021-06-10 18:24:34 +01001209TEST_CASE("EnsureL2NormalizationBackwardCompatibility")
Ferran Balaguer0dcffec2019-06-18 16:25:06 +01001210{
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001211 // The hex data below is a flat buffer containing a simple network with one input
Ferran Balaguer0dcffec2019-06-18 16:25:06 +01001212 // a L2Normalization layer and an output layer with dimensions as per the tensor infos below.
1213 //
1214 // This test verifies that we can still read back these old style
1215 // models without the normalization epsilon value.
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001216 const std::vector<uint8_t> l2NormalizationModel =
Ferran Balaguer0dcffec2019-06-18 16:25:06 +01001217 {
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001218 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x0A, 0x00,
1219 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
1220 0x3C, 0x01, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
1221 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xE8, 0xFE, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x0B,
1222 0x04, 0x00, 0x00, 0x00, 0xD6, 0xFE, 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x08, 0x00,
1223 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x9E, 0xFF, 0xFF, 0xFF, 0x02, 0x00, 0x00, 0x00,
1224 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00,
1225 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1226 0x4C, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
1227 0x00, 0x20, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00,
1228 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
1229 0x0E, 0x00, 0x18, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x14, 0x00, 0x0E, 0x00, 0x00, 0x00,
1230 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x20, 0x00,
1231 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x6C, 0x32, 0x4E, 0x6F, 0x72, 0x6D, 0x61, 0x6C, 0x69, 0x7A, 0x61, 0x74,
1232 0x69, 0x6F, 0x6E, 0x00, 0x01, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00,
1233 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
1234 0x52, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00,
1235 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
1236 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1237 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x07, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09,
1238 0x04, 0x00, 0x00, 0x00, 0xF6, 0xFF, 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0A, 0x00,
1239 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x00, 0x00,
1240 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00,
1241 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1242 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0A, 0x00, 0x00, 0x00,
1243 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x08, 0x00,
1244 0x07, 0x00, 0x0C, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
1245 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
1246 0x05, 0x00, 0x00, 0x00, 0x00
1247 };
1248
1249 armnn::INetworkPtr deserializedNetwork =
1250 DeserializeNetwork(std::string(l2NormalizationModel.begin(), l2NormalizationModel.end()));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001251 CHECK(deserializedNetwork);
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001252
Ferran Balaguer0dcffec2019-06-18 16:25:06 +01001253 const std::string layerName("l2Normalization");
1254 const armnn::TensorInfo inputInfo = armnn::TensorInfo({1, 2, 1, 5}, armnn::DataType::Float32);
1255
1256 armnn::L2NormalizationDescriptor desc;
1257 desc.m_DataLayout = armnn::DataLayout::NCHW;
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001258 // Since this variable does not exist in the l2NormalizationModel dump, the default value will be loaded
Ferran Balaguer0dcffec2019-06-18 16:25:06 +01001259 desc.m_Eps = 1e-12f;
1260
Finn Williamsb454c5c2021-02-09 15:56:23 +00001261 LayerVerifierBaseWithDescriptor<armnn::L2NormalizationDescriptor> verifier(
1262 layerName, {inputInfo}, {inputInfo}, desc);
1263 deserializedNetwork->ExecuteStrategy(verifier);
Ferran Balaguer0dcffec2019-06-18 16:25:06 +01001264}
1265
Sadik Armagan1625efc2021-06-10 18:24:34 +01001266TEST_CASE("SerializeLogicalBinary")
James Conroyaba90cd2020-11-06 16:28:18 +00001267{
James Conroyaba90cd2020-11-06 16:28:18 +00001268 const std::string layerName("logicalBinaryAnd");
1269
1270 const armnn::TensorShape shape{2, 1, 2, 2};
1271
1272 const armnn::TensorInfo inputInfo = armnn::TensorInfo(shape, armnn::DataType::Boolean);
1273 const armnn::TensorInfo outputInfo = armnn::TensorInfo(shape, armnn::DataType::Boolean);
1274
1275 armnn::LogicalBinaryDescriptor descriptor(armnn::LogicalBinaryOperation::LogicalAnd);
1276
1277 armnn::INetworkPtr network = armnn::INetwork::Create();
1278 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
1279 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
1280 armnn::IConnectableLayer* const logicalBinaryLayer = network->AddLogicalBinaryLayer(descriptor, layerName.c_str());
1281 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1282
1283 inputLayer0->GetOutputSlot(0).Connect(logicalBinaryLayer->GetInputSlot(0));
1284 inputLayer1->GetOutputSlot(0).Connect(logicalBinaryLayer->GetInputSlot(1));
1285 logicalBinaryLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1286
1287 inputLayer0->GetOutputSlot(0).SetTensorInfo(inputInfo);
1288 inputLayer1->GetOutputSlot(0).SetTensorInfo(inputInfo);
1289 logicalBinaryLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1290
1291 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001292 CHECK(deserializedNetwork);
James Conroyaba90cd2020-11-06 16:28:18 +00001293
Finn Williamsb454c5c2021-02-09 15:56:23 +00001294 LayerVerifierBaseWithDescriptor<armnn::LogicalBinaryDescriptor> verifier(
1295 layerName, { inputInfo, inputInfo }, { outputInfo }, descriptor);
1296 deserializedNetwork->ExecuteStrategy(verifier);
James Conroyaba90cd2020-11-06 16:28:18 +00001297}
1298
Sadik Armagan1625efc2021-06-10 18:24:34 +01001299TEST_CASE("SerializeLogSoftmax")
Sadik Armagan26257852019-10-14 13:00:47 +01001300{
Sadik Armagan26257852019-10-14 13:00:47 +01001301 const std::string layerName("log_softmax");
1302 const armnn::TensorInfo info({1, 10}, armnn::DataType::Float32);
1303
1304 armnn::LogSoftmaxDescriptor descriptor;
1305 descriptor.m_Beta = 1.0f;
1306 descriptor.m_Axis = -1;
1307
1308 armnn::INetworkPtr network = armnn::INetwork::Create();
1309 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1310 armnn::IConnectableLayer* const logSoftmaxLayer = network->AddLogSoftmaxLayer(descriptor, layerName.c_str());
1311 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1312
1313 inputLayer->GetOutputSlot(0).Connect(logSoftmaxLayer->GetInputSlot(0));
1314 logSoftmaxLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1315
1316 inputLayer->GetOutputSlot(0).SetTensorInfo(info);
1317 logSoftmaxLayer->GetOutputSlot(0).SetTensorInfo(info);
1318
1319 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001320 CHECK(deserializedNetwork);
Sadik Armagan26257852019-10-14 13:00:47 +01001321
Finn Williamsb454c5c2021-02-09 15:56:23 +00001322 LayerVerifierBaseWithDescriptor<armnn::LogSoftmaxDescriptor> verifier(layerName, {info}, {info}, descriptor);
1323 deserializedNetwork->ExecuteStrategy(verifier);
Sadik Armagan26257852019-10-14 13:00:47 +01001324}
1325
Sadik Armagan1625efc2021-06-10 18:24:34 +01001326TEST_CASE("SerializeMaximum")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001327{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001328 const std::string layerName("maximum");
1329 const armnn::TensorInfo info({ 1, 2, 2, 3 }, armnn::DataType::Float32);
1330
1331 armnn::INetworkPtr network = armnn::INetwork::Create();
1332 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
1333 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
1334 armnn::IConnectableLayer* const maximumLayer = network->AddMaximumLayer(layerName.c_str());
1335 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1336
1337 inputLayer0->GetOutputSlot(0).Connect(maximumLayer->GetInputSlot(0));
1338 inputLayer1->GetOutputSlot(0).Connect(maximumLayer->GetInputSlot(1));
1339 maximumLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1340
1341 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
1342 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
1343 maximumLayer->GetOutputSlot(0).SetTensorInfo(info);
1344
1345 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001346 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001347
Finn Williamsb454c5c2021-02-09 15:56:23 +00001348 LayerVerifierBase verifier(layerName, {info, info}, {info});
1349 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001350}
1351
Sadik Armagan1625efc2021-06-10 18:24:34 +01001352TEST_CASE("SerializeMean")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001353{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001354 const std::string layerName("mean");
1355 const armnn::TensorInfo inputInfo({1, 1, 3, 2}, armnn::DataType::Float32);
1356 const armnn::TensorInfo outputInfo({1, 1, 1, 2}, armnn::DataType::Float32);
1357
1358 armnn::MeanDescriptor descriptor;
1359 descriptor.m_Axis = { 2 };
1360 descriptor.m_KeepDims = true;
1361
1362 armnn::INetworkPtr network = armnn::INetwork::Create();
1363 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1364 armnn::IConnectableLayer* const meanLayer = network->AddMeanLayer(descriptor, layerName.c_str());
1365 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1366
1367 inputLayer->GetOutputSlot(0).Connect(meanLayer->GetInputSlot(0));
1368 meanLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1369
1370 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
1371 meanLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1372
1373 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001374 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001375
Finn Williamsb454c5c2021-02-09 15:56:23 +00001376 LayerVerifierBaseWithDescriptor<armnn::MeanDescriptor> verifier(layerName, {inputInfo}, {outputInfo}, descriptor);
1377 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001378}
1379
Sadik Armagan1625efc2021-06-10 18:24:34 +01001380TEST_CASE("SerializeMerge")
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +01001381{
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +01001382 const std::string layerName("merge");
1383 const armnn::TensorInfo info({ 1, 2, 2, 3 }, armnn::DataType::Float32);
1384
1385 armnn::INetworkPtr network = armnn::INetwork::Create();
1386 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
1387 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
1388 armnn::IConnectableLayer* const mergeLayer = network->AddMergeLayer(layerName.c_str());
1389 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1390
1391 inputLayer0->GetOutputSlot(0).Connect(mergeLayer->GetInputSlot(0));
1392 inputLayer1->GetOutputSlot(0).Connect(mergeLayer->GetInputSlot(1));
1393 mergeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1394
1395 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
1396 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
1397 mergeLayer->GetOutputSlot(0).SetTensorInfo(info);
1398
1399 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001400 CHECK(deserializedNetwork);
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +01001401
Finn Williamsb454c5c2021-02-09 15:56:23 +00001402 LayerVerifierBase verifier(layerName, {info, info}, {info});
1403 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +01001404}
1405
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01001406class MergerLayerVerifier : public LayerVerifierBaseWithDescriptor<armnn::OriginsDescriptor>
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001407{
Jim Flynn5fa83932019-05-09 15:35:43 +01001408public:
1409 MergerLayerVerifier(const std::string& layerName,
1410 const std::vector<armnn::TensorInfo>& inputInfos,
1411 const std::vector<armnn::TensorInfo>& outputInfos,
1412 const armnn::OriginsDescriptor& descriptor)
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01001413 : LayerVerifierBaseWithDescriptor<armnn::OriginsDescriptor>(layerName, inputInfos, outputInfos, descriptor) {}
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001414
Finn Williamsb454c5c2021-02-09 15:56:23 +00001415 void ExecuteStrategy(const armnn::IConnectableLayer* layer,
1416 const armnn::BaseDescriptor& descriptor,
1417 const std::vector<armnn::ConstTensor>& constants,
1418 const char* name,
1419 const armnn::LayerBindingId id = 0) override
Jim Flynn5fa83932019-05-09 15:35:43 +01001420 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001421 armnn::IgnoreUnused(descriptor, constants, id);
1422 switch (layer->GetType())
1423 {
1424 case armnn::LayerType::Input: break;
1425 case armnn::LayerType::Output: break;
1426 case armnn::LayerType::Merge:
1427 {
1428 throw armnn::Exception("MergerLayer should have translated to ConcatLayer");
1429 break;
1430 }
1431 case armnn::LayerType::Concat:
1432 {
1433 VerifyNameAndConnections(layer, name);
1434 const armnn::MergerDescriptor& layerDescriptor =
1435 static_cast<const armnn::MergerDescriptor&>(descriptor);
1436 VerifyDescriptor(layerDescriptor);
1437 break;
1438 }
1439 default:
1440 {
1441 throw armnn::Exception("Unexpected layer type in Merge test model");
1442 }
1443 }
Jim Flynn5fa83932019-05-09 15:35:43 +01001444 }
Jim Flynn5fa83932019-05-09 15:35:43 +01001445};
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001446
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01001447// NOTE: Until the deprecated AddMergerLayer disappears this test checks that calling
Jim Flynne242f2d2019-05-22 14:24:13 +01001448// AddMergerLayer places a ConcatLayer into the serialized format and that
1449// when this deserialises we have a ConcatLayer
Sadik Armagan1625efc2021-06-10 18:24:34 +01001450TEST_CASE("SerializeMerger")
Jim Flynn5fa83932019-05-09 15:35:43 +01001451{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001452 const std::string layerName("merger");
1453 const armnn::TensorInfo inputInfo = armnn::TensorInfo({2, 3, 2, 2}, armnn::DataType::Float32);
1454 const armnn::TensorInfo outputInfo = armnn::TensorInfo({4, 3, 2, 2}, armnn::DataType::Float32);
1455
1456 const std::vector<armnn::TensorShape> shapes({inputInfo.GetShape(), inputInfo.GetShape()});
1457
1458 armnn::OriginsDescriptor descriptor =
Jim Flynn825af452019-05-20 12:49:28 +01001459 armnn::CreateDescriptorForConcatenation(shapes.begin(), shapes.end(), 0);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001460
1461 armnn::INetworkPtr network = armnn::INetwork::Create();
1462 armnn::IConnectableLayer* const inputLayerOne = network->AddInputLayer(0);
1463 armnn::IConnectableLayer* const inputLayerTwo = network->AddInputLayer(1);
Jim Flynn906f9462019-05-10 13:55:21 +01001464 ARMNN_NO_DEPRECATE_WARN_BEGIN
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001465 armnn::IConnectableLayer* const mergerLayer = network->AddMergerLayer(descriptor, layerName.c_str());
Jim Flynn906f9462019-05-10 13:55:21 +01001466 ARMNN_NO_DEPRECATE_WARN_END
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001467 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1468
1469 inputLayerOne->GetOutputSlot(0).Connect(mergerLayer->GetInputSlot(0));
1470 inputLayerTwo->GetOutputSlot(0).Connect(mergerLayer->GetInputSlot(1));
1471 mergerLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1472
1473 inputLayerOne->GetOutputSlot(0).SetTensorInfo(inputInfo);
1474 inputLayerTwo->GetOutputSlot(0).SetTensorInfo(inputInfo);
1475 mergerLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1476
Jim Flynn5fa83932019-05-09 15:35:43 +01001477 std::string mergerLayerNetwork = SerializeNetwork(*network);
1478 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(mergerLayerNetwork);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001479 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001480
1481 MergerLayerVerifier verifier(layerName, {inputInfo, inputInfo}, {outputInfo}, descriptor);
Finn Williamsb454c5c2021-02-09 15:56:23 +00001482 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001483}
1484
Sadik Armagan1625efc2021-06-10 18:24:34 +01001485TEST_CASE("EnsureMergerLayerBackwardCompatibility")
Jim Flynn5fa83932019-05-09 15:35:43 +01001486{
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001487 // The hex data below is a flat buffer containing a simple network with two inputs
Jim Flynne242f2d2019-05-22 14:24:13 +01001488 // a merger layer (now deprecated) and an output layer with dimensions as per the tensor infos below.
1489 //
1490 // This test verifies that we can still read back these old style
Jim Flynn5fa83932019-05-09 15:35:43 +01001491 // models replacing the MergerLayers with ConcatLayers with the same parameters.
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001492 const std::vector<uint8_t> mergerModel =
Jim Flynn5fa83932019-05-09 15:35:43 +01001493 {
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001494 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x0A, 0x00,
1495 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
1496 0x38, 0x02, 0x00, 0x00, 0x8C, 0x01, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x02, 0x00,
1497 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
1498 0xF4, 0xFD, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x0B, 0x04, 0x00, 0x00, 0x00, 0x92, 0xFE, 0xFF, 0xFF, 0x04, 0x00,
1499 0x00, 0x00, 0x9A, 0xFE, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x7E, 0xFE, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00,
1500 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00,
1501 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1502 0xF8, 0xFE, 0xFF, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0xFE, 0xFF, 0xFF, 0x00, 0x00,
1503 0x00, 0x1F, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00,
1504 0x68, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00,
1505 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
1506 0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x22, 0xFF, 0xFF, 0xFF, 0x04, 0x00,
1507 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1508 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
1509 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFF, 0xFF, 0xFF,
1510 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x1C, 0x00,
1511 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x6D, 0x65, 0x72, 0x67, 0x65, 0x72, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
1512 0x5C, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x34, 0xFF,
1513 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x92, 0xFE, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00,
1514 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00,
1515 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00,
1516 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00,
1517 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0E, 0x00,
1518 0x07, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00,
1519 0x06, 0x00, 0x08, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0E, 0x00,
1520 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
1521 0x0E, 0x00, 0x18, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x14, 0x00, 0x0E, 0x00, 0x00, 0x00,
1522 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00,
1523 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
1524 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00,
1525 0x00, 0x00, 0x66, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1526 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00,
1527 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x07, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09,
1528 0x04, 0x00, 0x00, 0x00, 0xF6, 0xFF, 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0A, 0x00,
1529 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x00, 0x00,
1530 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00,
1531 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1532 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0A, 0x00, 0x00, 0x00,
1533 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x08, 0x00,
1534 0x07, 0x00, 0x0C, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
1535 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
1536 0x02, 0x00, 0x00, 0x00
1537 };
1538
1539 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(std::string(mergerModel.begin(), mergerModel.end()));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001540 CHECK(deserializedNetwork);
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001541
1542 const armnn::TensorInfo inputInfo = armnn::TensorInfo({ 2, 3, 2, 2 }, armnn::DataType::Float32);
1543 const armnn::TensorInfo outputInfo = armnn::TensorInfo({ 4, 3, 2, 2 }, armnn::DataType::Float32);
Jim Flynn5fa83932019-05-09 15:35:43 +01001544
1545 const std::vector<armnn::TensorShape> shapes({inputInfo.GetShape(), inputInfo.GetShape()});
1546
1547 armnn::OriginsDescriptor descriptor =
Jim Flynn825af452019-05-20 12:49:28 +01001548 armnn::CreateDescriptorForConcatenation(shapes.begin(), shapes.end(), 0);
Jim Flynn5fa83932019-05-09 15:35:43 +01001549
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001550 MergerLayerVerifier verifier("merger", { inputInfo, inputInfo }, { outputInfo }, descriptor);
Finn Williamsb454c5c2021-02-09 15:56:23 +00001551 deserializedNetwork->ExecuteStrategy(verifier);
Jim Flynn5fa83932019-05-09 15:35:43 +01001552}
1553
Sadik Armagan1625efc2021-06-10 18:24:34 +01001554TEST_CASE("SerializeConcat")
Jim Flynne242f2d2019-05-22 14:24:13 +01001555{
1556 const std::string layerName("concat");
1557 const armnn::TensorInfo inputInfo = armnn::TensorInfo({2, 3, 2, 2}, armnn::DataType::Float32);
1558 const armnn::TensorInfo outputInfo = armnn::TensorInfo({4, 3, 2, 2}, armnn::DataType::Float32);
1559
1560 const std::vector<armnn::TensorShape> shapes({inputInfo.GetShape(), inputInfo.GetShape()});
1561
1562 armnn::OriginsDescriptor descriptor =
1563 armnn::CreateDescriptorForConcatenation(shapes.begin(), shapes.end(), 0);
1564
1565 armnn::INetworkPtr network = armnn::INetwork::Create();
1566 armnn::IConnectableLayer* const inputLayerOne = network->AddInputLayer(0);
1567 armnn::IConnectableLayer* const inputLayerTwo = network->AddInputLayer(1);
1568 armnn::IConnectableLayer* const concatLayer = network->AddConcatLayer(descriptor, layerName.c_str());
1569 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1570
1571 inputLayerOne->GetOutputSlot(0).Connect(concatLayer->GetInputSlot(0));
1572 inputLayerTwo->GetOutputSlot(0).Connect(concatLayer->GetInputSlot(1));
1573 concatLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1574
1575 inputLayerOne->GetOutputSlot(0).SetTensorInfo(inputInfo);
1576 inputLayerTwo->GetOutputSlot(0).SetTensorInfo(inputInfo);
1577 concatLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1578
1579 std::string concatLayerNetwork = SerializeNetwork(*network);
1580 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(concatLayerNetwork);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001581 CHECK(deserializedNetwork);
Jim Flynne242f2d2019-05-22 14:24:13 +01001582
1583 // NOTE: using the MergerLayerVerifier to ensure that it is a concat layer and not a
1584 // merger layer that gets placed into the graph.
1585 MergerLayerVerifier verifier(layerName, {inputInfo, inputInfo}, {outputInfo}, descriptor);
Finn Williamsb454c5c2021-02-09 15:56:23 +00001586 deserializedNetwork->ExecuteStrategy(verifier);
Jim Flynne242f2d2019-05-22 14:24:13 +01001587}
1588
Sadik Armagan1625efc2021-06-10 18:24:34 +01001589TEST_CASE("SerializeMinimum")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001590{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001591 const std::string layerName("minimum");
1592 const armnn::TensorInfo info({ 1, 2, 2, 3 }, armnn::DataType::Float32);
1593
1594 armnn::INetworkPtr network = armnn::INetwork::Create();
1595 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
1596 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
1597 armnn::IConnectableLayer* const minimumLayer = network->AddMinimumLayer(layerName.c_str());
1598 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1599
1600 inputLayer0->GetOutputSlot(0).Connect(minimumLayer->GetInputSlot(0));
1601 inputLayer1->GetOutputSlot(0).Connect(minimumLayer->GetInputSlot(1));
1602 minimumLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1603
1604 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
1605 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
1606 minimumLayer->GetOutputSlot(0).SetTensorInfo(info);
1607
1608 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001609 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001610
Finn Williamsb454c5c2021-02-09 15:56:23 +00001611 LayerVerifierBase verifier(layerName, {info, info}, {info});
1612 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001613}
1614
Sadik Armagan1625efc2021-06-10 18:24:34 +01001615TEST_CASE("SerializeMultiplication")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001616{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001617 const std::string layerName("multiplication");
1618 const armnn::TensorInfo info({ 1, 5, 2, 3 }, armnn::DataType::Float32);
1619
1620 armnn::INetworkPtr network = armnn::INetwork::Create();
1621 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
1622 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
1623 armnn::IConnectableLayer* const multiplicationLayer = network->AddMultiplicationLayer(layerName.c_str());
1624 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1625
1626 inputLayer0->GetOutputSlot(0).Connect(multiplicationLayer->GetInputSlot(0));
1627 inputLayer1->GetOutputSlot(0).Connect(multiplicationLayer->GetInputSlot(1));
1628 multiplicationLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1629
1630 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
1631 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
1632 multiplicationLayer->GetOutputSlot(0).SetTensorInfo(info);
1633
1634 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001635 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001636
Finn Williamsb454c5c2021-02-09 15:56:23 +00001637 LayerVerifierBase verifier(layerName, {info, info}, {info});
1638 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001639}
1640
Sadik Armagan1625efc2021-06-10 18:24:34 +01001641TEST_CASE("SerializePrelu")
Ellen Norris-Thompson51982472019-06-19 11:46:21 +01001642{
Ellen Norris-Thompson51982472019-06-19 11:46:21 +01001643 const std::string layerName("prelu");
1644
1645 armnn::TensorInfo inputTensorInfo ({ 4, 1, 2 }, armnn::DataType::Float32);
1646 armnn::TensorInfo alphaTensorInfo ({ 5, 4, 3, 1 }, armnn::DataType::Float32);
1647 armnn::TensorInfo outputTensorInfo({ 5, 4, 3, 2 }, armnn::DataType::Float32);
1648
1649 armnn::INetworkPtr network = armnn::INetwork::Create();
1650 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1651 armnn::IConnectableLayer* const alphaLayer = network->AddInputLayer(1);
1652 armnn::IConnectableLayer* const preluLayer = network->AddPreluLayer(layerName.c_str());
1653 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1654
1655 inputLayer->GetOutputSlot(0).Connect(preluLayer->GetInputSlot(0));
1656 alphaLayer->GetOutputSlot(0).Connect(preluLayer->GetInputSlot(1));
1657 preluLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1658
1659 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
1660 alphaLayer->GetOutputSlot(0).SetTensorInfo(alphaTensorInfo);
1661 preluLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
1662
1663 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001664 CHECK(deserializedNetwork);
Ellen Norris-Thompson51982472019-06-19 11:46:21 +01001665
Finn Williamsb454c5c2021-02-09 15:56:23 +00001666 LayerVerifierBase verifier(layerName, {inputTensorInfo, alphaTensorInfo}, {outputTensorInfo});
1667 deserializedNetwork->ExecuteStrategy(verifier);
Ellen Norris-Thompson51982472019-06-19 11:46:21 +01001668}
1669
Sadik Armagan1625efc2021-06-10 18:24:34 +01001670TEST_CASE("SerializeNormalization")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001671{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001672 const std::string layerName("normalization");
1673 const armnn::TensorInfo info({2, 1, 2, 2}, armnn::DataType::Float32);
1674
1675 armnn::NormalizationDescriptor desc;
1676 desc.m_DataLayout = armnn::DataLayout::NCHW;
1677 desc.m_NormSize = 3;
1678 desc.m_Alpha = 1;
1679 desc.m_Beta = 1;
1680 desc.m_K = 1;
1681
1682 armnn::INetworkPtr network = armnn::INetwork::Create();
1683 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1684 armnn::IConnectableLayer* const normalizationLayer = network->AddNormalizationLayer(desc, layerName.c_str());
1685 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1686
1687 inputLayer->GetOutputSlot(0).Connect(normalizationLayer->GetInputSlot(0));
1688 normalizationLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1689
1690 inputLayer->GetOutputSlot(0).SetTensorInfo(info);
1691 normalizationLayer->GetOutputSlot(0).SetTensorInfo(info);
1692
1693 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001694 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001695
Finn Williamsb454c5c2021-02-09 15:56:23 +00001696 LayerVerifierBaseWithDescriptor<armnn::NormalizationDescriptor> verifier(layerName, {info}, {info}, desc);
1697 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001698}
1699
Sadik Armagan1625efc2021-06-10 18:24:34 +01001700TEST_CASE("SerializePad")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001701{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001702 const std::string layerName("pad");
1703 const armnn::TensorInfo inputTensorInfo = armnn::TensorInfo({1, 2, 3, 4}, armnn::DataType::Float32);
1704 const armnn::TensorInfo outputTensorInfo = armnn::TensorInfo({1, 3, 5, 7}, armnn::DataType::Float32);
1705
1706 armnn::PadDescriptor desc({{0, 0}, {1, 0}, {1, 1}, {1, 2}});
1707
1708 armnn::INetworkPtr network = armnn::INetwork::Create();
1709 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1710 armnn::IConnectableLayer* const padLayer = network->AddPadLayer(desc, layerName.c_str());
1711 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1712
1713 inputLayer->GetOutputSlot(0).Connect(padLayer->GetInputSlot(0));
1714 padLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1715
1716 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
1717 padLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
1718
1719 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001720 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001721
Finn Williamsb454c5c2021-02-09 15:56:23 +00001722 LayerVerifierBaseWithDescriptor<armnn::PadDescriptor> verifier(layerName,
1723 {inputTensorInfo},
1724 {outputTensorInfo},
1725 desc);
1726 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001727}
1728
Sadik Armagan1625efc2021-06-10 18:24:34 +01001729TEST_CASE("EnsurePadBackwardCompatibility")
Jim Flynn965c7c62019-06-24 14:32:41 +01001730{
1731 // The PadDescriptor is being extended with a float PadValue (so a value other than 0
1732 // can be used to pad the tensor.
1733 //
1734 // This test contains a binary representation of a simple input->pad->output network
1735 // prior to this change to test that the descriptor has been updated in a backward
1736 // compatible way with respect to Deserialization of older binary dumps
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001737 const std::vector<uint8_t> padModel =
Jim Flynn965c7c62019-06-24 14:32:41 +01001738 {
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001739 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x0A, 0x00,
1740 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
1741 0x54, 0x01, 0x00, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
1742 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xD0, 0xFE, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x0B,
1743 0x04, 0x00, 0x00, 0x00, 0x96, 0xFF, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x9E, 0xFF, 0xFF, 0xFF, 0x04, 0x00,
1744 0x00, 0x00, 0x72, 0xFF, 0xFF, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
1745 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
1746 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00,
1747 0x00, 0x00, 0x00, 0x00, 0x24, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x16, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00,
1748 0x0E, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00,
1749 0x00, 0x00, 0x06, 0x00, 0x08, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00,
1750 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1751 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
1752 0x0E, 0x00, 0x18, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x14, 0x00, 0x0E, 0x00, 0x00, 0x00,
1753 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00,
1754 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x70, 0x61, 0x64, 0x00, 0x01, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00,
1755 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00,
1756 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x52, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00,
1757 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00,
1758 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00,
1759 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x07, 0x00, 0x08, 0x00, 0x08, 0x00,
1760 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xF6, 0xFF, 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x00,
1761 0x00, 0x00, 0x06, 0x00, 0x0A, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00,
1762 0x0E, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x0E, 0x00, 0x00, 0x00,
1763 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
1764 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00,
1765 0x08, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
1766 0x0A, 0x00, 0x10, 0x00, 0x08, 0x00, 0x07, 0x00, 0x0C, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
1767 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00,
1768 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00
1769 };
1770
1771 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(std::string(padModel.begin(), padModel.end()));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001772 CHECK(deserializedNetwork);
Jim Flynn965c7c62019-06-24 14:32:41 +01001773
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001774 const armnn::TensorInfo inputInfo = armnn::TensorInfo({ 1, 2, 3, 4 }, armnn::DataType::Float32);
1775 const armnn::TensorInfo outputInfo = armnn::TensorInfo({ 1, 3, 5, 7 }, armnn::DataType::Float32);
Jim Flynn965c7c62019-06-24 14:32:41 +01001776
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001777 armnn::PadDescriptor descriptor({{ 0, 0 }, { 1, 0 }, { 1, 1 }, { 1, 2 }});
Jim Flynn965c7c62019-06-24 14:32:41 +01001778
Finn Williamsb454c5c2021-02-09 15:56:23 +00001779 LayerVerifierBaseWithDescriptor<armnn::PadDescriptor> verifier("pad", { inputInfo }, { outputInfo }, descriptor);
1780 deserializedNetwork->ExecuteStrategy(verifier);
Jim Flynn965c7c62019-06-24 14:32:41 +01001781}
1782
Sadik Armagan1625efc2021-06-10 18:24:34 +01001783TEST_CASE("SerializePermute")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001784{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001785 const std::string layerName("permute");
1786 const armnn::TensorInfo inputTensorInfo({4, 3, 2, 1}, armnn::DataType::Float32);
1787 const armnn::TensorInfo outputTensorInfo({1, 2, 3, 4}, armnn::DataType::Float32);
1788
1789 armnn::PermuteDescriptor descriptor(armnn::PermutationVector({3, 2, 1, 0}));
1790
1791 armnn::INetworkPtr network = armnn::INetwork::Create();
1792 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1793 armnn::IConnectableLayer* const permuteLayer = network->AddPermuteLayer(descriptor, layerName.c_str());
1794 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1795
1796 inputLayer->GetOutputSlot(0).Connect(permuteLayer->GetInputSlot(0));
1797 permuteLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1798
1799 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
1800 permuteLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
1801
1802 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001803 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001804
Finn Williamsb454c5c2021-02-09 15:56:23 +00001805 LayerVerifierBaseWithDescriptor<armnn::PermuteDescriptor> verifier(
1806 layerName, {inputTensorInfo}, {outputTensorInfo}, descriptor);
1807 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001808}
1809
Sadik Armagan1625efc2021-06-10 18:24:34 +01001810TEST_CASE("SerializePooling2d")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001811{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001812 const std::string layerName("pooling2d");
1813 const armnn::TensorInfo inputInfo({1, 2, 2, 1}, armnn::DataType::Float32);
1814 const armnn::TensorInfo outputInfo({1, 1, 1, 1}, armnn::DataType::Float32);
1815
1816 armnn::Pooling2dDescriptor desc;
1817 desc.m_DataLayout = armnn::DataLayout::NHWC;
1818 desc.m_PadTop = 0;
1819 desc.m_PadBottom = 0;
1820 desc.m_PadLeft = 0;
1821 desc.m_PadRight = 0;
1822 desc.m_PoolType = armnn::PoolingAlgorithm::Average;
1823 desc.m_OutputShapeRounding = armnn::OutputShapeRounding::Floor;
1824 desc.m_PaddingMethod = armnn::PaddingMethod::Exclude;
1825 desc.m_PoolHeight = 2;
1826 desc.m_PoolWidth = 2;
1827 desc.m_StrideX = 2;
1828 desc.m_StrideY = 2;
1829
1830 armnn::INetworkPtr network = armnn::INetwork::Create();
1831 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1832 armnn::IConnectableLayer* const pooling2dLayer = network->AddPooling2dLayer(desc, layerName.c_str());
1833 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1834
1835 inputLayer->GetOutputSlot(0).Connect(pooling2dLayer->GetInputSlot(0));
1836 pooling2dLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1837
1838 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
1839 pooling2dLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1840
1841 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001842 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001843
Finn Williamsb454c5c2021-02-09 15:56:23 +00001844 LayerVerifierBaseWithDescriptor<armnn::Pooling2dDescriptor> verifier(
1845 layerName, {inputInfo}, {outputInfo}, desc);
1846 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001847}
1848
Sadik Armagan1625efc2021-06-10 18:24:34 +01001849TEST_CASE("SerializeQuantize")
Derek Lamberti87acb272019-03-27 16:51:31 +00001850{
Derek Lamberti87acb272019-03-27 16:51:31 +00001851 const std::string layerName("quantize");
1852 const armnn::TensorInfo info({ 1, 2, 2, 3 }, armnn::DataType::Float32);
1853
1854 armnn::INetworkPtr network = armnn::INetwork::Create();
1855 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1856 armnn::IConnectableLayer* const quantizeLayer = network->AddQuantizeLayer(layerName.c_str());
1857 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1858
1859 inputLayer->GetOutputSlot(0).Connect(quantizeLayer->GetInputSlot(0));
1860 quantizeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1861
1862 inputLayer->GetOutputSlot(0).SetTensorInfo(info);
1863 quantizeLayer->GetOutputSlot(0).SetTensorInfo(info);
1864
1865 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001866 CHECK(deserializedNetwork);
Derek Lamberti87acb272019-03-27 16:51:31 +00001867
Finn Williamsb454c5c2021-02-09 15:56:23 +00001868 LayerVerifierBase verifier(layerName, {info}, {info});
1869 deserializedNetwork->ExecuteStrategy(verifier);
Derek Lamberti87acb272019-03-27 16:51:31 +00001870}
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01001871
Sadik Armagan1625efc2021-06-10 18:24:34 +01001872TEST_CASE("SerializeRank")
Finn Williams2605b232020-06-10 15:53:46 +01001873{
Finn Williams2605b232020-06-10 15:53:46 +01001874 const std::string layerName("rank");
1875 const armnn::TensorInfo inputInfo({1, 9}, armnn::DataType::Float32);
1876 const armnn::TensorInfo outputInfo({1}, armnn::DataType::Signed32);
1877
1878 armnn::INetworkPtr network = armnn::INetwork::Create();
1879 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1880 armnn::IConnectableLayer* const rankLayer = network->AddRankLayer(layerName.c_str());
1881 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1882
1883 inputLayer->GetOutputSlot(0).Connect(rankLayer->GetInputSlot(0));
1884 rankLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1885
1886 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
1887 rankLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1888
1889 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001890 CHECK(deserializedNetwork);
Finn Williams2605b232020-06-10 15:53:46 +01001891
Finn Williamsb454c5c2021-02-09 15:56:23 +00001892 LayerVerifierBase verifier(layerName, {inputInfo}, {outputInfo});
1893 deserializedNetwork->ExecuteStrategy(verifier);
Finn Williams2605b232020-06-10 15:53:46 +01001894}
1895
Sadik Armagan1625efc2021-06-10 18:24:34 +01001896TEST_CASE("SerializeReduceSum")
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +00001897{
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +00001898 const std::string layerName("Reduce_Sum");
1899 const armnn::TensorInfo inputInfo({1, 1, 3, 2}, armnn::DataType::Float32);
1900 const armnn::TensorInfo outputInfo({1, 1, 1, 2}, armnn::DataType::Float32);
1901
1902 armnn::ReduceDescriptor descriptor;
1903 descriptor.m_vAxis = { 2 };
1904 descriptor.m_ReduceOperation = armnn::ReduceOperation::Sum;
1905
1906 armnn::INetworkPtr network = armnn::INetwork::Create();
1907 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1908 armnn::IConnectableLayer* const reduceSumLayer = network->AddReduceLayer(descriptor, layerName.c_str());
1909 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1910
1911 inputLayer->GetOutputSlot(0).Connect(reduceSumLayer->GetInputSlot(0));
1912 reduceSumLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1913
1914 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
1915 reduceSumLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1916
1917 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001918 CHECK(deserializedNetwork);
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +00001919
Finn Williamsb454c5c2021-02-09 15:56:23 +00001920 LayerVerifierBaseWithDescriptor<armnn::ReduceDescriptor> verifier(layerName, {inputInfo}, {outputInfo}, descriptor);
1921 deserializedNetwork->ExecuteStrategy(verifier);
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +00001922}
1923
Sadik Armagan1625efc2021-06-10 18:24:34 +01001924TEST_CASE("SerializeReshape")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001925{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001926 const std::string layerName("reshape");
1927 const armnn::TensorInfo inputInfo({1, 9}, armnn::DataType::Float32);
1928 const armnn::TensorInfo outputInfo({3, 3}, armnn::DataType::Float32);
1929
1930 armnn::ReshapeDescriptor descriptor({3, 3});
1931
1932 armnn::INetworkPtr network = armnn::INetwork::Create();
1933 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1934 armnn::IConnectableLayer* const reshapeLayer = network->AddReshapeLayer(descriptor, layerName.c_str());
1935 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1936
1937 inputLayer->GetOutputSlot(0).Connect(reshapeLayer->GetInputSlot(0));
1938 reshapeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1939
1940 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
1941 reshapeLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1942
1943 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001944 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001945
Finn Williamsb454c5c2021-02-09 15:56:23 +00001946 LayerVerifierBaseWithDescriptor<armnn::ReshapeDescriptor> verifier(
1947 layerName, {inputInfo}, {outputInfo}, descriptor);
1948 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001949}
1950
Sadik Armagan1625efc2021-06-10 18:24:34 +01001951TEST_CASE("SerializeResize")
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01001952{
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01001953 const std::string layerName("resize");
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00001954 const armnn::TensorInfo inputInfo = armnn::TensorInfo({1, 3, 5, 5}, armnn::DataType::Float32);
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01001955 const armnn::TensorInfo outputInfo = armnn::TensorInfo({1, 3, 2, 4}, armnn::DataType::Float32);
1956
1957 armnn::ResizeDescriptor desc;
Aron Virginas-Tar169d2f12019-07-01 19:01:44 +01001958 desc.m_TargetWidth = 4;
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01001959 desc.m_TargetHeight = 2;
Aron Virginas-Tar169d2f12019-07-01 19:01:44 +01001960 desc.m_Method = armnn::ResizeMethod::NearestNeighbor;
David Monahan4a0c9b92020-05-30 09:48:39 +01001961 desc.m_AlignCorners = true;
1962 desc.m_HalfPixelCenters = true;
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01001963
1964 armnn::INetworkPtr network = armnn::INetwork::Create();
1965 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1966 armnn::IConnectableLayer* const resizeLayer = network->AddResizeLayer(desc, layerName.c_str());
1967 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1968
1969 inputLayer->GetOutputSlot(0).Connect(resizeLayer->GetInputSlot(0));
1970 resizeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1971
1972 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
1973 resizeLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1974
1975 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001976 CHECK(deserializedNetwork);
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01001977
Finn Williamsb454c5c2021-02-09 15:56:23 +00001978 LayerVerifierBaseWithDescriptor<armnn::ResizeDescriptor> verifier(layerName, {inputInfo}, {outputInfo}, desc);
1979 deserializedNetwork->ExecuteStrategy(verifier);
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01001980}
1981
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00001982class ResizeBilinearLayerVerifier : public LayerVerifierBaseWithDescriptor<armnn::ResizeBilinearDescriptor>
1983{
1984public:
1985 ResizeBilinearLayerVerifier(const std::string& layerName,
1986 const std::vector<armnn::TensorInfo>& inputInfos,
1987 const std::vector<armnn::TensorInfo>& outputInfos,
1988 const armnn::ResizeBilinearDescriptor& descriptor)
1989 : LayerVerifierBaseWithDescriptor<armnn::ResizeBilinearDescriptor>(
1990 layerName, inputInfos, outputInfos, descriptor) {}
1991
Finn Williamsb454c5c2021-02-09 15:56:23 +00001992 void ExecuteStrategy(const armnn::IConnectableLayer* layer,
1993 const armnn::BaseDescriptor& descriptor,
1994 const std::vector<armnn::ConstTensor>& constants,
1995 const char* name,
1996 const armnn::LayerBindingId id = 0) override
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00001997 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001998 armnn::IgnoreUnused(descriptor, constants, id);
1999 switch (layer->GetType())
2000 {
2001 case armnn::LayerType::Input: break;
2002 case armnn::LayerType::Output: break;
2003 case armnn::LayerType::Resize:
2004 {
2005 VerifyNameAndConnections(layer, name);
2006 const armnn::ResizeDescriptor& layerDescriptor =
2007 static_cast<const armnn::ResizeDescriptor&>(descriptor);
Sadik Armagan1625efc2021-06-10 18:24:34 +01002008 CHECK(layerDescriptor.m_Method == armnn::ResizeMethod::Bilinear);
2009 CHECK(layerDescriptor.m_TargetWidth == m_Descriptor.m_TargetWidth);
2010 CHECK(layerDescriptor.m_TargetHeight == m_Descriptor.m_TargetHeight);
2011 CHECK(layerDescriptor.m_DataLayout == m_Descriptor.m_DataLayout);
2012 CHECK(layerDescriptor.m_AlignCorners == m_Descriptor.m_AlignCorners);
2013 CHECK(layerDescriptor.m_HalfPixelCenters == m_Descriptor.m_HalfPixelCenters);
Finn Williamsb454c5c2021-02-09 15:56:23 +00002014 break;
2015 }
2016 default:
2017 {
2018 throw armnn::Exception("Unexpected layer type in test model. ResizeBiliniar "
2019 "should have translated to Resize");
2020 }
2021 }
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002022 }
2023};
2024
2025// NOTE: Until the deprecated AddResizeBilinearLayer disappears this test checks that
2026// calling AddResizeBilinearLayer places a ResizeLayer into the serialized format
2027// and that when this deserialises we have a ResizeLayer
Sadik Armagan1625efc2021-06-10 18:24:34 +01002028TEST_CASE("SerializeResizeBilinear")
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002029{
2030 const std::string layerName("resizeBilinear");
2031 const armnn::TensorInfo inputInfo = armnn::TensorInfo({1, 3, 5, 5}, armnn::DataType::Float32);
2032 const armnn::TensorInfo outputInfo = armnn::TensorInfo({1, 3, 2, 4}, armnn::DataType::Float32);
2033
2034 armnn::ResizeBilinearDescriptor desc;
2035 desc.m_TargetWidth = 4u;
2036 desc.m_TargetHeight = 2u;
David Monahan4a0c9b92020-05-30 09:48:39 +01002037 desc.m_AlignCorners = true;
2038 desc.m_HalfPixelCenters = true;
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002039
2040 armnn::INetworkPtr network = armnn::INetwork::Create();
2041 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2042 ARMNN_NO_DEPRECATE_WARN_BEGIN
2043 armnn::IConnectableLayer* const resizeLayer = network->AddResizeBilinearLayer(desc, layerName.c_str());
2044 ARMNN_NO_DEPRECATE_WARN_END
2045 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2046
2047 inputLayer->GetOutputSlot(0).Connect(resizeLayer->GetInputSlot(0));
2048 resizeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2049
2050 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2051 resizeLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2052
2053 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002054 CHECK(deserializedNetwork);
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002055
2056 ResizeBilinearLayerVerifier verifier(layerName, {inputInfo}, {outputInfo}, desc);
Finn Williamsb454c5c2021-02-09 15:56:23 +00002057 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002058}
2059
Sadik Armagan1625efc2021-06-10 18:24:34 +01002060TEST_CASE("EnsureResizeBilinearBackwardCompatibility")
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002061{
2062 // The hex data below is a flat buffer containing a simple network with an input,
2063 // a ResizeBilinearLayer (now deprecated) and an output
2064 //
2065 // This test verifies that we can still deserialize this old-style model by replacing
2066 // the ResizeBilinearLayer with an equivalent ResizeLayer
2067 const std::vector<uint8_t> resizeBilinearModel =
2068 {
2069 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x0A, 0x00,
2070 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
2071 0x50, 0x01, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
2072 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xD4, 0xFE, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x0B,
2073 0x04, 0x00, 0x00, 0x00, 0xC2, 0xFE, 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x08, 0x00,
2074 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x8A, 0xFF, 0xFF, 0xFF, 0x02, 0x00, 0x00, 0x00,
2075 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00,
2076 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2077 0x38, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
2078 0x00, 0x1A, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00,
2079 0x34, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x12, 0x00, 0x08, 0x00, 0x0C, 0x00,
2080 0x07, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
2081 0x00, 0x00, 0x0E, 0x00, 0x18, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x14, 0x00, 0x0E, 0x00,
2082 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00,
2083 0x20, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x72, 0x65, 0x73, 0x69, 0x7A, 0x65, 0x42, 0x69, 0x6C, 0x69,
2084 0x6E, 0x65, 0x61, 0x72, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
2085 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00,
2086 0x00, 0x00, 0x52, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2087 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00,
2088 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2089 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x07, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
2090 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xF6, 0xFF, 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00,
2091 0x0A, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x14, 0x00,
2092 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
2093 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2094 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0A, 0x00,
2095 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x10, 0x00,
2096 0x08, 0x00, 0x07, 0x00, 0x0C, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00,
2097 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00,
2098 0x00, 0x00, 0x05, 0x00, 0x00, 0x00
2099 };
2100
2101 armnn::INetworkPtr deserializedNetwork =
2102 DeserializeNetwork(std::string(resizeBilinearModel.begin(), resizeBilinearModel.end()));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002103 CHECK(deserializedNetwork);
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002104
2105 const armnn::TensorInfo inputInfo = armnn::TensorInfo({1, 3, 5, 5}, armnn::DataType::Float32);
2106 const armnn::TensorInfo outputInfo = armnn::TensorInfo({1, 3, 2, 4}, armnn::DataType::Float32);
2107
2108 armnn::ResizeBilinearDescriptor descriptor;
2109 descriptor.m_TargetWidth = 4u;
2110 descriptor.m_TargetHeight = 2u;
2111
2112 ResizeBilinearLayerVerifier verifier("resizeBilinear", { inputInfo }, { outputInfo }, descriptor);
Finn Williamsb454c5c2021-02-09 15:56:23 +00002113 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002114}
2115
Keith Davis3ae3f972021-05-21 16:33:48 +01002116TEST_CASE("SerializeShape")
2117{
2118 const std::string layerName("shape");
2119 const armnn::TensorInfo inputInfo({1, 3, 3, 1}, armnn::DataType::Signed32);
2120 const armnn::TensorInfo outputInfo({ 4 }, armnn::DataType::Signed32);
2121
2122 armnn::INetworkPtr network = armnn::INetwork::Create();
2123 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2124 armnn::IConnectableLayer* const shapeLayer = network->AddShapeLayer(layerName.c_str());
2125 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2126
2127 inputLayer->GetOutputSlot(0).Connect(shapeLayer->GetInputSlot(0));
2128 shapeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2129
2130 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2131 shapeLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2132
2133 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
2134 CHECK(deserializedNetwork);
2135
2136 LayerVerifierBase verifier(layerName, {inputInfo}, {outputInfo});
2137
2138 deserializedNetwork->ExecuteStrategy(verifier);
2139}
2140
Sadik Armagan1625efc2021-06-10 18:24:34 +01002141TEST_CASE("SerializeSlice")
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +01002142{
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +01002143 const std::string layerName{"slice"};
2144
2145 const armnn::TensorInfo inputInfo = armnn::TensorInfo({3, 2, 3, 1}, armnn::DataType::Float32);
2146 const armnn::TensorInfo outputInfo = armnn::TensorInfo({2, 2, 2, 1}, armnn::DataType::Float32);
2147
2148 armnn::SliceDescriptor descriptor({ 0, 0, 1, 0}, {2, 2, 2, 1});
2149
2150 armnn::INetworkPtr network = armnn::INetwork::Create();
2151
2152 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2153 armnn::IConnectableLayer* const sliceLayer = network->AddSliceLayer(descriptor, layerName.c_str());
2154 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2155
2156 inputLayer->GetOutputSlot(0).Connect(sliceLayer->GetInputSlot(0));
2157 sliceLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2158
2159 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2160 sliceLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2161
2162 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002163 CHECK(deserializedNetwork);
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +01002164
Finn Williamsb454c5c2021-02-09 15:56:23 +00002165 LayerVerifierBaseWithDescriptor<armnn::SliceDescriptor> verifier(layerName, {inputInfo}, {outputInfo}, descriptor);
2166 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +01002167}
2168
Sadik Armagan1625efc2021-06-10 18:24:34 +01002169TEST_CASE("SerializeSoftmax")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002170{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002171 const std::string layerName("softmax");
2172 const armnn::TensorInfo info({1, 10}, armnn::DataType::Float32);
2173
2174 armnn::SoftmaxDescriptor descriptor;
2175 descriptor.m_Beta = 1.0f;
2176
2177 armnn::INetworkPtr network = armnn::INetwork::Create();
2178 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2179 armnn::IConnectableLayer* const softmaxLayer = network->AddSoftmaxLayer(descriptor, layerName.c_str());
2180 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2181
2182 inputLayer->GetOutputSlot(0).Connect(softmaxLayer->GetInputSlot(0));
2183 softmaxLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2184
2185 inputLayer->GetOutputSlot(0).SetTensorInfo(info);
2186 softmaxLayer->GetOutputSlot(0).SetTensorInfo(info);
2187
2188 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002189 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002190
Finn Williamsb454c5c2021-02-09 15:56:23 +00002191 LayerVerifierBaseWithDescriptor<armnn::SoftmaxDescriptor> verifier(layerName, {info}, {info}, descriptor);
2192 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002193}
2194
Sadik Armagan1625efc2021-06-10 18:24:34 +01002195TEST_CASE("SerializeSpaceToBatchNd")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002196{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002197 const std::string layerName("spaceToBatchNd");
2198 const armnn::TensorInfo inputInfo({2, 1, 2, 4}, armnn::DataType::Float32);
2199 const armnn::TensorInfo outputInfo({8, 1, 1, 3}, armnn::DataType::Float32);
2200
2201 armnn::SpaceToBatchNdDescriptor desc;
2202 desc.m_DataLayout = armnn::DataLayout::NCHW;
2203 desc.m_BlockShape = {2, 2};
2204 desc.m_PadList = {{0, 0}, {2, 0}};
2205
2206 armnn::INetworkPtr network = armnn::INetwork::Create();
2207 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2208 armnn::IConnectableLayer* const spaceToBatchNdLayer = network->AddSpaceToBatchNdLayer(desc, layerName.c_str());
2209 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2210
2211 inputLayer->GetOutputSlot(0).Connect(spaceToBatchNdLayer->GetInputSlot(0));
2212 spaceToBatchNdLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2213
2214 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2215 spaceToBatchNdLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2216
2217 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002218 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002219
Finn Williamsb454c5c2021-02-09 15:56:23 +00002220 LayerVerifierBaseWithDescriptor<armnn::SpaceToBatchNdDescriptor> verifier(
2221 layerName, {inputInfo}, {outputInfo}, desc);
2222 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002223}
2224
Sadik Armagan1625efc2021-06-10 18:24:34 +01002225TEST_CASE("SerializeSpaceToDepth")
Aron Virginas-Taraa067142019-06-11 16:01:44 +01002226{
Aron Virginas-Taraa067142019-06-11 16:01:44 +01002227 const std::string layerName("spaceToDepth");
2228
2229 const armnn::TensorInfo inputInfo ({ 1, 16, 8, 3 }, armnn::DataType::Float32);
2230 const armnn::TensorInfo outputInfo({ 1, 8, 4, 12 }, armnn::DataType::Float32);
2231
2232 armnn::SpaceToDepthDescriptor desc;
2233 desc.m_BlockSize = 2;
2234 desc.m_DataLayout = armnn::DataLayout::NHWC;
2235
2236 armnn::INetworkPtr network = armnn::INetwork::Create();
2237 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2238 armnn::IConnectableLayer* const spaceToDepthLayer = network->AddSpaceToDepthLayer(desc, layerName.c_str());
2239 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2240
2241 inputLayer->GetOutputSlot(0).Connect(spaceToDepthLayer->GetInputSlot(0));
2242 spaceToDepthLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2243
2244 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2245 spaceToDepthLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2246
2247 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002248 CHECK(deserializedNetwork);
Aron Virginas-Taraa067142019-06-11 16:01:44 +01002249
Finn Williamsb454c5c2021-02-09 15:56:23 +00002250 LayerVerifierBaseWithDescriptor<armnn::SpaceToDepthDescriptor> verifier(
2251 layerName, {inputInfo}, {outputInfo}, desc);
2252 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Taraa067142019-06-11 16:01:44 +01002253}
2254
Sadik Armagan1625efc2021-06-10 18:24:34 +01002255TEST_CASE("SerializeSplitter")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002256{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002257 const unsigned int numViews = 3;
2258 const unsigned int numDimensions = 4;
2259 const unsigned int inputShape[] = {1, 18, 4, 4};
2260 const unsigned int outputShape[] = {1, 6, 4, 4};
2261
2262 // This is modelled on how the caffe parser sets up a splitter layer to partition an input along dimension one.
2263 unsigned int splitterDimSizes[4] = {static_cast<unsigned int>(inputShape[0]),
2264 static_cast<unsigned int>(inputShape[1]),
2265 static_cast<unsigned int>(inputShape[2]),
2266 static_cast<unsigned int>(inputShape[3])};
2267 splitterDimSizes[1] /= numViews;
2268 armnn::ViewsDescriptor desc(numViews, numDimensions);
2269
2270 for (unsigned int g = 0; g < numViews; ++g)
2271 {
2272 desc.SetViewOriginCoord(g, 1, splitterDimSizes[1] * g);
2273
2274 for (unsigned int dimIdx=0; dimIdx < 4; dimIdx++)
2275 {
2276 desc.SetViewSize(g, dimIdx, splitterDimSizes[dimIdx]);
2277 }
2278 }
2279
2280 const std::string layerName("splitter");
2281 const armnn::TensorInfo inputInfo(numDimensions, inputShape, armnn::DataType::Float32);
2282 const armnn::TensorInfo outputInfo(numDimensions, outputShape, armnn::DataType::Float32);
2283
2284 armnn::INetworkPtr network = armnn::INetwork::Create();
2285 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2286 armnn::IConnectableLayer* const splitterLayer = network->AddSplitterLayer(desc, layerName.c_str());
2287 armnn::IConnectableLayer* const outputLayer0 = network->AddOutputLayer(0);
2288 armnn::IConnectableLayer* const outputLayer1 = network->AddOutputLayer(1);
2289 armnn::IConnectableLayer* const outputLayer2 = network->AddOutputLayer(2);
2290
2291 inputLayer->GetOutputSlot(0).Connect(splitterLayer->GetInputSlot(0));
2292 splitterLayer->GetOutputSlot(0).Connect(outputLayer0->GetInputSlot(0));
2293 splitterLayer->GetOutputSlot(1).Connect(outputLayer1->GetInputSlot(0));
2294 splitterLayer->GetOutputSlot(2).Connect(outputLayer2->GetInputSlot(0));
2295
2296 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2297 splitterLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2298 splitterLayer->GetOutputSlot(1).SetTensorInfo(outputInfo);
2299 splitterLayer->GetOutputSlot(2).SetTensorInfo(outputInfo);
2300
2301 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002302 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002303
Finn Williamsb454c5c2021-02-09 15:56:23 +00002304 LayerVerifierBaseWithDescriptor<armnn::ViewsDescriptor> verifier(
2305 layerName, {inputInfo}, {outputInfo, outputInfo, outputInfo}, desc);
2306 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002307}
2308
Sadik Armagan1625efc2021-06-10 18:24:34 +01002309TEST_CASE("SerializeStack")
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01002310{
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01002311 const std::string layerName("stack");
2312
2313 armnn::TensorInfo inputTensorInfo ({4, 3, 5}, armnn::DataType::Float32);
2314 armnn::TensorInfo outputTensorInfo({4, 3, 2, 5}, armnn::DataType::Float32);
2315
2316 armnn::StackDescriptor descriptor(2, 2, {4, 3, 5});
2317
2318 armnn::INetworkPtr network = armnn::INetwork::Create();
2319 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(0);
2320 armnn::IConnectableLayer* const inputLayer2 = network->AddInputLayer(1);
2321 armnn::IConnectableLayer* const stackLayer = network->AddStackLayer(descriptor, layerName.c_str());
2322 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2323
2324 inputLayer1->GetOutputSlot(0).Connect(stackLayer->GetInputSlot(0));
2325 inputLayer2->GetOutputSlot(0).Connect(stackLayer->GetInputSlot(1));
2326 stackLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2327
2328 inputLayer1->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
2329 inputLayer2->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
2330 stackLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
2331
2332 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002333 CHECK(deserializedNetwork);
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01002334
Finn Williamsb454c5c2021-02-09 15:56:23 +00002335 LayerVerifierBaseWithDescriptor<armnn::StackDescriptor> verifier(
2336 layerName, {inputTensorInfo, inputTensorInfo}, {outputTensorInfo}, descriptor);
2337 deserializedNetwork->ExecuteStrategy(verifier);
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01002338}
2339
Sadik Armagan1625efc2021-06-10 18:24:34 +01002340TEST_CASE("SerializeStandIn")
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01002341{
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01002342 const std::string layerName("standIn");
2343
2344 armnn::TensorInfo tensorInfo({ 1u }, armnn::DataType::Float32);
2345 armnn::StandInDescriptor descriptor(2u, 2u);
2346
2347 armnn::INetworkPtr network = armnn::INetwork::Create();
2348 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
2349 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
2350 armnn::IConnectableLayer* const standInLayer = network->AddStandInLayer(descriptor, layerName.c_str());
2351 armnn::IConnectableLayer* const outputLayer0 = network->AddOutputLayer(0);
2352 armnn::IConnectableLayer* const outputLayer1 = network->AddOutputLayer(1);
2353
2354 inputLayer0->GetOutputSlot(0).Connect(standInLayer->GetInputSlot(0));
2355 inputLayer0->GetOutputSlot(0).SetTensorInfo(tensorInfo);
2356
2357 inputLayer1->GetOutputSlot(0).Connect(standInLayer->GetInputSlot(1));
2358 inputLayer1->GetOutputSlot(0).SetTensorInfo(tensorInfo);
2359
2360 standInLayer->GetOutputSlot(0).Connect(outputLayer0->GetInputSlot(0));
2361 standInLayer->GetOutputSlot(0).SetTensorInfo(tensorInfo);
2362
2363 standInLayer->GetOutputSlot(1).Connect(outputLayer1->GetInputSlot(0));
2364 standInLayer->GetOutputSlot(1).SetTensorInfo(tensorInfo);
2365
2366 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002367 CHECK(deserializedNetwork);
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01002368
Finn Williamsb454c5c2021-02-09 15:56:23 +00002369 LayerVerifierBaseWithDescriptor<armnn::StandInDescriptor> verifier(
2370 layerName, { tensorInfo, tensorInfo }, { tensorInfo, tensorInfo }, descriptor);
2371 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01002372}
2373
Sadik Armagan1625efc2021-06-10 18:24:34 +01002374TEST_CASE("SerializeStridedSlice")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002375{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002376 const std::string layerName("stridedSlice");
2377 const armnn::TensorInfo inputInfo = armnn::TensorInfo({3, 2, 3, 1}, armnn::DataType::Float32);
2378 const armnn::TensorInfo outputInfo = armnn::TensorInfo({3, 1}, armnn::DataType::Float32);
2379
2380 armnn::StridedSliceDescriptor desc({0, 0, 1, 0}, {1, 1, 1, 1}, {1, 1, 1, 1});
2381 desc.m_EndMask = (1 << 4) - 1;
2382 desc.m_ShrinkAxisMask = (1 << 1) | (1 << 2);
2383 desc.m_DataLayout = armnn::DataLayout::NCHW;
2384
2385 armnn::INetworkPtr network = armnn::INetwork::Create();
2386 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2387 armnn::IConnectableLayer* const stridedSliceLayer = network->AddStridedSliceLayer(desc, layerName.c_str());
2388 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2389
2390 inputLayer->GetOutputSlot(0).Connect(stridedSliceLayer->GetInputSlot(0));
2391 stridedSliceLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2392
2393 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2394 stridedSliceLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2395
2396 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002397 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002398
Finn Williamsb454c5c2021-02-09 15:56:23 +00002399 LayerVerifierBaseWithDescriptor<armnn::StridedSliceDescriptor> verifier(
2400 layerName, {inputInfo}, {outputInfo}, desc);
2401 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002402}
2403
Sadik Armagan1625efc2021-06-10 18:24:34 +01002404TEST_CASE("SerializeSubtraction")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002405{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002406 const std::string layerName("subtraction");
2407 const armnn::TensorInfo info({ 1, 4 }, armnn::DataType::Float32);
2408
2409 armnn::INetworkPtr network = armnn::INetwork::Create();
2410 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
2411 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
2412 armnn::IConnectableLayer* const subtractionLayer = network->AddSubtractionLayer(layerName.c_str());
2413 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2414
2415 inputLayer0->GetOutputSlot(0).Connect(subtractionLayer->GetInputSlot(0));
2416 inputLayer1->GetOutputSlot(0).Connect(subtractionLayer->GetInputSlot(1));
2417 subtractionLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2418
2419 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
2420 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
2421 subtractionLayer->GetOutputSlot(0).SetTensorInfo(info);
2422
2423 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002424 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002425
Finn Williamsb454c5c2021-02-09 15:56:23 +00002426 LayerVerifierBase verifier(layerName, {info, info}, {info});
2427 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +00002428}
2429
Sadik Armagan1625efc2021-06-10 18:24:34 +01002430TEST_CASE("SerializeSwitch")
Sadik Armaganeff363d2019-04-05 15:25:46 +01002431{
2432 class SwitchLayerVerifier : public LayerVerifierBase
2433 {
2434 public:
2435 SwitchLayerVerifier(const std::string& layerName,
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01002436 const std::vector<armnn::TensorInfo>& inputInfos,
2437 const std::vector<armnn::TensorInfo>& outputInfos)
Finn Williamsb454c5c2021-02-09 15:56:23 +00002438 : LayerVerifierBase(layerName, inputInfos, outputInfos) {}
Sadik Armaganeff363d2019-04-05 15:25:46 +01002439
Finn Williamsb454c5c2021-02-09 15:56:23 +00002440 void ExecuteStrategy(const armnn::IConnectableLayer* layer,
2441 const armnn::BaseDescriptor& descriptor,
2442 const std::vector<armnn::ConstTensor>& constants,
2443 const char* name,
2444 const armnn::LayerBindingId id = 0) override
Sadik Armaganeff363d2019-04-05 15:25:46 +01002445 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00002446 armnn::IgnoreUnused(descriptor, constants, id);
2447 switch (layer->GetType())
2448 {
2449 case armnn::LayerType::Input: break;
2450 case armnn::LayerType::Output: break;
2451 case armnn::LayerType::Constant: break;
2452 case armnn::LayerType::Switch:
2453 {
2454 VerifyNameAndConnections(layer, name);
2455 break;
2456 }
2457 default:
2458 {
2459 throw armnn::Exception("Unexpected layer type in Switch test model");
2460 }
2461 }
Sadik Armaganeff363d2019-04-05 15:25:46 +01002462 }
Sadik Armaganeff363d2019-04-05 15:25:46 +01002463 };
2464
2465 const std::string layerName("switch");
2466 const armnn::TensorInfo info({ 1, 4 }, armnn::DataType::Float32);
2467
2468 std::vector<float> constantData = GenerateRandomData<float>(info.GetNumElements());
2469 armnn::ConstTensor constTensor(info, constantData);
2470
2471 armnn::INetworkPtr network = armnn::INetwork::Create();
2472 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2473 armnn::IConnectableLayer* const constantLayer = network->AddConstantLayer(constTensor, "constant");
2474 armnn::IConnectableLayer* const switchLayer = network->AddSwitchLayer(layerName.c_str());
2475 armnn::IConnectableLayer* const trueOutputLayer = network->AddOutputLayer(0);
2476 armnn::IConnectableLayer* const falseOutputLayer = network->AddOutputLayer(1);
2477
2478 inputLayer->GetOutputSlot(0).Connect(switchLayer->GetInputSlot(0));
2479 constantLayer->GetOutputSlot(0).Connect(switchLayer->GetInputSlot(1));
2480 switchLayer->GetOutputSlot(0).Connect(trueOutputLayer->GetInputSlot(0));
2481 switchLayer->GetOutputSlot(1).Connect(falseOutputLayer->GetInputSlot(0));
2482
2483 inputLayer->GetOutputSlot(0).SetTensorInfo(info);
2484 constantLayer->GetOutputSlot(0).SetTensorInfo(info);
2485 switchLayer->GetOutputSlot(0).SetTensorInfo(info);
2486 switchLayer->GetOutputSlot(1).SetTensorInfo(info);
2487
2488 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002489 CHECK(deserializedNetwork);
Sadik Armaganeff363d2019-04-05 15:25:46 +01002490
2491 SwitchLayerVerifier verifier(layerName, {info, info}, {info, info});
Finn Williamsb454c5c2021-02-09 15:56:23 +00002492 deserializedNetwork->ExecuteStrategy(verifier);
Sadik Armaganeff363d2019-04-05 15:25:46 +01002493}
2494
Sadik Armagan1625efc2021-06-10 18:24:34 +01002495TEST_CASE("SerializeTranspose")
Mike Kellyc9ea45a2020-02-28 18:11:58 +00002496{
Mike Kellyc9ea45a2020-02-28 18:11:58 +00002497 const std::string layerName("transpose");
2498 const armnn::TensorInfo inputTensorInfo({4, 3, 2, 1}, armnn::DataType::Float32);
2499 const armnn::TensorInfo outputTensorInfo({1, 2, 3, 4}, armnn::DataType::Float32);
2500
2501 armnn::TransposeDescriptor descriptor(armnn::PermutationVector({3, 2, 1, 0}));
2502
2503 armnn::INetworkPtr network = armnn::INetwork::Create();
2504 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2505 armnn::IConnectableLayer* const transposeLayer = network->AddTransposeLayer(descriptor, layerName.c_str());
2506 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2507
2508 inputLayer->GetOutputSlot(0).Connect(transposeLayer->GetInputSlot(0));
2509 transposeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2510
2511 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
2512 transposeLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
2513
2514 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002515 CHECK(deserializedNetwork);
Mike Kellyc9ea45a2020-02-28 18:11:58 +00002516
Finn Williamsb454c5c2021-02-09 15:56:23 +00002517 LayerVerifierBaseWithDescriptor<armnn::TransposeDescriptor> verifier(
2518 layerName, {inputTensorInfo}, {outputTensorInfo}, descriptor);
2519 deserializedNetwork->ExecuteStrategy(verifier);
Mike Kellyc9ea45a2020-02-28 18:11:58 +00002520}
2521
Sadik Armagan1625efc2021-06-10 18:24:34 +01002522TEST_CASE("SerializeTransposeConvolution2d")
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01002523{
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01002524 const std::string layerName("transposeConvolution2d");
2525 const armnn::TensorInfo inputInfo ({ 1, 7, 7, 1 }, armnn::DataType::Float32);
2526 const armnn::TensorInfo outputInfo({ 1, 9, 9, 1 }, armnn::DataType::Float32);
2527
2528 const armnn::TensorInfo weightsInfo({ 1, 3, 3, 1 }, armnn::DataType::Float32);
2529 const armnn::TensorInfo biasesInfo ({ 1 }, armnn::DataType::Float32);
2530
2531 std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements());
2532 armnn::ConstTensor weights(weightsInfo, weightsData);
2533
2534 std::vector<float> biasesData = GenerateRandomData<float>(biasesInfo.GetNumElements());
2535 armnn::ConstTensor biases(biasesInfo, biasesData);
2536
2537 armnn::TransposeConvolution2dDescriptor descriptor;
2538 descriptor.m_PadLeft = 1;
2539 descriptor.m_PadRight = 1;
2540 descriptor.m_PadTop = 1;
2541 descriptor.m_PadBottom = 1;
2542 descriptor.m_StrideX = 1;
2543 descriptor.m_StrideY = 1;
2544 descriptor.m_BiasEnabled = true;
2545 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
2546
2547 armnn::INetworkPtr network = armnn::INetwork::Create();
2548 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2549 armnn::IConnectableLayer* const convLayer =
2550 network->AddTransposeConvolution2dLayer(descriptor,
2551 weights,
2552 armnn::Optional<armnn::ConstTensor>(biases),
2553 layerName.c_str());
2554 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2555
2556 inputLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(0));
2557 convLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2558
2559 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2560 convLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2561
2562 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002563 CHECK(deserializedNetwork);
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01002564
Finn Williamsb454c5c2021-02-09 15:56:23 +00002565 const std::vector<armnn::ConstTensor> constants {weights, biases};
2566 LayerVerifierBaseWithDescriptorAndConstants<armnn::TransposeConvolution2dDescriptor> verifier(
2567 layerName, {inputInfo}, {outputInfo}, descriptor, constants);
2568 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01002569}
2570
Sadik Armagan1625efc2021-06-10 18:24:34 +01002571TEST_CASE("SerializeDeserializeNonLinearNetwork")
Sadik Armagandb059fd2019-03-20 12:28:32 +00002572{
2573 class ConstantLayerVerifier : public LayerVerifierBase
2574 {
2575 public:
2576 ConstantLayerVerifier(const std::string& layerName,
2577 const std::vector<armnn::TensorInfo>& inputInfos,
2578 const std::vector<armnn::TensorInfo>& outputInfos,
2579 const armnn::ConstTensor& layerInput)
2580 : LayerVerifierBase(layerName, inputInfos, outputInfos)
2581 , m_LayerInput(layerInput) {}
2582
Finn Williamsb454c5c2021-02-09 15:56:23 +00002583 void ExecuteStrategy(const armnn::IConnectableLayer* layer,
2584 const armnn::BaseDescriptor& descriptor,
2585 const std::vector<armnn::ConstTensor>& constants,
2586 const char* name,
2587 const armnn::LayerBindingId id = 0) override
Sadik Armagandb059fd2019-03-20 12:28:32 +00002588 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00002589 armnn::IgnoreUnused(descriptor, constants, id);
2590 switch (layer->GetType())
2591 {
2592 case armnn::LayerType::Input: break;
2593 case armnn::LayerType::Output: break;
2594 case armnn::LayerType::Addition: break;
2595 case armnn::LayerType::Constant:
2596 {
2597 VerifyNameAndConnections(layer, name);
2598 CompareConstTensor(constants.at(0), m_LayerInput);
2599 break;
2600 }
2601 default:
2602 {
2603 throw armnn::Exception("Unexpected layer type in test model");
2604 }
2605 }
Sadik Armagandb059fd2019-03-20 12:28:32 +00002606 }
2607
Sadik Armagandb059fd2019-03-20 12:28:32 +00002608 private:
2609 armnn::ConstTensor m_LayerInput;
2610 };
2611
2612 const std::string layerName("constant");
2613 const armnn::TensorInfo info({ 2, 3 }, armnn::DataType::Float32);
2614
2615 std::vector<float> constantData = GenerateRandomData<float>(info.GetNumElements());
2616 armnn::ConstTensor constTensor(info, constantData);
2617
2618 armnn::INetworkPtr network(armnn::INetwork::Create());
2619 armnn::IConnectableLayer* input = network->AddInputLayer(0);
2620 armnn::IConnectableLayer* add = network->AddAdditionLayer();
2621 armnn::IConnectableLayer* constant = network->AddConstantLayer(constTensor, layerName.c_str());
2622 armnn::IConnectableLayer* output = network->AddOutputLayer(0);
2623
2624 input->GetOutputSlot(0).Connect(add->GetInputSlot(0));
2625 constant->GetOutputSlot(0).Connect(add->GetInputSlot(1));
2626 add->GetOutputSlot(0).Connect(output->GetInputSlot(0));
2627
2628 input->GetOutputSlot(0).SetTensorInfo(info);
2629 constant->GetOutputSlot(0).SetTensorInfo(info);
2630 add->GetOutputSlot(0).SetTensorInfo(info);
2631
2632 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002633 CHECK(deserializedNetwork);
Sadik Armagandb059fd2019-03-20 12:28:32 +00002634
2635 ConstantLayerVerifier verifier(layerName, {}, {info}, constTensor);
Finn Williamsb454c5c2021-02-09 15:56:23 +00002636 deserializedNetwork->ExecuteStrategy(verifier);
James Conroy8d333182020-05-13 10:27:58 +01002637}
2638
Teresa Charlin50de4fa2021-05-31 18:47:33 +01002639}