blob: 2bffe0b9fdecc3bd1a7fc293390d19ee0b7ed235 [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);
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100475 armnn::IConnectableLayer* const weightsLayer = network->AddConstantLayer(weights, "Weights");
476 armnn::IConnectableLayer* const biasesLayer = network->AddConstantLayer(biases, "Biases");
477 armnn::IConnectableLayer* const convLayer = network->AddConvolution3dLayer(descriptor, layerName.c_str());
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100478 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
479
480 inputLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(0));
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100481 weightsLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(1));
482 biasesLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(2));
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100483 convLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
484
485 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100486 weightsLayer->GetOutputSlot(0).SetTensorInfo(weightsInfo);
487 biasesLayer->GetOutputSlot(0).SetTensorInfo(biasesInfo);
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100488 convLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
489
490 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
491 CHECK(deserializedNetwork);
492
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100493 LayerVerifierBaseWithDescriptor<armnn::Convolution3dDescriptor> verifier(
494 layerName, {inputInfo, weightsInfo, biasesInfo}, {outputInfo}, descriptor);
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100495 deserializedNetwork->ExecuteStrategy(verifier);
496}
497
Sadik Armagan1625efc2021-06-10 18:24:34 +0100498TEST_CASE("SerializeDepthToSpace")
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100499{
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100500 const std::string layerName("depthToSpace");
501
502 const armnn::TensorInfo inputInfo ({ 1, 8, 4, 12 }, armnn::DataType::Float32);
503 const armnn::TensorInfo outputInfo({ 1, 16, 8, 3 }, armnn::DataType::Float32);
504
505 armnn::DepthToSpaceDescriptor desc;
506 desc.m_BlockSize = 2;
507 desc.m_DataLayout = armnn::DataLayout::NHWC;
508
509 armnn::INetworkPtr network = armnn::INetwork::Create();
510 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
511 armnn::IConnectableLayer* const depthToSpaceLayer = network->AddDepthToSpaceLayer(desc, layerName.c_str());
512 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
513
514 inputLayer->GetOutputSlot(0).Connect(depthToSpaceLayer->GetInputSlot(0));
515 depthToSpaceLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
516
517 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
518 depthToSpaceLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
519
520 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100521 CHECK(deserializedNetwork);
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100522
Finn Williamsb454c5c2021-02-09 15:56:23 +0000523 LayerVerifierBaseWithDescriptor<armnn::DepthToSpaceDescriptor> verifier(layerName, {inputInfo}, {outputInfo}, desc);
524 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100525}
526
Sadik Armagan1625efc2021-06-10 18:24:34 +0100527TEST_CASE("SerializeDepthwiseConvolution2d")
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000528{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000529 const std::string layerName("depwiseConvolution2d");
530 const armnn::TensorInfo inputInfo ({ 1, 5, 5, 3 }, armnn::DataType::Float32);
531 const armnn::TensorInfo outputInfo({ 1, 3, 3, 3 }, armnn::DataType::Float32);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000532
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000533 const armnn::TensorInfo weightsInfo({ 1, 3, 3, 3 }, armnn::DataType::Float32);
534 const armnn::TensorInfo biasesInfo ({ 3 }, armnn::DataType::Float32);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000535
536 std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements());
537 armnn::ConstTensor weights(weightsInfo, weightsData);
538
539 std::vector<int32_t> biasesData = GenerateRandomData<int32_t>(biasesInfo.GetNumElements());
540 armnn::ConstTensor biases(biasesInfo, biasesData);
541
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000542 armnn::DepthwiseConvolution2dDescriptor descriptor;
Aron Virginas-Tar5e1b0cf2019-06-21 14:20:11 +0100543 descriptor.m_PadLeft = 1;
544 descriptor.m_PadRight = 1;
545 descriptor.m_PadTop = 1;
546 descriptor.m_PadBottom = 1;
547 descriptor.m_StrideX = 2;
548 descriptor.m_StrideY = 2;
549 descriptor.m_DilationX = 2;
550 descriptor.m_DilationY = 2;
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000551 descriptor.m_BiasEnabled = true;
552 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
553
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000554 armnn::INetworkPtr network = armnn::INetwork::Create();
555 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
556 armnn::IConnectableLayer* const depthwiseConvLayer =
Matteo Martincighfc598e12019-05-14 10:36:13 +0100557 network->AddDepthwiseConvolution2dLayer(descriptor,
558 weights,
559 armnn::Optional<armnn::ConstTensor>(biases),
560 layerName.c_str());
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000561 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
562
563 inputLayer->GetOutputSlot(0).Connect(depthwiseConvLayer->GetInputSlot(0));
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000564 depthwiseConvLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000565
566 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000567 depthwiseConvLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
568
569 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100570 CHECK(deserializedNetwork);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000571
Finn Williamsb454c5c2021-02-09 15:56:23 +0000572 const std::vector<armnn::ConstTensor>& constants {weights, biases};
573 LayerVerifierBaseWithDescriptorAndConstants<armnn::DepthwiseConvolution2dDescriptor> verifier(
574 layerName, {inputInfo}, {outputInfo}, descriptor, constants);
575 deserializedNetwork->ExecuteStrategy(verifier);
Jim Flynn18ce3382019-03-08 11:08:30 +0000576}
577
Sadik Armagan1625efc2021-06-10 18:24:34 +0100578TEST_CASE("SerializeDepthwiseConvolution2dWithPerAxisParams")
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000579{
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000580 using namespace armnn;
581
582 const std::string layerName("depwiseConvolution2dWithPerAxis");
583 const TensorInfo inputInfo ({ 1, 3, 3, 2 }, DataType::QAsymmU8, 0.55f, 128);
584 const TensorInfo outputInfo({ 1, 2, 2, 4 }, DataType::QAsymmU8, 0.75f, 128);
585
586 const std::vector<float> quantScales{ 0.75f, 0.80f, 0.90f, 0.95f };
587 const unsigned int quantDimension = 0;
588 TensorInfo kernelInfo({ 2, 2, 2, 2 }, DataType::QSymmS8, quantScales, quantDimension);
589
590 const std::vector<float> biasQuantScales{ 0.25f, 0.35f, 0.45f, 0.55f };
591 constexpr unsigned int biasQuantDimension = 0;
592 TensorInfo biasInfo({ 4 }, DataType::Signed32, biasQuantScales, biasQuantDimension);
593
594 std::vector<int8_t> kernelData = GenerateRandomData<int8_t>(kernelInfo.GetNumElements());
595 armnn::ConstTensor weights(kernelInfo, kernelData);
596 std::vector<int32_t> biasData = GenerateRandomData<int32_t>(biasInfo.GetNumElements());
597 armnn::ConstTensor biases(biasInfo, biasData);
598
599 DepthwiseConvolution2dDescriptor descriptor;
600 descriptor.m_StrideX = 1;
601 descriptor.m_StrideY = 1;
602 descriptor.m_PadLeft = 0;
603 descriptor.m_PadRight = 0;
604 descriptor.m_PadTop = 0;
605 descriptor.m_PadBottom = 0;
606 descriptor.m_DilationX = 1;
607 descriptor.m_DilationY = 1;
608 descriptor.m_BiasEnabled = true;
609 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
610
611 armnn::INetworkPtr network = armnn::INetwork::Create();
612 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
613 armnn::IConnectableLayer* const depthwiseConvLayer =
614 network->AddDepthwiseConvolution2dLayer(descriptor,
615 weights,
616 armnn::Optional<armnn::ConstTensor>(biases),
617 layerName.c_str());
618 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
619
620 inputLayer->GetOutputSlot(0).Connect(depthwiseConvLayer->GetInputSlot(0));
621 depthwiseConvLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
622
623 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
624 depthwiseConvLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
625
626 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100627 CHECK(deserializedNetwork);
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000628
Finn Williamsb454c5c2021-02-09 15:56:23 +0000629 const std::vector<armnn::ConstTensor>& constants {weights, biases};
630 LayerVerifierBaseWithDescriptorAndConstants<armnn::DepthwiseConvolution2dDescriptor> verifier(
631 layerName, {inputInfo}, {outputInfo}, descriptor, constants);
632 deserializedNetwork->ExecuteStrategy(verifier);
Sadik Armagan1a84fe32020-03-27 15:56:57 +0000633}
634
Sadik Armagan1625efc2021-06-10 18:24:34 +0100635TEST_CASE("SerializeDequantize")
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000636{
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000637 const std::string layerName("dequantize");
Derek Lambertif90c56d2020-01-10 17:14:08 +0000638 const armnn::TensorInfo inputInfo({ 1, 5, 2, 3 }, armnn::DataType::QAsymmU8, 0.5f, 1);
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000639 const armnn::TensorInfo outputInfo({ 1, 5, 2, 3 }, armnn::DataType::Float32);
640
641 armnn::INetworkPtr network = armnn::INetwork::Create();
642 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
643 armnn::IConnectableLayer* const dequantizeLayer = network->AddDequantizeLayer(layerName.c_str());
644 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
645
646 inputLayer->GetOutputSlot(0).Connect(dequantizeLayer->GetInputSlot(0));
647 dequantizeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
648
649 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
650 dequantizeLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
651
652 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100653 CHECK(deserializedNetwork);
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000654
Finn Williamsb454c5c2021-02-09 15:56:23 +0000655 LayerVerifierBase verifier(layerName, {inputInfo}, {outputInfo});
656 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000657}
658
Sadik Armagan1625efc2021-06-10 18:24:34 +0100659TEST_CASE("SerializeDeserializeDetectionPostProcess")
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000660{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000661 const std::string layerName("detectionPostProcess");
662
663 const std::vector<armnn::TensorInfo> inputInfos({
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000664 armnn::TensorInfo({ 1, 6, 4 }, armnn::DataType::Float32),
665 armnn::TensorInfo({ 1, 6, 3}, armnn::DataType::Float32)
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000666 });
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000667
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000668 const std::vector<armnn::TensorInfo> outputInfos({
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000669 armnn::TensorInfo({ 1, 3, 4 }, armnn::DataType::Float32),
670 armnn::TensorInfo({ 1, 3 }, armnn::DataType::Float32),
671 armnn::TensorInfo({ 1, 3 }, armnn::DataType::Float32),
672 armnn::TensorInfo({ 1 }, armnn::DataType::Float32)
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000673 });
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000674
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000675 armnn::DetectionPostProcessDescriptor descriptor;
676 descriptor.m_UseRegularNms = true;
677 descriptor.m_MaxDetections = 3;
678 descriptor.m_MaxClassesPerDetection = 1;
679 descriptor.m_DetectionsPerClass =1;
680 descriptor.m_NmsScoreThreshold = 0.0;
681 descriptor.m_NmsIouThreshold = 0.5;
682 descriptor.m_NumClasses = 2;
683 descriptor.m_ScaleY = 10.0;
684 descriptor.m_ScaleX = 10.0;
685 descriptor.m_ScaleH = 5.0;
686 descriptor.m_ScaleW = 5.0;
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000687
688 const armnn::TensorInfo anchorsInfo({ 6, 4 }, armnn::DataType::Float32);
689 const std::vector<float> anchorsData({
690 0.5f, 0.5f, 1.0f, 1.0f,
691 0.5f, 0.5f, 1.0f, 1.0f,
692 0.5f, 0.5f, 1.0f, 1.0f,
693 0.5f, 10.5f, 1.0f, 1.0f,
694 0.5f, 10.5f, 1.0f, 1.0f,
695 0.5f, 100.5f, 1.0f, 1.0f
696 });
697 armnn::ConstTensor anchors(anchorsInfo, anchorsData);
698
699 armnn::INetworkPtr network = armnn::INetwork::Create();
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000700 armnn::IConnectableLayer* const detectionLayer =
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000701 network->AddDetectionPostProcessLayer(descriptor, anchors, layerName.c_str());
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000702
703 for (unsigned int i = 0; i < 2; i++)
704 {
705 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(static_cast<int>(i));
706 inputLayer->GetOutputSlot(0).Connect(detectionLayer->GetInputSlot(i));
707 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfos[i]);
708 }
709
710 for (unsigned int i = 0; i < 4; i++)
711 {
712 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(static_cast<int>(i));
713 detectionLayer->GetOutputSlot(i).Connect(outputLayer->GetInputSlot(0));
714 detectionLayer->GetOutputSlot(i).SetTensorInfo(outputInfos[i]);
715 }
716
717 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100718 CHECK(deserializedNetwork);
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000719
Finn Williamsb454c5c2021-02-09 15:56:23 +0000720 const std::vector<armnn::ConstTensor>& constants {anchors};
721 LayerVerifierBaseWithDescriptorAndConstants<armnn::DetectionPostProcessDescriptor> verifier(
722 layerName, inputInfos, outputInfos, descriptor, constants);
723 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000724}
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000725
Sadik Armagan1625efc2021-06-10 18:24:34 +0100726TEST_CASE("SerializeDivision")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000727{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000728 const std::string layerName("division");
729 const armnn::TensorInfo info({ 1, 5, 2, 3 }, armnn::DataType::Float32);
730
731 armnn::INetworkPtr network = armnn::INetwork::Create();
732 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
733 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
734 armnn::IConnectableLayer* const divisionLayer = network->AddDivisionLayer(layerName.c_str());
735 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
736
737 inputLayer0->GetOutputSlot(0).Connect(divisionLayer->GetInputSlot(0));
738 inputLayer1->GetOutputSlot(0).Connect(divisionLayer->GetInputSlot(1));
739 divisionLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
740
741 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
742 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
743 divisionLayer->GetOutputSlot(0).SetTensorInfo(info);
744
745 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100746 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000747
Finn Williamsb454c5c2021-02-09 15:56:23 +0000748 LayerVerifierBase verifier(layerName, {info, info}, {info});
749 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +0000750}
751
Jan Eilers1b2654f2021-09-24 15:45:46 +0100752TEST_CASE("SerializeDeserializeComparisonEqual")
Aron Virginas-Tar6d2e6592019-10-22 11:44:47 +0100753{
Finn Williamsb454c5c2021-02-09 15:56:23 +0000754 const std::string layerName("EqualLayer");
755 const armnn::TensorInfo inputTensorInfo1 = armnn::TensorInfo({2, 1, 2, 4}, armnn::DataType::Float32);
756 const armnn::TensorInfo inputTensorInfo2 = armnn::TensorInfo({2, 1, 2, 4}, armnn::DataType::Float32);
757 const armnn::TensorInfo outputTensorInfo = armnn::TensorInfo({2, 1, 2, 4}, armnn::DataType::Boolean);
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100758
759 armnn::INetworkPtr network = armnn::INetwork::Create();
Finn Williamsb454c5c2021-02-09 15:56:23 +0000760 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(0);
761 armnn::IConnectableLayer* const inputLayer2 = network->AddInputLayer(1);
Jan Eilers1b2654f2021-09-24 15:45:46 +0100762 armnn::ComparisonDescriptor equalDescriptor(armnn::ComparisonOperation::Equal);
763 armnn::IConnectableLayer* const equalLayer = network->AddComparisonLayer(equalDescriptor, layerName.c_str());
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100764 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
Jan Eilers1b2654f2021-09-24 15:45:46 +01001114TEST_CASE("SerializeComparisonGreater")
Aron Virginas-Tar781ced92019-10-03 11:15:39 +01001115{
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01001116 const std::string layerName("greater");
1117
1118 const armnn::TensorShape shape{2, 1, 2, 4};
1119
1120 const armnn::TensorInfo inputInfo = armnn::TensorInfo(shape, armnn::DataType::Float32);
1121 const armnn::TensorInfo outputInfo = armnn::TensorInfo(shape, armnn::DataType::Boolean);
1122
1123 armnn::INetworkPtr network = armnn::INetwork::Create();
1124 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
1125 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
Jan Eilers1b2654f2021-09-24 15:45:46 +01001126 armnn::ComparisonDescriptor greaterDescriptor(armnn::ComparisonOperation::Greater);
1127 armnn::IConnectableLayer* const equalLayer = network->AddComparisonLayer(greaterDescriptor, layerName.c_str());
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01001128 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1129
1130 inputLayer0->GetOutputSlot(0).Connect(equalLayer->GetInputSlot(0));
1131 inputLayer1->GetOutputSlot(0).Connect(equalLayer->GetInputSlot(1));
1132 equalLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1133
1134 inputLayer0->GetOutputSlot(0).SetTensorInfo(inputInfo);
1135 inputLayer1->GetOutputSlot(0).SetTensorInfo(inputInfo);
1136 equalLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1137
1138 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001139 CHECK(deserializedNetwork);
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01001140
Finn Williamsb454c5c2021-02-09 15:56:23 +00001141 LayerVerifierBase verifier(layerName, { inputInfo, inputInfo }, { outputInfo });
1142 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01001143}
1144
Aron Virginas-Tar6d2e6592019-10-22 11:44:47 +01001145
Sadik Armagan1625efc2021-06-10 18:24:34 +01001146TEST_CASE("SerializeInstanceNormalization")
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01001147{
Aron Virginas-Tar781ced92019-10-03 11:15:39 +01001148 const std::string layerName("instanceNormalization");
1149 const armnn::TensorInfo info({ 1, 2, 1, 5 }, armnn::DataType::Float32);
1150
1151 armnn::InstanceNormalizationDescriptor descriptor;
1152 descriptor.m_Gamma = 1.1f;
1153 descriptor.m_Beta = 0.1f;
1154 descriptor.m_Eps = 0.0001f;
1155 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
1156
1157 armnn::INetworkPtr network = armnn::INetwork::Create();
1158 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1159 armnn::IConnectableLayer* const instanceNormLayer =
1160 network->AddInstanceNormalizationLayer(descriptor, layerName.c_str());
1161 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1162
1163 inputLayer->GetOutputSlot(0).Connect(instanceNormLayer->GetInputSlot(0));
1164 instanceNormLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1165
1166 inputLayer->GetOutputSlot(0).SetTensorInfo(info);
1167 instanceNormLayer->GetOutputSlot(0).SetTensorInfo(info);
1168
1169 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001170 CHECK(deserializedNetwork);
Aron Virginas-Tar781ced92019-10-03 11:15:39 +01001171
Finn Williamsb454c5c2021-02-09 15:56:23 +00001172 LayerVerifierBaseWithDescriptor<armnn::InstanceNormalizationDescriptor> verifier(
1173 layerName, {info}, {info}, descriptor);
1174 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tar781ced92019-10-03 11:15:39 +01001175}
1176
Sadik Armagan1625efc2021-06-10 18:24:34 +01001177TEST_CASE("SerializeL2Normalization")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001178{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001179 const std::string l2NormLayerName("l2Normalization");
1180 const armnn::TensorInfo info({1, 2, 1, 5}, armnn::DataType::Float32);
1181
1182 armnn::L2NormalizationDescriptor desc;
1183 desc.m_DataLayout = armnn::DataLayout::NCHW;
Ferran Balaguer0dcffec2019-06-18 16:25:06 +01001184 desc.m_Eps = 0.0001f;
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001185
1186 armnn::INetworkPtr network = armnn::INetwork::Create();
1187 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
1188 armnn::IConnectableLayer* const l2NormLayer = network->AddL2NormalizationLayer(desc, l2NormLayerName.c_str());
1189 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1190
1191 inputLayer0->GetOutputSlot(0).Connect(l2NormLayer->GetInputSlot(0));
1192 l2NormLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1193
1194 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
1195 l2NormLayer->GetOutputSlot(0).SetTensorInfo(info);
1196
1197 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001198 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001199
Finn Williamsb454c5c2021-02-09 15:56:23 +00001200 LayerVerifierBaseWithDescriptor<armnn::L2NormalizationDescriptor> verifier(
1201 l2NormLayerName, {info}, {info}, desc);
1202 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001203}
1204
Sadik Armagan1625efc2021-06-10 18:24:34 +01001205TEST_CASE("EnsureL2NormalizationBackwardCompatibility")
Ferran Balaguer0dcffec2019-06-18 16:25:06 +01001206{
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001207 // The hex data below is a flat buffer containing a simple network with one input
Ferran Balaguer0dcffec2019-06-18 16:25:06 +01001208 // a L2Normalization layer and an output layer with dimensions as per the tensor infos below.
1209 //
1210 // This test verifies that we can still read back these old style
1211 // models without the normalization epsilon value.
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001212 const std::vector<uint8_t> l2NormalizationModel =
Ferran Balaguer0dcffec2019-06-18 16:25:06 +01001213 {
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001214 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x0A, 0x00,
1215 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
1216 0x3C, 0x01, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
1217 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xE8, 0xFE, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x0B,
1218 0x04, 0x00, 0x00, 0x00, 0xD6, 0xFE, 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x08, 0x00,
1219 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x9E, 0xFF, 0xFF, 0xFF, 0x02, 0x00, 0x00, 0x00,
1220 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00,
1221 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1222 0x4C, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
1223 0x00, 0x20, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00,
1224 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
1225 0x0E, 0x00, 0x18, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x14, 0x00, 0x0E, 0x00, 0x00, 0x00,
1226 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x20, 0x00,
1227 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x6C, 0x32, 0x4E, 0x6F, 0x72, 0x6D, 0x61, 0x6C, 0x69, 0x7A, 0x61, 0x74,
1228 0x69, 0x6F, 0x6E, 0x00, 0x01, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00,
1229 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
1230 0x52, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00,
1231 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
1232 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1233 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x07, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09,
1234 0x04, 0x00, 0x00, 0x00, 0xF6, 0xFF, 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0A, 0x00,
1235 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x00, 0x00,
1236 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00,
1237 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1238 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0A, 0x00, 0x00, 0x00,
1239 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x08, 0x00,
1240 0x07, 0x00, 0x0C, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
1241 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
1242 0x05, 0x00, 0x00, 0x00, 0x00
1243 };
1244
1245 armnn::INetworkPtr deserializedNetwork =
1246 DeserializeNetwork(std::string(l2NormalizationModel.begin(), l2NormalizationModel.end()));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001247 CHECK(deserializedNetwork);
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001248
Ferran Balaguer0dcffec2019-06-18 16:25:06 +01001249 const std::string layerName("l2Normalization");
1250 const armnn::TensorInfo inputInfo = armnn::TensorInfo({1, 2, 1, 5}, armnn::DataType::Float32);
1251
1252 armnn::L2NormalizationDescriptor desc;
1253 desc.m_DataLayout = armnn::DataLayout::NCHW;
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001254 // Since this variable does not exist in the l2NormalizationModel dump, the default value will be loaded
Ferran Balaguer0dcffec2019-06-18 16:25:06 +01001255 desc.m_Eps = 1e-12f;
1256
Finn Williamsb454c5c2021-02-09 15:56:23 +00001257 LayerVerifierBaseWithDescriptor<armnn::L2NormalizationDescriptor> verifier(
1258 layerName, {inputInfo}, {inputInfo}, desc);
1259 deserializedNetwork->ExecuteStrategy(verifier);
Ferran Balaguer0dcffec2019-06-18 16:25:06 +01001260}
1261
Sadik Armagan1625efc2021-06-10 18:24:34 +01001262TEST_CASE("SerializeLogicalBinary")
James Conroyaba90cd2020-11-06 16:28:18 +00001263{
James Conroyaba90cd2020-11-06 16:28:18 +00001264 const std::string layerName("logicalBinaryAnd");
1265
1266 const armnn::TensorShape shape{2, 1, 2, 2};
1267
1268 const armnn::TensorInfo inputInfo = armnn::TensorInfo(shape, armnn::DataType::Boolean);
1269 const armnn::TensorInfo outputInfo = armnn::TensorInfo(shape, armnn::DataType::Boolean);
1270
1271 armnn::LogicalBinaryDescriptor descriptor(armnn::LogicalBinaryOperation::LogicalAnd);
1272
1273 armnn::INetworkPtr network = armnn::INetwork::Create();
1274 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
1275 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
1276 armnn::IConnectableLayer* const logicalBinaryLayer = network->AddLogicalBinaryLayer(descriptor, layerName.c_str());
1277 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1278
1279 inputLayer0->GetOutputSlot(0).Connect(logicalBinaryLayer->GetInputSlot(0));
1280 inputLayer1->GetOutputSlot(0).Connect(logicalBinaryLayer->GetInputSlot(1));
1281 logicalBinaryLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1282
1283 inputLayer0->GetOutputSlot(0).SetTensorInfo(inputInfo);
1284 inputLayer1->GetOutputSlot(0).SetTensorInfo(inputInfo);
1285 logicalBinaryLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1286
1287 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001288 CHECK(deserializedNetwork);
James Conroyaba90cd2020-11-06 16:28:18 +00001289
Finn Williamsb454c5c2021-02-09 15:56:23 +00001290 LayerVerifierBaseWithDescriptor<armnn::LogicalBinaryDescriptor> verifier(
1291 layerName, { inputInfo, inputInfo }, { outputInfo }, descriptor);
1292 deserializedNetwork->ExecuteStrategy(verifier);
James Conroyaba90cd2020-11-06 16:28:18 +00001293}
1294
Sadik Armagan1625efc2021-06-10 18:24:34 +01001295TEST_CASE("SerializeLogSoftmax")
Sadik Armagan26257852019-10-14 13:00:47 +01001296{
Sadik Armagan26257852019-10-14 13:00:47 +01001297 const std::string layerName("log_softmax");
1298 const armnn::TensorInfo info({1, 10}, armnn::DataType::Float32);
1299
1300 armnn::LogSoftmaxDescriptor descriptor;
1301 descriptor.m_Beta = 1.0f;
1302 descriptor.m_Axis = -1;
1303
1304 armnn::INetworkPtr network = armnn::INetwork::Create();
1305 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1306 armnn::IConnectableLayer* const logSoftmaxLayer = network->AddLogSoftmaxLayer(descriptor, layerName.c_str());
1307 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1308
1309 inputLayer->GetOutputSlot(0).Connect(logSoftmaxLayer->GetInputSlot(0));
1310 logSoftmaxLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1311
1312 inputLayer->GetOutputSlot(0).SetTensorInfo(info);
1313 logSoftmaxLayer->GetOutputSlot(0).SetTensorInfo(info);
1314
1315 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001316 CHECK(deserializedNetwork);
Sadik Armagan26257852019-10-14 13:00:47 +01001317
Finn Williamsb454c5c2021-02-09 15:56:23 +00001318 LayerVerifierBaseWithDescriptor<armnn::LogSoftmaxDescriptor> verifier(layerName, {info}, {info}, descriptor);
1319 deserializedNetwork->ExecuteStrategy(verifier);
Sadik Armagan26257852019-10-14 13:00:47 +01001320}
1321
Sadik Armagan1625efc2021-06-10 18:24:34 +01001322TEST_CASE("SerializeMaximum")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001323{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001324 const std::string layerName("maximum");
1325 const armnn::TensorInfo info({ 1, 2, 2, 3 }, armnn::DataType::Float32);
1326
1327 armnn::INetworkPtr network = armnn::INetwork::Create();
1328 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
1329 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
1330 armnn::IConnectableLayer* const maximumLayer = network->AddMaximumLayer(layerName.c_str());
1331 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1332
1333 inputLayer0->GetOutputSlot(0).Connect(maximumLayer->GetInputSlot(0));
1334 inputLayer1->GetOutputSlot(0).Connect(maximumLayer->GetInputSlot(1));
1335 maximumLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1336
1337 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
1338 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
1339 maximumLayer->GetOutputSlot(0).SetTensorInfo(info);
1340
1341 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001342 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001343
Finn Williamsb454c5c2021-02-09 15:56:23 +00001344 LayerVerifierBase verifier(layerName, {info, info}, {info});
1345 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001346}
1347
Sadik Armagan1625efc2021-06-10 18:24:34 +01001348TEST_CASE("SerializeMean")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001349{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001350 const std::string layerName("mean");
1351 const armnn::TensorInfo inputInfo({1, 1, 3, 2}, armnn::DataType::Float32);
1352 const armnn::TensorInfo outputInfo({1, 1, 1, 2}, armnn::DataType::Float32);
1353
1354 armnn::MeanDescriptor descriptor;
1355 descriptor.m_Axis = { 2 };
1356 descriptor.m_KeepDims = true;
1357
1358 armnn::INetworkPtr network = armnn::INetwork::Create();
1359 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1360 armnn::IConnectableLayer* const meanLayer = network->AddMeanLayer(descriptor, layerName.c_str());
1361 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1362
1363 inputLayer->GetOutputSlot(0).Connect(meanLayer->GetInputSlot(0));
1364 meanLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1365
1366 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
1367 meanLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1368
1369 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001370 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001371
Finn Williamsb454c5c2021-02-09 15:56:23 +00001372 LayerVerifierBaseWithDescriptor<armnn::MeanDescriptor> verifier(layerName, {inputInfo}, {outputInfo}, descriptor);
1373 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001374}
1375
Sadik Armagan1625efc2021-06-10 18:24:34 +01001376TEST_CASE("SerializeMerge")
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +01001377{
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +01001378 const std::string layerName("merge");
1379 const armnn::TensorInfo info({ 1, 2, 2, 3 }, armnn::DataType::Float32);
1380
1381 armnn::INetworkPtr network = armnn::INetwork::Create();
1382 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
1383 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
1384 armnn::IConnectableLayer* const mergeLayer = network->AddMergeLayer(layerName.c_str());
1385 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1386
1387 inputLayer0->GetOutputSlot(0).Connect(mergeLayer->GetInputSlot(0));
1388 inputLayer1->GetOutputSlot(0).Connect(mergeLayer->GetInputSlot(1));
1389 mergeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1390
1391 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
1392 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
1393 mergeLayer->GetOutputSlot(0).SetTensorInfo(info);
1394
1395 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001396 CHECK(deserializedNetwork);
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +01001397
Finn Williamsb454c5c2021-02-09 15:56:23 +00001398 LayerVerifierBase verifier(layerName, {info, info}, {info});
1399 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +01001400}
1401
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01001402class MergerLayerVerifier : public LayerVerifierBaseWithDescriptor<armnn::OriginsDescriptor>
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001403{
Jim Flynn5fa83932019-05-09 15:35:43 +01001404public:
1405 MergerLayerVerifier(const std::string& layerName,
1406 const std::vector<armnn::TensorInfo>& inputInfos,
1407 const std::vector<armnn::TensorInfo>& outputInfos,
1408 const armnn::OriginsDescriptor& descriptor)
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01001409 : LayerVerifierBaseWithDescriptor<armnn::OriginsDescriptor>(layerName, inputInfos, outputInfos, descriptor) {}
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001410
Finn Williamsb454c5c2021-02-09 15:56:23 +00001411 void ExecuteStrategy(const armnn::IConnectableLayer* layer,
1412 const armnn::BaseDescriptor& descriptor,
1413 const std::vector<armnn::ConstTensor>& constants,
1414 const char* name,
1415 const armnn::LayerBindingId id = 0) override
Jim Flynn5fa83932019-05-09 15:35:43 +01001416 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001417 armnn::IgnoreUnused(descriptor, constants, id);
1418 switch (layer->GetType())
1419 {
1420 case armnn::LayerType::Input: break;
1421 case armnn::LayerType::Output: break;
1422 case armnn::LayerType::Merge:
1423 {
1424 throw armnn::Exception("MergerLayer should have translated to ConcatLayer");
1425 break;
1426 }
1427 case armnn::LayerType::Concat:
1428 {
1429 VerifyNameAndConnections(layer, name);
1430 const armnn::MergerDescriptor& layerDescriptor =
1431 static_cast<const armnn::MergerDescriptor&>(descriptor);
1432 VerifyDescriptor(layerDescriptor);
1433 break;
1434 }
1435 default:
1436 {
1437 throw armnn::Exception("Unexpected layer type in Merge test model");
1438 }
1439 }
Jim Flynn5fa83932019-05-09 15:35:43 +01001440 }
Jim Flynn5fa83932019-05-09 15:35:43 +01001441};
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001442
Sadik Armagan1625efc2021-06-10 18:24:34 +01001443TEST_CASE("EnsureMergerLayerBackwardCompatibility")
Jim Flynn5fa83932019-05-09 15:35:43 +01001444{
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001445 // The hex data below is a flat buffer containing a simple network with two inputs
Jim Flynne242f2d2019-05-22 14:24:13 +01001446 // a merger layer (now deprecated) and an output layer with dimensions as per the tensor infos below.
1447 //
1448 // This test verifies that we can still read back these old style
Jim Flynn5fa83932019-05-09 15:35:43 +01001449 // models replacing the MergerLayers with ConcatLayers with the same parameters.
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001450 const std::vector<uint8_t> mergerModel =
Jim Flynn5fa83932019-05-09 15:35:43 +01001451 {
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001452 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x0A, 0x00,
1453 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
1454 0x38, 0x02, 0x00, 0x00, 0x8C, 0x01, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x02, 0x00,
1455 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
1456 0xF4, 0xFD, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x0B, 0x04, 0x00, 0x00, 0x00, 0x92, 0xFE, 0xFF, 0xFF, 0x04, 0x00,
1457 0x00, 0x00, 0x9A, 0xFE, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x7E, 0xFE, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00,
1458 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00,
1459 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1460 0xF8, 0xFE, 0xFF, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0xFE, 0xFF, 0xFF, 0x00, 0x00,
1461 0x00, 0x1F, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00,
1462 0x68, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00,
1463 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
1464 0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x22, 0xFF, 0xFF, 0xFF, 0x04, 0x00,
1465 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1466 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
1467 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFF, 0xFF, 0xFF,
1468 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x1C, 0x00,
1469 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x6D, 0x65, 0x72, 0x67, 0x65, 0x72, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
1470 0x5C, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x34, 0xFF,
1471 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x92, 0xFE, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00,
1472 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00,
1473 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00,
1474 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00,
1475 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0E, 0x00,
1476 0x07, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00,
1477 0x06, 0x00, 0x08, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0E, 0x00,
1478 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
1479 0x0E, 0x00, 0x18, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x14, 0x00, 0x0E, 0x00, 0x00, 0x00,
1480 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00,
1481 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
1482 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00,
1483 0x00, 0x00, 0x66, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1484 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00,
1485 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x07, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09,
1486 0x04, 0x00, 0x00, 0x00, 0xF6, 0xFF, 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0A, 0x00,
1487 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x00, 0x00,
1488 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00,
1489 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1490 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0A, 0x00, 0x00, 0x00,
1491 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x08, 0x00,
1492 0x07, 0x00, 0x0C, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
1493 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
1494 0x02, 0x00, 0x00, 0x00
1495 };
1496
1497 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(std::string(mergerModel.begin(), mergerModel.end()));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001498 CHECK(deserializedNetwork);
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001499
1500 const armnn::TensorInfo inputInfo = armnn::TensorInfo({ 2, 3, 2, 2 }, armnn::DataType::Float32);
1501 const armnn::TensorInfo outputInfo = armnn::TensorInfo({ 4, 3, 2, 2 }, armnn::DataType::Float32);
Jim Flynn5fa83932019-05-09 15:35:43 +01001502
1503 const std::vector<armnn::TensorShape> shapes({inputInfo.GetShape(), inputInfo.GetShape()});
1504
1505 armnn::OriginsDescriptor descriptor =
Jim Flynn825af452019-05-20 12:49:28 +01001506 armnn::CreateDescriptorForConcatenation(shapes.begin(), shapes.end(), 0);
Jim Flynn5fa83932019-05-09 15:35:43 +01001507
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001508 MergerLayerVerifier verifier("merger", { inputInfo, inputInfo }, { outputInfo }, descriptor);
Finn Williamsb454c5c2021-02-09 15:56:23 +00001509 deserializedNetwork->ExecuteStrategy(verifier);
Jim Flynn5fa83932019-05-09 15:35:43 +01001510}
1511
Sadik Armagan1625efc2021-06-10 18:24:34 +01001512TEST_CASE("SerializeConcat")
Jim Flynne242f2d2019-05-22 14:24:13 +01001513{
1514 const std::string layerName("concat");
1515 const armnn::TensorInfo inputInfo = armnn::TensorInfo({2, 3, 2, 2}, armnn::DataType::Float32);
1516 const armnn::TensorInfo outputInfo = armnn::TensorInfo({4, 3, 2, 2}, armnn::DataType::Float32);
1517
1518 const std::vector<armnn::TensorShape> shapes({inputInfo.GetShape(), inputInfo.GetShape()});
1519
1520 armnn::OriginsDescriptor descriptor =
1521 armnn::CreateDescriptorForConcatenation(shapes.begin(), shapes.end(), 0);
1522
1523 armnn::INetworkPtr network = armnn::INetwork::Create();
1524 armnn::IConnectableLayer* const inputLayerOne = network->AddInputLayer(0);
1525 armnn::IConnectableLayer* const inputLayerTwo = network->AddInputLayer(1);
1526 armnn::IConnectableLayer* const concatLayer = network->AddConcatLayer(descriptor, layerName.c_str());
1527 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1528
1529 inputLayerOne->GetOutputSlot(0).Connect(concatLayer->GetInputSlot(0));
1530 inputLayerTwo->GetOutputSlot(0).Connect(concatLayer->GetInputSlot(1));
1531 concatLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1532
1533 inputLayerOne->GetOutputSlot(0).SetTensorInfo(inputInfo);
1534 inputLayerTwo->GetOutputSlot(0).SetTensorInfo(inputInfo);
1535 concatLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1536
1537 std::string concatLayerNetwork = SerializeNetwork(*network);
1538 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(concatLayerNetwork);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001539 CHECK(deserializedNetwork);
Jim Flynne242f2d2019-05-22 14:24:13 +01001540
1541 // NOTE: using the MergerLayerVerifier to ensure that it is a concat layer and not a
1542 // merger layer that gets placed into the graph.
1543 MergerLayerVerifier verifier(layerName, {inputInfo, inputInfo}, {outputInfo}, descriptor);
Finn Williamsb454c5c2021-02-09 15:56:23 +00001544 deserializedNetwork->ExecuteStrategy(verifier);
Jim Flynne242f2d2019-05-22 14:24:13 +01001545}
1546
Sadik Armagan1625efc2021-06-10 18:24:34 +01001547TEST_CASE("SerializeMinimum")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001548{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001549 const std::string layerName("minimum");
1550 const armnn::TensorInfo info({ 1, 2, 2, 3 }, armnn::DataType::Float32);
1551
1552 armnn::INetworkPtr network = armnn::INetwork::Create();
1553 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
1554 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
1555 armnn::IConnectableLayer* const minimumLayer = network->AddMinimumLayer(layerName.c_str());
1556 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1557
1558 inputLayer0->GetOutputSlot(0).Connect(minimumLayer->GetInputSlot(0));
1559 inputLayer1->GetOutputSlot(0).Connect(minimumLayer->GetInputSlot(1));
1560 minimumLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1561
1562 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
1563 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
1564 minimumLayer->GetOutputSlot(0).SetTensorInfo(info);
1565
1566 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001567 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001568
Finn Williamsb454c5c2021-02-09 15:56:23 +00001569 LayerVerifierBase verifier(layerName, {info, info}, {info});
1570 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001571}
1572
Sadik Armagan1625efc2021-06-10 18:24:34 +01001573TEST_CASE("SerializeMultiplication")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001574{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001575 const std::string layerName("multiplication");
1576 const armnn::TensorInfo info({ 1, 5, 2, 3 }, armnn::DataType::Float32);
1577
1578 armnn::INetworkPtr network = armnn::INetwork::Create();
1579 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
1580 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
1581 armnn::IConnectableLayer* const multiplicationLayer = network->AddMultiplicationLayer(layerName.c_str());
1582 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1583
1584 inputLayer0->GetOutputSlot(0).Connect(multiplicationLayer->GetInputSlot(0));
1585 inputLayer1->GetOutputSlot(0).Connect(multiplicationLayer->GetInputSlot(1));
1586 multiplicationLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1587
1588 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
1589 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
1590 multiplicationLayer->GetOutputSlot(0).SetTensorInfo(info);
1591
1592 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001593 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001594
Finn Williamsb454c5c2021-02-09 15:56:23 +00001595 LayerVerifierBase verifier(layerName, {info, info}, {info});
1596 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001597}
1598
Sadik Armagan1625efc2021-06-10 18:24:34 +01001599TEST_CASE("SerializePrelu")
Ellen Norris-Thompson51982472019-06-19 11:46:21 +01001600{
Ellen Norris-Thompson51982472019-06-19 11:46:21 +01001601 const std::string layerName("prelu");
1602
1603 armnn::TensorInfo inputTensorInfo ({ 4, 1, 2 }, armnn::DataType::Float32);
1604 armnn::TensorInfo alphaTensorInfo ({ 5, 4, 3, 1 }, armnn::DataType::Float32);
1605 armnn::TensorInfo outputTensorInfo({ 5, 4, 3, 2 }, armnn::DataType::Float32);
1606
1607 armnn::INetworkPtr network = armnn::INetwork::Create();
1608 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1609 armnn::IConnectableLayer* const alphaLayer = network->AddInputLayer(1);
1610 armnn::IConnectableLayer* const preluLayer = network->AddPreluLayer(layerName.c_str());
1611 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1612
1613 inputLayer->GetOutputSlot(0).Connect(preluLayer->GetInputSlot(0));
1614 alphaLayer->GetOutputSlot(0).Connect(preluLayer->GetInputSlot(1));
1615 preluLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1616
1617 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
1618 alphaLayer->GetOutputSlot(0).SetTensorInfo(alphaTensorInfo);
1619 preluLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
1620
1621 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001622 CHECK(deserializedNetwork);
Ellen Norris-Thompson51982472019-06-19 11:46:21 +01001623
Finn Williamsb454c5c2021-02-09 15:56:23 +00001624 LayerVerifierBase verifier(layerName, {inputTensorInfo, alphaTensorInfo}, {outputTensorInfo});
1625 deserializedNetwork->ExecuteStrategy(verifier);
Ellen Norris-Thompson51982472019-06-19 11:46:21 +01001626}
1627
Sadik Armagan1625efc2021-06-10 18:24:34 +01001628TEST_CASE("SerializeNormalization")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001629{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001630 const std::string layerName("normalization");
1631 const armnn::TensorInfo info({2, 1, 2, 2}, armnn::DataType::Float32);
1632
1633 armnn::NormalizationDescriptor desc;
1634 desc.m_DataLayout = armnn::DataLayout::NCHW;
1635 desc.m_NormSize = 3;
1636 desc.m_Alpha = 1;
1637 desc.m_Beta = 1;
1638 desc.m_K = 1;
1639
1640 armnn::INetworkPtr network = armnn::INetwork::Create();
1641 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1642 armnn::IConnectableLayer* const normalizationLayer = network->AddNormalizationLayer(desc, layerName.c_str());
1643 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1644
1645 inputLayer->GetOutputSlot(0).Connect(normalizationLayer->GetInputSlot(0));
1646 normalizationLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1647
1648 inputLayer->GetOutputSlot(0).SetTensorInfo(info);
1649 normalizationLayer->GetOutputSlot(0).SetTensorInfo(info);
1650
1651 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001652 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001653
Finn Williamsb454c5c2021-02-09 15:56:23 +00001654 LayerVerifierBaseWithDescriptor<armnn::NormalizationDescriptor> verifier(layerName, {info}, {info}, desc);
1655 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001656}
1657
Sadik Armagan1625efc2021-06-10 18:24:34 +01001658TEST_CASE("SerializePad")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001659{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001660 const std::string layerName("pad");
1661 const armnn::TensorInfo inputTensorInfo = armnn::TensorInfo({1, 2, 3, 4}, armnn::DataType::Float32);
1662 const armnn::TensorInfo outputTensorInfo = armnn::TensorInfo({1, 3, 5, 7}, armnn::DataType::Float32);
1663
1664 armnn::PadDescriptor desc({{0, 0}, {1, 0}, {1, 1}, {1, 2}});
1665
1666 armnn::INetworkPtr network = armnn::INetwork::Create();
1667 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1668 armnn::IConnectableLayer* const padLayer = network->AddPadLayer(desc, layerName.c_str());
1669 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1670
1671 inputLayer->GetOutputSlot(0).Connect(padLayer->GetInputSlot(0));
1672 padLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1673
1674 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
1675 padLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
1676
1677 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001678 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001679
Finn Williamsb454c5c2021-02-09 15:56:23 +00001680 LayerVerifierBaseWithDescriptor<armnn::PadDescriptor> verifier(layerName,
1681 {inputTensorInfo},
1682 {outputTensorInfo},
1683 desc);
1684 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001685}
1686
Sadik Armagan1625efc2021-06-10 18:24:34 +01001687TEST_CASE("EnsurePadBackwardCompatibility")
Jim Flynn965c7c62019-06-24 14:32:41 +01001688{
1689 // The PadDescriptor is being extended with a float PadValue (so a value other than 0
1690 // can be used to pad the tensor.
1691 //
1692 // This test contains a binary representation of a simple input->pad->output network
1693 // prior to this change to test that the descriptor has been updated in a backward
1694 // compatible way with respect to Deserialization of older binary dumps
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001695 const std::vector<uint8_t> padModel =
Jim Flynn965c7c62019-06-24 14:32:41 +01001696 {
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001697 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x0A, 0x00,
1698 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
1699 0x54, 0x01, 0x00, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
1700 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xD0, 0xFE, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x0B,
1701 0x04, 0x00, 0x00, 0x00, 0x96, 0xFF, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x9E, 0xFF, 0xFF, 0xFF, 0x04, 0x00,
1702 0x00, 0x00, 0x72, 0xFF, 0xFF, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
1703 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
1704 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00,
1705 0x00, 0x00, 0x00, 0x00, 0x24, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x16, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00,
1706 0x0E, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00,
1707 0x00, 0x00, 0x06, 0x00, 0x08, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00,
1708 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1709 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
1710 0x0E, 0x00, 0x18, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x14, 0x00, 0x0E, 0x00, 0x00, 0x00,
1711 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00,
1712 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x70, 0x61, 0x64, 0x00, 0x01, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00,
1713 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00,
1714 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x52, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00,
1715 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00,
1716 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00,
1717 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x07, 0x00, 0x08, 0x00, 0x08, 0x00,
1718 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xF6, 0xFF, 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x00,
1719 0x00, 0x00, 0x06, 0x00, 0x0A, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00,
1720 0x0E, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x0E, 0x00, 0x00, 0x00,
1721 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
1722 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00,
1723 0x08, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
1724 0x0A, 0x00, 0x10, 0x00, 0x08, 0x00, 0x07, 0x00, 0x0C, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
1725 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00,
1726 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00
1727 };
1728
1729 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(std::string(padModel.begin(), padModel.end()));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001730 CHECK(deserializedNetwork);
Jim Flynn965c7c62019-06-24 14:32:41 +01001731
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001732 const armnn::TensorInfo inputInfo = armnn::TensorInfo({ 1, 2, 3, 4 }, armnn::DataType::Float32);
1733 const armnn::TensorInfo outputInfo = armnn::TensorInfo({ 1, 3, 5, 7 }, armnn::DataType::Float32);
Jim Flynn965c7c62019-06-24 14:32:41 +01001734
Aron Virginas-Tar6e0d9622019-10-22 16:24:48 +01001735 armnn::PadDescriptor descriptor({{ 0, 0 }, { 1, 0 }, { 1, 1 }, { 1, 2 }});
Jim Flynn965c7c62019-06-24 14:32:41 +01001736
Finn Williamsb454c5c2021-02-09 15:56:23 +00001737 LayerVerifierBaseWithDescriptor<armnn::PadDescriptor> verifier("pad", { inputInfo }, { outputInfo }, descriptor);
1738 deserializedNetwork->ExecuteStrategy(verifier);
Jim Flynn965c7c62019-06-24 14:32:41 +01001739}
1740
Sadik Armagan1625efc2021-06-10 18:24:34 +01001741TEST_CASE("SerializePermute")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001742{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001743 const std::string layerName("permute");
1744 const armnn::TensorInfo inputTensorInfo({4, 3, 2, 1}, armnn::DataType::Float32);
1745 const armnn::TensorInfo outputTensorInfo({1, 2, 3, 4}, armnn::DataType::Float32);
1746
1747 armnn::PermuteDescriptor descriptor(armnn::PermutationVector({3, 2, 1, 0}));
1748
1749 armnn::INetworkPtr network = armnn::INetwork::Create();
1750 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1751 armnn::IConnectableLayer* const permuteLayer = network->AddPermuteLayer(descriptor, layerName.c_str());
1752 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1753
1754 inputLayer->GetOutputSlot(0).Connect(permuteLayer->GetInputSlot(0));
1755 permuteLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1756
1757 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
1758 permuteLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
1759
1760 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001761 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001762
Finn Williamsb454c5c2021-02-09 15:56:23 +00001763 LayerVerifierBaseWithDescriptor<armnn::PermuteDescriptor> verifier(
1764 layerName, {inputTensorInfo}, {outputTensorInfo}, descriptor);
1765 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001766}
1767
Sadik Armagan1625efc2021-06-10 18:24:34 +01001768TEST_CASE("SerializePooling2d")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001769{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001770 const std::string layerName("pooling2d");
1771 const armnn::TensorInfo inputInfo({1, 2, 2, 1}, armnn::DataType::Float32);
1772 const armnn::TensorInfo outputInfo({1, 1, 1, 1}, armnn::DataType::Float32);
1773
1774 armnn::Pooling2dDescriptor desc;
1775 desc.m_DataLayout = armnn::DataLayout::NHWC;
1776 desc.m_PadTop = 0;
1777 desc.m_PadBottom = 0;
1778 desc.m_PadLeft = 0;
1779 desc.m_PadRight = 0;
1780 desc.m_PoolType = armnn::PoolingAlgorithm::Average;
1781 desc.m_OutputShapeRounding = armnn::OutputShapeRounding::Floor;
1782 desc.m_PaddingMethod = armnn::PaddingMethod::Exclude;
1783 desc.m_PoolHeight = 2;
1784 desc.m_PoolWidth = 2;
1785 desc.m_StrideX = 2;
1786 desc.m_StrideY = 2;
1787
1788 armnn::INetworkPtr network = armnn::INetwork::Create();
1789 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1790 armnn::IConnectableLayer* const pooling2dLayer = network->AddPooling2dLayer(desc, layerName.c_str());
1791 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1792
1793 inputLayer->GetOutputSlot(0).Connect(pooling2dLayer->GetInputSlot(0));
1794 pooling2dLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1795
1796 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
1797 pooling2dLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1798
1799 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001800 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001801
Finn Williamsb454c5c2021-02-09 15:56:23 +00001802 LayerVerifierBaseWithDescriptor<armnn::Pooling2dDescriptor> verifier(
1803 layerName, {inputInfo}, {outputInfo}, desc);
1804 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001805}
1806
Sadik Armagan1625efc2021-06-10 18:24:34 +01001807TEST_CASE("SerializeQuantize")
Derek Lamberti87acb272019-03-27 16:51:31 +00001808{
Derek Lamberti87acb272019-03-27 16:51:31 +00001809 const std::string layerName("quantize");
1810 const armnn::TensorInfo info({ 1, 2, 2, 3 }, armnn::DataType::Float32);
1811
1812 armnn::INetworkPtr network = armnn::INetwork::Create();
1813 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1814 armnn::IConnectableLayer* const quantizeLayer = network->AddQuantizeLayer(layerName.c_str());
1815 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1816
1817 inputLayer->GetOutputSlot(0).Connect(quantizeLayer->GetInputSlot(0));
1818 quantizeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1819
1820 inputLayer->GetOutputSlot(0).SetTensorInfo(info);
1821 quantizeLayer->GetOutputSlot(0).SetTensorInfo(info);
1822
1823 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001824 CHECK(deserializedNetwork);
Derek Lamberti87acb272019-03-27 16:51:31 +00001825
Finn Williamsb454c5c2021-02-09 15:56:23 +00001826 LayerVerifierBase verifier(layerName, {info}, {info});
1827 deserializedNetwork->ExecuteStrategy(verifier);
Derek Lamberti87acb272019-03-27 16:51:31 +00001828}
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01001829
Sadik Armagan1625efc2021-06-10 18:24:34 +01001830TEST_CASE("SerializeRank")
Finn Williams2605b232020-06-10 15:53:46 +01001831{
Finn Williams2605b232020-06-10 15:53:46 +01001832 const std::string layerName("rank");
1833 const armnn::TensorInfo inputInfo({1, 9}, armnn::DataType::Float32);
1834 const armnn::TensorInfo outputInfo({1}, armnn::DataType::Signed32);
1835
1836 armnn::INetworkPtr network = armnn::INetwork::Create();
1837 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1838 armnn::IConnectableLayer* const rankLayer = network->AddRankLayer(layerName.c_str());
1839 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1840
1841 inputLayer->GetOutputSlot(0).Connect(rankLayer->GetInputSlot(0));
1842 rankLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1843
1844 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
1845 rankLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1846
1847 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001848 CHECK(deserializedNetwork);
Finn Williams2605b232020-06-10 15:53:46 +01001849
Finn Williamsb454c5c2021-02-09 15:56:23 +00001850 LayerVerifierBase verifier(layerName, {inputInfo}, {outputInfo});
1851 deserializedNetwork->ExecuteStrategy(verifier);
Finn Williams2605b232020-06-10 15:53:46 +01001852}
1853
Sadik Armagan1625efc2021-06-10 18:24:34 +01001854TEST_CASE("SerializeReduceSum")
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +00001855{
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +00001856 const std::string layerName("Reduce_Sum");
1857 const armnn::TensorInfo inputInfo({1, 1, 3, 2}, armnn::DataType::Float32);
1858 const armnn::TensorInfo outputInfo({1, 1, 1, 2}, armnn::DataType::Float32);
1859
1860 armnn::ReduceDescriptor descriptor;
1861 descriptor.m_vAxis = { 2 };
1862 descriptor.m_ReduceOperation = armnn::ReduceOperation::Sum;
1863
1864 armnn::INetworkPtr network = armnn::INetwork::Create();
1865 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1866 armnn::IConnectableLayer* const reduceSumLayer = network->AddReduceLayer(descriptor, layerName.c_str());
1867 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1868
1869 inputLayer->GetOutputSlot(0).Connect(reduceSumLayer->GetInputSlot(0));
1870 reduceSumLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1871
1872 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
1873 reduceSumLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1874
1875 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001876 CHECK(deserializedNetwork);
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +00001877
Finn Williamsb454c5c2021-02-09 15:56:23 +00001878 LayerVerifierBaseWithDescriptor<armnn::ReduceDescriptor> verifier(layerName, {inputInfo}, {outputInfo}, descriptor);
1879 deserializedNetwork->ExecuteStrategy(verifier);
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +00001880}
1881
Sadik Armagan1625efc2021-06-10 18:24:34 +01001882TEST_CASE("SerializeReshape")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001883{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001884 const std::string layerName("reshape");
1885 const armnn::TensorInfo inputInfo({1, 9}, armnn::DataType::Float32);
1886 const armnn::TensorInfo outputInfo({3, 3}, armnn::DataType::Float32);
1887
1888 armnn::ReshapeDescriptor descriptor({3, 3});
1889
1890 armnn::INetworkPtr network = armnn::INetwork::Create();
1891 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1892 armnn::IConnectableLayer* const reshapeLayer = network->AddReshapeLayer(descriptor, layerName.c_str());
1893 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1894
1895 inputLayer->GetOutputSlot(0).Connect(reshapeLayer->GetInputSlot(0));
1896 reshapeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1897
1898 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
1899 reshapeLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1900
1901 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001902 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001903
Finn Williamsb454c5c2021-02-09 15:56:23 +00001904 LayerVerifierBaseWithDescriptor<armnn::ReshapeDescriptor> verifier(
1905 layerName, {inputInfo}, {outputInfo}, descriptor);
1906 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00001907}
1908
Sadik Armagan1625efc2021-06-10 18:24:34 +01001909TEST_CASE("SerializeResize")
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01001910{
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01001911 const std::string layerName("resize");
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00001912 const armnn::TensorInfo inputInfo = armnn::TensorInfo({1, 3, 5, 5}, armnn::DataType::Float32);
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01001913 const armnn::TensorInfo outputInfo = armnn::TensorInfo({1, 3, 2, 4}, armnn::DataType::Float32);
1914
1915 armnn::ResizeDescriptor desc;
Aron Virginas-Tar169d2f12019-07-01 19:01:44 +01001916 desc.m_TargetWidth = 4;
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01001917 desc.m_TargetHeight = 2;
Aron Virginas-Tar169d2f12019-07-01 19:01:44 +01001918 desc.m_Method = armnn::ResizeMethod::NearestNeighbor;
David Monahan4a0c9b92020-05-30 09:48:39 +01001919 desc.m_AlignCorners = true;
1920 desc.m_HalfPixelCenters = true;
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01001921
1922 armnn::INetworkPtr network = armnn::INetwork::Create();
1923 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1924 armnn::IConnectableLayer* const resizeLayer = network->AddResizeLayer(desc, layerName.c_str());
1925 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
1926
1927 inputLayer->GetOutputSlot(0).Connect(resizeLayer->GetInputSlot(0));
1928 resizeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
1929
1930 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
1931 resizeLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
1932
1933 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001934 CHECK(deserializedNetwork);
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01001935
Finn Williamsb454c5c2021-02-09 15:56:23 +00001936 LayerVerifierBaseWithDescriptor<armnn::ResizeDescriptor> verifier(layerName, {inputInfo}, {outputInfo}, desc);
1937 deserializedNetwork->ExecuteStrategy(verifier);
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01001938}
1939
Jan Eilers1b2654f2021-09-24 15:45:46 +01001940class ResizeBilinearLayerVerifier : public LayerVerifierBaseWithDescriptor<armnn::ResizeDescriptor>
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00001941{
1942public:
1943 ResizeBilinearLayerVerifier(const std::string& layerName,
1944 const std::vector<armnn::TensorInfo>& inputInfos,
1945 const std::vector<armnn::TensorInfo>& outputInfos,
Jan Eilers1b2654f2021-09-24 15:45:46 +01001946 const armnn::ResizeDescriptor& descriptor)
1947 : LayerVerifierBaseWithDescriptor<armnn::ResizeDescriptor>(
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00001948 layerName, inputInfos, outputInfos, descriptor) {}
1949
Finn Williamsb454c5c2021-02-09 15:56:23 +00001950 void ExecuteStrategy(const armnn::IConnectableLayer* layer,
1951 const armnn::BaseDescriptor& descriptor,
1952 const std::vector<armnn::ConstTensor>& constants,
1953 const char* name,
1954 const armnn::LayerBindingId id = 0) override
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00001955 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001956 armnn::IgnoreUnused(descriptor, constants, id);
1957 switch (layer->GetType())
1958 {
1959 case armnn::LayerType::Input: break;
1960 case armnn::LayerType::Output: break;
1961 case armnn::LayerType::Resize:
1962 {
1963 VerifyNameAndConnections(layer, name);
1964 const armnn::ResizeDescriptor& layerDescriptor =
1965 static_cast<const armnn::ResizeDescriptor&>(descriptor);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001966 CHECK(layerDescriptor.m_Method == armnn::ResizeMethod::Bilinear);
1967 CHECK(layerDescriptor.m_TargetWidth == m_Descriptor.m_TargetWidth);
1968 CHECK(layerDescriptor.m_TargetHeight == m_Descriptor.m_TargetHeight);
1969 CHECK(layerDescriptor.m_DataLayout == m_Descriptor.m_DataLayout);
1970 CHECK(layerDescriptor.m_AlignCorners == m_Descriptor.m_AlignCorners);
1971 CHECK(layerDescriptor.m_HalfPixelCenters == m_Descriptor.m_HalfPixelCenters);
Finn Williamsb454c5c2021-02-09 15:56:23 +00001972 break;
1973 }
1974 default:
1975 {
1976 throw armnn::Exception("Unexpected layer type in test model. ResizeBiliniar "
1977 "should have translated to Resize");
1978 }
1979 }
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00001980 }
1981};
1982
Sadik Armagan1625efc2021-06-10 18:24:34 +01001983TEST_CASE("SerializeResizeBilinear")
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00001984{
1985 const std::string layerName("resizeBilinear");
1986 const armnn::TensorInfo inputInfo = armnn::TensorInfo({1, 3, 5, 5}, armnn::DataType::Float32);
1987 const armnn::TensorInfo outputInfo = armnn::TensorInfo({1, 3, 2, 4}, armnn::DataType::Float32);
1988
Jan Eilers1b2654f2021-09-24 15:45:46 +01001989 armnn::ResizeDescriptor desc;
1990 desc.m_Method = armnn::ResizeMethod::Bilinear;
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00001991 desc.m_TargetWidth = 4u;
1992 desc.m_TargetHeight = 2u;
David Monahan4a0c9b92020-05-30 09:48:39 +01001993 desc.m_AlignCorners = true;
1994 desc.m_HalfPixelCenters = true;
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00001995
1996 armnn::INetworkPtr network = armnn::INetwork::Create();
1997 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
Jan Eilers1b2654f2021-09-24 15:45:46 +01001998 armnn::IConnectableLayer* const resizeLayer = network->AddResizeLayer(desc, layerName.c_str());
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00001999 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2000
2001 inputLayer->GetOutputSlot(0).Connect(resizeLayer->GetInputSlot(0));
2002 resizeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2003
2004 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2005 resizeLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2006
2007 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002008 CHECK(deserializedNetwork);
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002009
2010 ResizeBilinearLayerVerifier verifier(layerName, {inputInfo}, {outputInfo}, desc);
Finn Williamsb454c5c2021-02-09 15:56:23 +00002011 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002012}
2013
Sadik Armagan1625efc2021-06-10 18:24:34 +01002014TEST_CASE("EnsureResizeBilinearBackwardCompatibility")
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002015{
2016 // The hex data below is a flat buffer containing a simple network with an input,
Jan Eilers1b2654f2021-09-24 15:45:46 +01002017 // a ResizeBilinearLayer (now deprecated and removed) and an output
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002018 //
2019 // This test verifies that we can still deserialize this old-style model by replacing
2020 // the ResizeBilinearLayer with an equivalent ResizeLayer
2021 const std::vector<uint8_t> resizeBilinearModel =
2022 {
2023 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x0A, 0x00,
2024 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
2025 0x50, 0x01, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
2026 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xD4, 0xFE, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x0B,
2027 0x04, 0x00, 0x00, 0x00, 0xC2, 0xFE, 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x08, 0x00,
2028 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x8A, 0xFF, 0xFF, 0xFF, 0x02, 0x00, 0x00, 0x00,
2029 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00,
2030 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2031 0x38, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
2032 0x00, 0x1A, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00,
2033 0x34, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x12, 0x00, 0x08, 0x00, 0x0C, 0x00,
2034 0x07, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
2035 0x00, 0x00, 0x0E, 0x00, 0x18, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x14, 0x00, 0x0E, 0x00,
2036 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00,
2037 0x20, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x72, 0x65, 0x73, 0x69, 0x7A, 0x65, 0x42, 0x69, 0x6C, 0x69,
2038 0x6E, 0x65, 0x61, 0x72, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
2039 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00,
2040 0x00, 0x00, 0x52, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2041 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00,
2042 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2043 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x07, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
2044 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xF6, 0xFF, 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00,
2045 0x0A, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x14, 0x00,
2046 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
2047 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2048 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0A, 0x00,
2049 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x10, 0x00,
2050 0x08, 0x00, 0x07, 0x00, 0x0C, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00,
2051 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00,
2052 0x00, 0x00, 0x05, 0x00, 0x00, 0x00
2053 };
2054
2055 armnn::INetworkPtr deserializedNetwork =
2056 DeserializeNetwork(std::string(resizeBilinearModel.begin(), resizeBilinearModel.end()));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002057 CHECK(deserializedNetwork);
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002058
2059 const armnn::TensorInfo inputInfo = armnn::TensorInfo({1, 3, 5, 5}, armnn::DataType::Float32);
2060 const armnn::TensorInfo outputInfo = armnn::TensorInfo({1, 3, 2, 4}, armnn::DataType::Float32);
2061
Jan Eilers1b2654f2021-09-24 15:45:46 +01002062 armnn::ResizeDescriptor descriptor;
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002063 descriptor.m_TargetWidth = 4u;
2064 descriptor.m_TargetHeight = 2u;
2065
2066 ResizeBilinearLayerVerifier verifier("resizeBilinear", { inputInfo }, { outputInfo }, descriptor);
Finn Williamsb454c5c2021-02-09 15:56:23 +00002067 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tarfe414cf2019-10-31 14:35:58 +00002068}
2069
Keith Davis3ae3f972021-05-21 16:33:48 +01002070TEST_CASE("SerializeShape")
2071{
2072 const std::string layerName("shape");
2073 const armnn::TensorInfo inputInfo({1, 3, 3, 1}, armnn::DataType::Signed32);
2074 const armnn::TensorInfo outputInfo({ 4 }, armnn::DataType::Signed32);
2075
2076 armnn::INetworkPtr network = armnn::INetwork::Create();
2077 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2078 armnn::IConnectableLayer* const shapeLayer = network->AddShapeLayer(layerName.c_str());
2079 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2080
2081 inputLayer->GetOutputSlot(0).Connect(shapeLayer->GetInputSlot(0));
2082 shapeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2083
2084 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2085 shapeLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2086
2087 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
2088 CHECK(deserializedNetwork);
2089
2090 LayerVerifierBase verifier(layerName, {inputInfo}, {outputInfo});
2091
2092 deserializedNetwork->ExecuteStrategy(verifier);
2093}
2094
Sadik Armagan1625efc2021-06-10 18:24:34 +01002095TEST_CASE("SerializeSlice")
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +01002096{
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +01002097 const std::string layerName{"slice"};
2098
2099 const armnn::TensorInfo inputInfo = armnn::TensorInfo({3, 2, 3, 1}, armnn::DataType::Float32);
2100 const armnn::TensorInfo outputInfo = armnn::TensorInfo({2, 2, 2, 1}, armnn::DataType::Float32);
2101
2102 armnn::SliceDescriptor descriptor({ 0, 0, 1, 0}, {2, 2, 2, 1});
2103
2104 armnn::INetworkPtr network = armnn::INetwork::Create();
2105
2106 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2107 armnn::IConnectableLayer* const sliceLayer = network->AddSliceLayer(descriptor, layerName.c_str());
2108 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2109
2110 inputLayer->GetOutputSlot(0).Connect(sliceLayer->GetInputSlot(0));
2111 sliceLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2112
2113 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2114 sliceLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2115
2116 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002117 CHECK(deserializedNetwork);
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +01002118
Finn Williamsb454c5c2021-02-09 15:56:23 +00002119 LayerVerifierBaseWithDescriptor<armnn::SliceDescriptor> verifier(layerName, {inputInfo}, {outputInfo}, descriptor);
2120 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +01002121}
2122
Sadik Armagan1625efc2021-06-10 18:24:34 +01002123TEST_CASE("SerializeSoftmax")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002124{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002125 const std::string layerName("softmax");
2126 const armnn::TensorInfo info({1, 10}, armnn::DataType::Float32);
2127
2128 armnn::SoftmaxDescriptor descriptor;
2129 descriptor.m_Beta = 1.0f;
2130
2131 armnn::INetworkPtr network = armnn::INetwork::Create();
2132 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2133 armnn::IConnectableLayer* const softmaxLayer = network->AddSoftmaxLayer(descriptor, layerName.c_str());
2134 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2135
2136 inputLayer->GetOutputSlot(0).Connect(softmaxLayer->GetInputSlot(0));
2137 softmaxLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2138
2139 inputLayer->GetOutputSlot(0).SetTensorInfo(info);
2140 softmaxLayer->GetOutputSlot(0).SetTensorInfo(info);
2141
2142 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002143 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002144
Finn Williamsb454c5c2021-02-09 15:56:23 +00002145 LayerVerifierBaseWithDescriptor<armnn::SoftmaxDescriptor> verifier(layerName, {info}, {info}, descriptor);
2146 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002147}
2148
Sadik Armagan1625efc2021-06-10 18:24:34 +01002149TEST_CASE("SerializeSpaceToBatchNd")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002150{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002151 const std::string layerName("spaceToBatchNd");
2152 const armnn::TensorInfo inputInfo({2, 1, 2, 4}, armnn::DataType::Float32);
2153 const armnn::TensorInfo outputInfo({8, 1, 1, 3}, armnn::DataType::Float32);
2154
2155 armnn::SpaceToBatchNdDescriptor desc;
2156 desc.m_DataLayout = armnn::DataLayout::NCHW;
2157 desc.m_BlockShape = {2, 2};
2158 desc.m_PadList = {{0, 0}, {2, 0}};
2159
2160 armnn::INetworkPtr network = armnn::INetwork::Create();
2161 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2162 armnn::IConnectableLayer* const spaceToBatchNdLayer = network->AddSpaceToBatchNdLayer(desc, layerName.c_str());
2163 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2164
2165 inputLayer->GetOutputSlot(0).Connect(spaceToBatchNdLayer->GetInputSlot(0));
2166 spaceToBatchNdLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2167
2168 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2169 spaceToBatchNdLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2170
2171 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002172 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002173
Finn Williamsb454c5c2021-02-09 15:56:23 +00002174 LayerVerifierBaseWithDescriptor<armnn::SpaceToBatchNdDescriptor> verifier(
2175 layerName, {inputInfo}, {outputInfo}, desc);
2176 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002177}
2178
Sadik Armagan1625efc2021-06-10 18:24:34 +01002179TEST_CASE("SerializeSpaceToDepth")
Aron Virginas-Taraa067142019-06-11 16:01:44 +01002180{
Aron Virginas-Taraa067142019-06-11 16:01:44 +01002181 const std::string layerName("spaceToDepth");
2182
2183 const armnn::TensorInfo inputInfo ({ 1, 16, 8, 3 }, armnn::DataType::Float32);
2184 const armnn::TensorInfo outputInfo({ 1, 8, 4, 12 }, armnn::DataType::Float32);
2185
2186 armnn::SpaceToDepthDescriptor desc;
2187 desc.m_BlockSize = 2;
2188 desc.m_DataLayout = armnn::DataLayout::NHWC;
2189
2190 armnn::INetworkPtr network = armnn::INetwork::Create();
2191 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2192 armnn::IConnectableLayer* const spaceToDepthLayer = network->AddSpaceToDepthLayer(desc, layerName.c_str());
2193 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2194
2195 inputLayer->GetOutputSlot(0).Connect(spaceToDepthLayer->GetInputSlot(0));
2196 spaceToDepthLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2197
2198 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2199 spaceToDepthLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2200
2201 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002202 CHECK(deserializedNetwork);
Aron Virginas-Taraa067142019-06-11 16:01:44 +01002203
Finn Williamsb454c5c2021-02-09 15:56:23 +00002204 LayerVerifierBaseWithDescriptor<armnn::SpaceToDepthDescriptor> verifier(
2205 layerName, {inputInfo}, {outputInfo}, desc);
2206 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Taraa067142019-06-11 16:01:44 +01002207}
2208
Sadik Armagan1625efc2021-06-10 18:24:34 +01002209TEST_CASE("SerializeSplitter")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002210{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002211 const unsigned int numViews = 3;
2212 const unsigned int numDimensions = 4;
2213 const unsigned int inputShape[] = {1, 18, 4, 4};
2214 const unsigned int outputShape[] = {1, 6, 4, 4};
2215
2216 // This is modelled on how the caffe parser sets up a splitter layer to partition an input along dimension one.
2217 unsigned int splitterDimSizes[4] = {static_cast<unsigned int>(inputShape[0]),
2218 static_cast<unsigned int>(inputShape[1]),
2219 static_cast<unsigned int>(inputShape[2]),
2220 static_cast<unsigned int>(inputShape[3])};
2221 splitterDimSizes[1] /= numViews;
2222 armnn::ViewsDescriptor desc(numViews, numDimensions);
2223
2224 for (unsigned int g = 0; g < numViews; ++g)
2225 {
2226 desc.SetViewOriginCoord(g, 1, splitterDimSizes[1] * g);
2227
2228 for (unsigned int dimIdx=0; dimIdx < 4; dimIdx++)
2229 {
2230 desc.SetViewSize(g, dimIdx, splitterDimSizes[dimIdx]);
2231 }
2232 }
2233
2234 const std::string layerName("splitter");
2235 const armnn::TensorInfo inputInfo(numDimensions, inputShape, armnn::DataType::Float32);
2236 const armnn::TensorInfo outputInfo(numDimensions, outputShape, armnn::DataType::Float32);
2237
2238 armnn::INetworkPtr network = armnn::INetwork::Create();
2239 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2240 armnn::IConnectableLayer* const splitterLayer = network->AddSplitterLayer(desc, layerName.c_str());
2241 armnn::IConnectableLayer* const outputLayer0 = network->AddOutputLayer(0);
2242 armnn::IConnectableLayer* const outputLayer1 = network->AddOutputLayer(1);
2243 armnn::IConnectableLayer* const outputLayer2 = network->AddOutputLayer(2);
2244
2245 inputLayer->GetOutputSlot(0).Connect(splitterLayer->GetInputSlot(0));
2246 splitterLayer->GetOutputSlot(0).Connect(outputLayer0->GetInputSlot(0));
2247 splitterLayer->GetOutputSlot(1).Connect(outputLayer1->GetInputSlot(0));
2248 splitterLayer->GetOutputSlot(2).Connect(outputLayer2->GetInputSlot(0));
2249
2250 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2251 splitterLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2252 splitterLayer->GetOutputSlot(1).SetTensorInfo(outputInfo);
2253 splitterLayer->GetOutputSlot(2).SetTensorInfo(outputInfo);
2254
2255 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002256 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002257
Finn Williamsb454c5c2021-02-09 15:56:23 +00002258 LayerVerifierBaseWithDescriptor<armnn::ViewsDescriptor> verifier(
2259 layerName, {inputInfo}, {outputInfo, outputInfo, outputInfo}, desc);
2260 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002261}
2262
Sadik Armagan1625efc2021-06-10 18:24:34 +01002263TEST_CASE("SerializeStack")
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01002264{
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01002265 const std::string layerName("stack");
2266
2267 armnn::TensorInfo inputTensorInfo ({4, 3, 5}, armnn::DataType::Float32);
2268 armnn::TensorInfo outputTensorInfo({4, 3, 2, 5}, armnn::DataType::Float32);
2269
2270 armnn::StackDescriptor descriptor(2, 2, {4, 3, 5});
2271
2272 armnn::INetworkPtr network = armnn::INetwork::Create();
2273 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(0);
2274 armnn::IConnectableLayer* const inputLayer2 = network->AddInputLayer(1);
2275 armnn::IConnectableLayer* const stackLayer = network->AddStackLayer(descriptor, layerName.c_str());
2276 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2277
2278 inputLayer1->GetOutputSlot(0).Connect(stackLayer->GetInputSlot(0));
2279 inputLayer2->GetOutputSlot(0).Connect(stackLayer->GetInputSlot(1));
2280 stackLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2281
2282 inputLayer1->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
2283 inputLayer2->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
2284 stackLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
2285
2286 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002287 CHECK(deserializedNetwork);
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01002288
Finn Williamsb454c5c2021-02-09 15:56:23 +00002289 LayerVerifierBaseWithDescriptor<armnn::StackDescriptor> verifier(
2290 layerName, {inputTensorInfo, inputTensorInfo}, {outputTensorInfo}, descriptor);
2291 deserializedNetwork->ExecuteStrategy(verifier);
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01002292}
2293
Sadik Armagan1625efc2021-06-10 18:24:34 +01002294TEST_CASE("SerializeStandIn")
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01002295{
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01002296 const std::string layerName("standIn");
2297
2298 armnn::TensorInfo tensorInfo({ 1u }, armnn::DataType::Float32);
2299 armnn::StandInDescriptor descriptor(2u, 2u);
2300
2301 armnn::INetworkPtr network = armnn::INetwork::Create();
2302 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
2303 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
2304 armnn::IConnectableLayer* const standInLayer = network->AddStandInLayer(descriptor, layerName.c_str());
2305 armnn::IConnectableLayer* const outputLayer0 = network->AddOutputLayer(0);
2306 armnn::IConnectableLayer* const outputLayer1 = network->AddOutputLayer(1);
2307
2308 inputLayer0->GetOutputSlot(0).Connect(standInLayer->GetInputSlot(0));
2309 inputLayer0->GetOutputSlot(0).SetTensorInfo(tensorInfo);
2310
2311 inputLayer1->GetOutputSlot(0).Connect(standInLayer->GetInputSlot(1));
2312 inputLayer1->GetOutputSlot(0).SetTensorInfo(tensorInfo);
2313
2314 standInLayer->GetOutputSlot(0).Connect(outputLayer0->GetInputSlot(0));
2315 standInLayer->GetOutputSlot(0).SetTensorInfo(tensorInfo);
2316
2317 standInLayer->GetOutputSlot(1).Connect(outputLayer1->GetInputSlot(0));
2318 standInLayer->GetOutputSlot(1).SetTensorInfo(tensorInfo);
2319
2320 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002321 CHECK(deserializedNetwork);
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01002322
Finn Williamsb454c5c2021-02-09 15:56:23 +00002323 LayerVerifierBaseWithDescriptor<armnn::StandInDescriptor> verifier(
2324 layerName, { tensorInfo, tensorInfo }, { tensorInfo, tensorInfo }, descriptor);
2325 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01002326}
2327
Sadik Armagan1625efc2021-06-10 18:24:34 +01002328TEST_CASE("SerializeStridedSlice")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002329{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002330 const std::string layerName("stridedSlice");
2331 const armnn::TensorInfo inputInfo = armnn::TensorInfo({3, 2, 3, 1}, armnn::DataType::Float32);
2332 const armnn::TensorInfo outputInfo = armnn::TensorInfo({3, 1}, armnn::DataType::Float32);
2333
2334 armnn::StridedSliceDescriptor desc({0, 0, 1, 0}, {1, 1, 1, 1}, {1, 1, 1, 1});
2335 desc.m_EndMask = (1 << 4) - 1;
2336 desc.m_ShrinkAxisMask = (1 << 1) | (1 << 2);
2337 desc.m_DataLayout = armnn::DataLayout::NCHW;
2338
2339 armnn::INetworkPtr network = armnn::INetwork::Create();
2340 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2341 armnn::IConnectableLayer* const stridedSliceLayer = network->AddStridedSliceLayer(desc, layerName.c_str());
2342 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2343
2344 inputLayer->GetOutputSlot(0).Connect(stridedSliceLayer->GetInputSlot(0));
2345 stridedSliceLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2346
2347 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2348 stridedSliceLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2349
2350 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002351 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002352
Finn Williamsb454c5c2021-02-09 15:56:23 +00002353 LayerVerifierBaseWithDescriptor<armnn::StridedSliceDescriptor> verifier(
2354 layerName, {inputInfo}, {outputInfo}, desc);
2355 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002356}
2357
Sadik Armagan1625efc2021-06-10 18:24:34 +01002358TEST_CASE("SerializeSubtraction")
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002359{
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002360 const std::string layerName("subtraction");
2361 const armnn::TensorInfo info({ 1, 4 }, armnn::DataType::Float32);
2362
2363 armnn::INetworkPtr network = armnn::INetwork::Create();
2364 armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
2365 armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
2366 armnn::IConnectableLayer* const subtractionLayer = network->AddSubtractionLayer(layerName.c_str());
2367 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2368
2369 inputLayer0->GetOutputSlot(0).Connect(subtractionLayer->GetInputSlot(0));
2370 inputLayer1->GetOutputSlot(0).Connect(subtractionLayer->GetInputSlot(1));
2371 subtractionLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2372
2373 inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
2374 inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
2375 subtractionLayer->GetOutputSlot(0).SetTensorInfo(info);
2376
2377 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002378 CHECK(deserializedNetwork);
Nattapat Chaimanowong03acd682019-03-20 11:19:52 +00002379
Finn Williamsb454c5c2021-02-09 15:56:23 +00002380 LayerVerifierBase verifier(layerName, {info, info}, {info});
2381 deserializedNetwork->ExecuteStrategy(verifier);
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +00002382}
2383
Sadik Armagan1625efc2021-06-10 18:24:34 +01002384TEST_CASE("SerializeSwitch")
Sadik Armaganeff363d2019-04-05 15:25:46 +01002385{
2386 class SwitchLayerVerifier : public LayerVerifierBase
2387 {
2388 public:
2389 SwitchLayerVerifier(const std::string& layerName,
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +01002390 const std::vector<armnn::TensorInfo>& inputInfos,
2391 const std::vector<armnn::TensorInfo>& outputInfos)
Finn Williamsb454c5c2021-02-09 15:56:23 +00002392 : LayerVerifierBase(layerName, inputInfos, outputInfos) {}
Sadik Armaganeff363d2019-04-05 15:25:46 +01002393
Finn Williamsb454c5c2021-02-09 15:56:23 +00002394 void ExecuteStrategy(const armnn::IConnectableLayer* layer,
2395 const armnn::BaseDescriptor& descriptor,
2396 const std::vector<armnn::ConstTensor>& constants,
2397 const char* name,
2398 const armnn::LayerBindingId id = 0) override
Sadik Armaganeff363d2019-04-05 15:25:46 +01002399 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00002400 armnn::IgnoreUnused(descriptor, constants, id);
2401 switch (layer->GetType())
2402 {
2403 case armnn::LayerType::Input: break;
2404 case armnn::LayerType::Output: break;
2405 case armnn::LayerType::Constant: break;
2406 case armnn::LayerType::Switch:
2407 {
2408 VerifyNameAndConnections(layer, name);
2409 break;
2410 }
2411 default:
2412 {
2413 throw armnn::Exception("Unexpected layer type in Switch test model");
2414 }
2415 }
Sadik Armaganeff363d2019-04-05 15:25:46 +01002416 }
Sadik Armaganeff363d2019-04-05 15:25:46 +01002417 };
2418
2419 const std::string layerName("switch");
2420 const armnn::TensorInfo info({ 1, 4 }, armnn::DataType::Float32);
2421
2422 std::vector<float> constantData = GenerateRandomData<float>(info.GetNumElements());
2423 armnn::ConstTensor constTensor(info, constantData);
2424
2425 armnn::INetworkPtr network = armnn::INetwork::Create();
2426 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2427 armnn::IConnectableLayer* const constantLayer = network->AddConstantLayer(constTensor, "constant");
2428 armnn::IConnectableLayer* const switchLayer = network->AddSwitchLayer(layerName.c_str());
2429 armnn::IConnectableLayer* const trueOutputLayer = network->AddOutputLayer(0);
2430 armnn::IConnectableLayer* const falseOutputLayer = network->AddOutputLayer(1);
2431
2432 inputLayer->GetOutputSlot(0).Connect(switchLayer->GetInputSlot(0));
2433 constantLayer->GetOutputSlot(0).Connect(switchLayer->GetInputSlot(1));
2434 switchLayer->GetOutputSlot(0).Connect(trueOutputLayer->GetInputSlot(0));
2435 switchLayer->GetOutputSlot(1).Connect(falseOutputLayer->GetInputSlot(0));
2436
2437 inputLayer->GetOutputSlot(0).SetTensorInfo(info);
2438 constantLayer->GetOutputSlot(0).SetTensorInfo(info);
2439 switchLayer->GetOutputSlot(0).SetTensorInfo(info);
2440 switchLayer->GetOutputSlot(1).SetTensorInfo(info);
2441
2442 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002443 CHECK(deserializedNetwork);
Sadik Armaganeff363d2019-04-05 15:25:46 +01002444
2445 SwitchLayerVerifier verifier(layerName, {info, info}, {info, info});
Finn Williamsb454c5c2021-02-09 15:56:23 +00002446 deserializedNetwork->ExecuteStrategy(verifier);
Sadik Armaganeff363d2019-04-05 15:25:46 +01002447}
2448
Sadik Armagan1625efc2021-06-10 18:24:34 +01002449TEST_CASE("SerializeTranspose")
Mike Kellyc9ea45a2020-02-28 18:11:58 +00002450{
Mike Kellyc9ea45a2020-02-28 18:11:58 +00002451 const std::string layerName("transpose");
2452 const armnn::TensorInfo inputTensorInfo({4, 3, 2, 1}, armnn::DataType::Float32);
2453 const armnn::TensorInfo outputTensorInfo({1, 2, 3, 4}, armnn::DataType::Float32);
2454
2455 armnn::TransposeDescriptor descriptor(armnn::PermutationVector({3, 2, 1, 0}));
2456
2457 armnn::INetworkPtr network = armnn::INetwork::Create();
2458 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2459 armnn::IConnectableLayer* const transposeLayer = network->AddTransposeLayer(descriptor, layerName.c_str());
2460 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2461
2462 inputLayer->GetOutputSlot(0).Connect(transposeLayer->GetInputSlot(0));
2463 transposeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2464
2465 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
2466 transposeLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
2467
2468 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002469 CHECK(deserializedNetwork);
Mike Kellyc9ea45a2020-02-28 18:11:58 +00002470
Finn Williamsb454c5c2021-02-09 15:56:23 +00002471 LayerVerifierBaseWithDescriptor<armnn::TransposeDescriptor> verifier(
2472 layerName, {inputTensorInfo}, {outputTensorInfo}, descriptor);
2473 deserializedNetwork->ExecuteStrategy(verifier);
Mike Kellyc9ea45a2020-02-28 18:11:58 +00002474}
2475
Sadik Armagan1625efc2021-06-10 18:24:34 +01002476TEST_CASE("SerializeTransposeConvolution2d")
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01002477{
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01002478 const std::string layerName("transposeConvolution2d");
2479 const armnn::TensorInfo inputInfo ({ 1, 7, 7, 1 }, armnn::DataType::Float32);
2480 const armnn::TensorInfo outputInfo({ 1, 9, 9, 1 }, armnn::DataType::Float32);
2481
2482 const armnn::TensorInfo weightsInfo({ 1, 3, 3, 1 }, armnn::DataType::Float32);
2483 const armnn::TensorInfo biasesInfo ({ 1 }, armnn::DataType::Float32);
2484
2485 std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements());
2486 armnn::ConstTensor weights(weightsInfo, weightsData);
2487
2488 std::vector<float> biasesData = GenerateRandomData<float>(biasesInfo.GetNumElements());
2489 armnn::ConstTensor biases(biasesInfo, biasesData);
2490
2491 armnn::TransposeConvolution2dDescriptor descriptor;
2492 descriptor.m_PadLeft = 1;
2493 descriptor.m_PadRight = 1;
2494 descriptor.m_PadTop = 1;
2495 descriptor.m_PadBottom = 1;
2496 descriptor.m_StrideX = 1;
2497 descriptor.m_StrideY = 1;
2498 descriptor.m_BiasEnabled = true;
2499 descriptor.m_DataLayout = armnn::DataLayout::NHWC;
2500
2501 armnn::INetworkPtr network = armnn::INetwork::Create();
2502 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
2503 armnn::IConnectableLayer* const convLayer =
2504 network->AddTransposeConvolution2dLayer(descriptor,
2505 weights,
2506 armnn::Optional<armnn::ConstTensor>(biases),
2507 layerName.c_str());
2508 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
2509
2510 inputLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(0));
2511 convLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
2512
2513 inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
2514 convLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
2515
2516 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002517 CHECK(deserializedNetwork);
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01002518
Finn Williamsb454c5c2021-02-09 15:56:23 +00002519 const std::vector<armnn::ConstTensor> constants {weights, biases};
2520 LayerVerifierBaseWithDescriptorAndConstants<armnn::TransposeConvolution2dDescriptor> verifier(
2521 layerName, {inputInfo}, {outputInfo}, descriptor, constants);
2522 deserializedNetwork->ExecuteStrategy(verifier);
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01002523}
2524
Sadik Armagan1625efc2021-06-10 18:24:34 +01002525TEST_CASE("SerializeDeserializeNonLinearNetwork")
Sadik Armagandb059fd2019-03-20 12:28:32 +00002526{
2527 class ConstantLayerVerifier : public LayerVerifierBase
2528 {
2529 public:
2530 ConstantLayerVerifier(const std::string& layerName,
2531 const std::vector<armnn::TensorInfo>& inputInfos,
2532 const std::vector<armnn::TensorInfo>& outputInfos,
2533 const armnn::ConstTensor& layerInput)
2534 : LayerVerifierBase(layerName, inputInfos, outputInfos)
2535 , m_LayerInput(layerInput) {}
2536
Finn Williamsb454c5c2021-02-09 15:56:23 +00002537 void ExecuteStrategy(const armnn::IConnectableLayer* layer,
2538 const armnn::BaseDescriptor& descriptor,
2539 const std::vector<armnn::ConstTensor>& constants,
2540 const char* name,
2541 const armnn::LayerBindingId id = 0) override
Sadik Armagandb059fd2019-03-20 12:28:32 +00002542 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00002543 armnn::IgnoreUnused(descriptor, constants, id);
2544 switch (layer->GetType())
2545 {
2546 case armnn::LayerType::Input: break;
2547 case armnn::LayerType::Output: break;
2548 case armnn::LayerType::Addition: break;
2549 case armnn::LayerType::Constant:
2550 {
2551 VerifyNameAndConnections(layer, name);
2552 CompareConstTensor(constants.at(0), m_LayerInput);
2553 break;
2554 }
2555 default:
2556 {
2557 throw armnn::Exception("Unexpected layer type in test model");
2558 }
2559 }
Sadik Armagandb059fd2019-03-20 12:28:32 +00002560 }
2561
Sadik Armagandb059fd2019-03-20 12:28:32 +00002562 private:
2563 armnn::ConstTensor m_LayerInput;
2564 };
2565
2566 const std::string layerName("constant");
2567 const armnn::TensorInfo info({ 2, 3 }, armnn::DataType::Float32);
2568
2569 std::vector<float> constantData = GenerateRandomData<float>(info.GetNumElements());
2570 armnn::ConstTensor constTensor(info, constantData);
2571
2572 armnn::INetworkPtr network(armnn::INetwork::Create());
2573 armnn::IConnectableLayer* input = network->AddInputLayer(0);
2574 armnn::IConnectableLayer* add = network->AddAdditionLayer();
2575 armnn::IConnectableLayer* constant = network->AddConstantLayer(constTensor, layerName.c_str());
2576 armnn::IConnectableLayer* output = network->AddOutputLayer(0);
2577
2578 input->GetOutputSlot(0).Connect(add->GetInputSlot(0));
2579 constant->GetOutputSlot(0).Connect(add->GetInputSlot(1));
2580 add->GetOutputSlot(0).Connect(output->GetInputSlot(0));
2581
2582 input->GetOutputSlot(0).SetTensorInfo(info);
2583 constant->GetOutputSlot(0).SetTensorInfo(info);
2584 add->GetOutputSlot(0).SetTensorInfo(info);
2585
2586 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002587 CHECK(deserializedNetwork);
Sadik Armagandb059fd2019-03-20 12:28:32 +00002588
2589 ConstantLayerVerifier verifier(layerName, {}, {info}, constTensor);
Finn Williamsb454c5c2021-02-09 15:56:23 +00002590 deserializedNetwork->ExecuteStrategy(verifier);
James Conroy8d333182020-05-13 10:27:58 +01002591}
2592
Teresa Charlin50de4fa2021-05-31 18:47:33 +01002593}