blob: ad6676edc7185dcea815d5f9d0c5040212b83bb3 [file] [log] [blame]
//
// Copyright © 2017 Arm Ltd. All rights reserved.
// SPDX-License-Identifier: MIT
//
#include <armnn/ArmNN.hpp>
#include <armnn/INetwork.hpp>
#include "../Serializer.hpp"
#include <armnnDeserializer/IDeserializer.hpp>
#include <random>
#include <sstream>
#include <vector>
#include <boost/test/unit_test.hpp>
#include <flatbuffers/idl.h>
using armnnDeserializer::IDeserializer;
namespace
{
armnn::INetworkPtr DeserializeNetwork(const std::string& serializerString)
{
std::vector<std::uint8_t> const serializerVector{serializerString.begin(), serializerString.end()};
return IDeserializer::Create()->CreateNetworkFromBinary(serializerVector);
}
std::string SerializeNetwork(const armnn::INetwork& network)
{
armnnSerializer::Serializer serializer;
serializer.Serialize(network);
std::stringstream stream;
serializer.SaveSerializedToStream(stream);
std::string serializerString{stream.str()};
return serializerString;
}
template<typename DataType>
static std::vector<DataType> GenerateRandomData(size_t size)
{
constexpr bool isIntegerType = std::is_integral<DataType>::value;
using Distribution =
typename std::conditional<isIntegerType,
std::uniform_int_distribution<DataType>,
std::uniform_real_distribution<DataType>>::type;
static constexpr DataType lowerLimit = std::numeric_limits<DataType>::min();
static constexpr DataType upperLimit = std::numeric_limits<DataType>::max();
static Distribution distribution(lowerLimit, upperLimit);
static std::default_random_engine generator;
std::vector<DataType> randomData(size);
std::generate(randomData.begin(), randomData.end(), []() { return distribution(generator); });
return randomData;
}
void CheckDeserializedNetworkAgainstOriginal(const armnn::INetwork& deserializedNetwork,
const armnn::INetwork& originalNetwork,
const std::vector<armnn::TensorShape>& inputShapes,
const std::vector<armnn::TensorShape>& outputShapes,
const std::vector<armnn::LayerBindingId>& inputBindingIds = {0},
const std::vector<armnn::LayerBindingId>& outputBindingIds = {0})
{
BOOST_CHECK(inputShapes.size() == inputBindingIds.size());
BOOST_CHECK(outputShapes.size() == outputBindingIds.size());
armnn::IRuntime::CreationOptions options;
armnn::IRuntimePtr runtime = armnn::IRuntime::Create(options);
std::vector<armnn::BackendId> preferredBackends = { armnn::BackendId("CpuRef") };
// Optimize original network
armnn::IOptimizedNetworkPtr optimizedOriginalNetwork =
armnn::Optimize(originalNetwork, preferredBackends, runtime->GetDeviceSpec());
BOOST_CHECK(optimizedOriginalNetwork);
// Optimize deserialized network
armnn::IOptimizedNetworkPtr optimizedDeserializedNetwork =
armnn::Optimize(deserializedNetwork, preferredBackends, runtime->GetDeviceSpec());
BOOST_CHECK(optimizedDeserializedNetwork);
armnn::NetworkId networkId1;
armnn::NetworkId networkId2;
// Load original and deserialized network
armnn::Status status1 = runtime->LoadNetwork(networkId1, std::move(optimizedOriginalNetwork));
BOOST_CHECK(status1 == armnn::Status::Success);
armnn::Status status2 = runtime->LoadNetwork(networkId2, std::move(optimizedDeserializedNetwork));
BOOST_CHECK(status2 == armnn::Status::Success);
// Generate some input data
armnn::InputTensors inputTensors1;
armnn::InputTensors inputTensors2;
std::vector<std::vector<float>> inputData;
inputData.reserve(inputShapes.size());
for (unsigned int i = 0; i < inputShapes.size(); i++)
{
inputData.push_back(GenerateRandomData<float>(inputShapes[i].GetNumElements()));
inputTensors1.emplace_back(
i, armnn::ConstTensor(runtime->GetInputTensorInfo(networkId1, inputBindingIds[i]), inputData[i].data()));
inputTensors2.emplace_back(
i, armnn::ConstTensor(runtime->GetInputTensorInfo(networkId2, inputBindingIds[i]), inputData[i].data()));
}
armnn::OutputTensors outputTensors1;
armnn::OutputTensors outputTensors2;
std::vector<std::vector<float>> outputData1;
std::vector<std::vector<float>> outputData2;
outputData1.reserve(outputShapes.size());
outputData2.reserve(outputShapes.size());
for (unsigned int i = 0; i < outputShapes.size(); i++)
{
outputData1.emplace_back(outputShapes[i].GetNumElements());
outputData2.emplace_back(outputShapes[i].GetNumElements());
outputTensors1.emplace_back(
i, armnn::Tensor(runtime->GetOutputTensorInfo(networkId1, outputBindingIds[i]), outputData1[i].data()));
outputTensors2.emplace_back(
i, armnn::Tensor(runtime->GetOutputTensorInfo(networkId2, outputBindingIds[i]), outputData2[i].data()));
}
// Run original and deserialized network
runtime->EnqueueWorkload(networkId1, inputTensors1, outputTensors1);
runtime->EnqueueWorkload(networkId2, inputTensors2, outputTensors2);
// Compare output data
for (unsigned int i = 0; i < outputShapes.size(); i++)
{
BOOST_CHECK_EQUAL_COLLECTIONS(
outputData1[i].begin(), outputData1[i].end(), outputData2[i].begin(), outputData2[i].end());
}
}
} // anonymous namespace
BOOST_AUTO_TEST_SUITE(SerializerTests)
BOOST_AUTO_TEST_CASE(SerializeAddition)
{
class VerifyAdditionName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
{
public:
void VisitAdditionLayer(const armnn::IConnectableLayer*, const char* name) override
{
BOOST_TEST(name == "addition");
}
};
armnn::INetworkPtr network = armnn::INetwork::Create();
armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
armnn::IConnectableLayer* const additionLayer = network->AddAdditionLayer("addition");
inputLayer0->GetOutputSlot(0).Connect(additionLayer->GetInputSlot(0));
inputLayer1->GetOutputSlot(0).Connect(additionLayer->GetInputSlot(1));
armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
additionLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
armnn::TensorShape shape{1U};
armnn::TensorInfo info(shape, armnn::DataType::Float32);
inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
additionLayer->GetOutputSlot(0).SetTensorInfo(info);
armnnSerializer::Serializer serializer;
serializer.Serialize(*network);
std::stringstream stream;
serializer.SaveSerializedToStream(stream);
BOOST_TEST(stream.str().length() > 0);
armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(stream.str());
BOOST_CHECK(deserializedNetwork);
VerifyAdditionName nameChecker;
deserializedNetwork->Accept(nameChecker);
}
BOOST_AUTO_TEST_CASE(SerializeConstant)
{
armnn::INetworkPtr network = armnn::INetwork::Create();
armnn::ConstTensor inputTensor;
armnn::IConnectableLayer* const inputLayer0 = network->AddConstantLayer(inputTensor, "constant");
armnn::IConnectableLayer* const outputLayer0 = network->AddOutputLayer(0);
inputLayer0->GetOutputSlot(0).Connect(outputLayer0->GetInputSlot(0));
armnnSerializer::Serializer serializer;
serializer.Serialize(*network);
std::stringstream stream;
serializer.SaveSerializedToStream(stream);
BOOST_TEST(stream.str().length() > 0);
BOOST_TEST(stream.str().find("constant") != stream.str().npos);
}
BOOST_AUTO_TEST_CASE(SerializeDeserializeConstant)
{
class VerifyConstantName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
{
public:
void VisitConstantLayer(const armnn::IConnectableLayer*, const armnn::ConstTensor&, const char* name) override
{
BOOST_TEST(name == "constant");
}
};
armnn::TensorInfo commonTensorInfo({ 2, 3 }, armnn::DataType::Float32);
std::vector<float> constantData = GenerateRandomData<float>(commonTensorInfo.GetNumElements());
armnn::ConstTensor constTensor(commonTensorInfo, constantData);
// Builds up the structure of the network.
armnn::INetworkPtr net(armnn::INetwork::Create());
armnn::IConnectableLayer* input = net->AddInputLayer(0);
armnn::IConnectableLayer* constant = net->AddConstantLayer(constTensor, "constant");
armnn::IConnectableLayer* add = net->AddAdditionLayer();
armnn::IConnectableLayer* output = net->AddOutputLayer(0);
input->GetOutputSlot(0).Connect(add->GetInputSlot(0));
constant->GetOutputSlot(0).Connect(add->GetInputSlot(1));
add->GetOutputSlot(0).Connect(output->GetInputSlot(0));
// Sets the tensors in the network.
input->GetOutputSlot(0).SetTensorInfo(commonTensorInfo);
constant->GetOutputSlot(0).SetTensorInfo(commonTensorInfo);
add->GetOutputSlot(0).SetTensorInfo(commonTensorInfo);
armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*net));
BOOST_CHECK(deserializedNetwork);
VerifyConstantName nameChecker;
deserializedNetwork->Accept(nameChecker);
CheckDeserializedNetworkAgainstOriginal(*net,
*deserializedNetwork,
{commonTensorInfo.GetShape()},
{commonTensorInfo.GetShape()});
}
BOOST_AUTO_TEST_CASE(SerializeFloor)
{
class VerifyFloorName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
{
public:
void VisitMultiplicationLayer(const armnn::IConnectableLayer*, const char* name) override
{
BOOST_TEST(name == "floor");
}
};
const armnn::TensorInfo info({4,4}, armnn::DataType::Float32);
armnn::INetworkPtr network = armnn::INetwork::Create();
armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(1);
const char* floorLayerName = "floor";
armnn::IConnectableLayer* const floorLayer = network->AddFloorLayer(floorLayerName);
inputLayer->GetOutputSlot(0).Connect(floorLayer->GetInputSlot(0));
armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
floorLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
inputLayer->GetOutputSlot(0).SetTensorInfo(info);
floorLayer->GetOutputSlot(0).SetTensorInfo(info);
armnnSerializer::Serializer serializer;
serializer.Serialize(*network);
std::stringstream stream;
serializer.SaveSerializedToStream(stream);
BOOST_TEST(stream.str().length() > 0);
BOOST_TEST(stream.str().find(floorLayerName) != stream.str().npos);
armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(stream.str());
BOOST_CHECK(deserializedNetwork);
VerifyFloorName nameChecker;
deserializedNetwork->Accept(nameChecker);
}
BOOST_AUTO_TEST_CASE(SerializeMinimum)
{
class VerifyMinimumName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
{
public:
explicit VerifyMinimumName(const std::string& expectedMinimumLayerName)
: m_ExpectedMinimumLayerName(expectedMinimumLayerName) {}
void VisitMinimumLayer(const armnn::IConnectableLayer*, const char* name) override
{
BOOST_TEST(name == m_ExpectedMinimumLayerName.c_str());
}
private:
std::string m_ExpectedMinimumLayerName;
};
const armnn::TensorInfo info({ 1, 2, 2, 3 }, armnn::DataType::Float32);
armnn::INetworkPtr network = armnn::INetwork::Create();
armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
const std::string minimumLayerName("minimum");
armnn::IConnectableLayer* const minimumLayer = network->AddMinimumLayer(minimumLayerName.c_str());
inputLayer0->GetOutputSlot(0).Connect(minimumLayer->GetInputSlot(0));
inputLayer1->GetOutputSlot(0).Connect(minimumLayer->GetInputSlot(1));
armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
minimumLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
minimumLayer->GetOutputSlot(0).SetTensorInfo(info);
armnnSerializer::Serializer serializer;
serializer.Serialize(*network);
std::stringstream stream;
serializer.SaveSerializedToStream(stream);
BOOST_TEST(stream.str().length() > 0);
BOOST_TEST(stream.str().find(minimumLayerName) != stream.str().npos);
armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(stream.str());
BOOST_CHECK(deserializedNetwork);
VerifyMinimumName nameChecker(minimumLayerName);
deserializedNetwork->Accept(nameChecker);
}
BOOST_AUTO_TEST_CASE(SerializeMaximum)
{
class VerifyMaximumName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
{
public:
explicit VerifyMaximumName(const std::string& expectedMaximumLayerName)
: m_ExpectedMaximumLayerName(expectedMaximumLayerName) {}
void VisitMaximumLayer(const armnn::IConnectableLayer*, const char* name) override
{
BOOST_TEST(name == m_ExpectedMaximumLayerName.c_str());
}
private:
std::string m_ExpectedMaximumLayerName;
};
const armnn::TensorInfo info({ 1, 2, 2, 3 }, armnn::DataType::Float32);
armnn::INetworkPtr network = armnn::INetwork::Create();
armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
const std::string maximumLayerName("maximum");
armnn::IConnectableLayer* const maximumLayer = network->AddMaximumLayer(maximumLayerName.c_str());
inputLayer0->GetOutputSlot(0).Connect(maximumLayer->GetInputSlot(0));
inputLayer1->GetOutputSlot(0).Connect(maximumLayer->GetInputSlot(1));
armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
maximumLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
maximumLayer->GetOutputSlot(0).SetTensorInfo(info);
armnnSerializer::Serializer serializer;
serializer.Serialize(*network);
std::stringstream stream;
serializer.SaveSerializedToStream(stream);
BOOST_TEST(stream.str().length() > 0);
BOOST_TEST(stream.str().find(maximumLayerName) != stream.str().npos);
armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(stream.str());
BOOST_CHECK(deserializedNetwork);
VerifyMaximumName nameChecker(maximumLayerName);
deserializedNetwork->Accept(nameChecker);
}
BOOST_AUTO_TEST_CASE(SerializeMultiplication)
{
class VerifyMultiplicationName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
{
public:
void VisitMultiplicationLayer(const armnn::IConnectableLayer*, const char* name) override
{
BOOST_TEST(name == "multiplication");
}
};
const armnn::TensorInfo info({ 1, 5, 2, 3 }, armnn::DataType::Float32);
armnn::INetworkPtr network = armnn::INetwork::Create();
armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
const char* multLayerName = "multiplication";
armnn::IConnectableLayer* const multiplicationLayer = network->AddMultiplicationLayer(multLayerName);
inputLayer0->GetOutputSlot(0).Connect(multiplicationLayer->GetInputSlot(0));
inputLayer1->GetOutputSlot(0).Connect(multiplicationLayer->GetInputSlot(1));
armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
multiplicationLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
multiplicationLayer->GetOutputSlot(0).SetTensorInfo(info);
armnnSerializer::Serializer serializer;
serializer.Serialize(*network);
std::stringstream stream;
serializer.SaveSerializedToStream(stream);
BOOST_TEST(stream.str().length() > 0);
BOOST_TEST(stream.str().find(multLayerName) != stream.str().npos);
armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(stream.str());
BOOST_CHECK(deserializedNetwork);
VerifyMultiplicationName nameChecker;
deserializedNetwork->Accept(nameChecker);
}
BOOST_AUTO_TEST_CASE(SerializeDeserializeConvolution2d)
{
class VerifyConvolution2dName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
{
public:
void VisitConvolution2dLayer(const armnn::IConnectableLayer*,
const armnn::Convolution2dDescriptor&,
const armnn::ConstTensor&,
const armnn::Optional<armnn::ConstTensor>&,
const char* name) override
{
BOOST_TEST(name == "convolution");
}
};
armnn::TensorInfo inputInfo ({ 1, 5, 5, 1 }, armnn::DataType::Float32);
armnn::TensorInfo outputInfo({ 1, 3, 3, 1 }, armnn::DataType::Float32);
armnn::TensorInfo weightsInfo({ 1, 3, 3, 1 }, armnn::DataType::Float32);
armnn::TensorInfo biasesInfo ({ 1 }, armnn::DataType::Float32);
// Construct network
armnn::INetworkPtr network = armnn::INetwork::Create();
armnn::Convolution2dDescriptor descriptor;
descriptor.m_PadLeft = 1;
descriptor.m_PadRight = 1;
descriptor.m_PadTop = 1;
descriptor.m_PadBottom = 1;
descriptor.m_StrideX = 2;
descriptor.m_StrideY = 2;
descriptor.m_BiasEnabled = true;
descriptor.m_DataLayout = armnn::DataLayout::NHWC;
std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements());
armnn::ConstTensor weights(weightsInfo, weightsData);
std::vector<float> biasesData = GenerateRandomData<float>(biasesInfo.GetNumElements());
armnn::ConstTensor biases(biasesInfo, biasesData);
armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0, "input");
armnn::IConnectableLayer* const convLayer =
network->AddConvolution2dLayer(descriptor, weights, biases, "convolution");
armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0, "output");
inputLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(0));
inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
convLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
convLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
BOOST_CHECK(deserializedNetwork);
VerifyConvolution2dName nameChecker;
deserializedNetwork->Accept(nameChecker);
CheckDeserializedNetworkAgainstOriginal(*network,
*deserializedNetwork,
{inputInfo.GetShape()},
{outputInfo.GetShape()});
}
BOOST_AUTO_TEST_CASE(SerializeDeserializeGreater)
{
class VerifyGreaterName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
{
public:
void VisitGreaterLayer(const armnn::IConnectableLayer*, const char* name) override
{
BOOST_TEST(name == "greater");
}
};
const armnn::TensorInfo inputTensorInfo1({ 1, 2, 2, 2 }, armnn::DataType::Float32);
const armnn::TensorInfo inputTensorInfo2({ 1, 2, 2, 2 }, armnn::DataType::Float32);
const armnn::TensorInfo outputTensorInfo({ 1, 2, 2, 2 }, armnn::DataType::Boolean);
armnn::INetworkPtr network = armnn::INetwork::Create();
armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(0);
armnn::IConnectableLayer* const inputLayer2 = network->AddInputLayer(1);
armnn::IConnectableLayer* const greaterLayer = network->AddGreaterLayer("greater");
armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
inputLayer1->GetOutputSlot(0).Connect(greaterLayer->GetInputSlot(0));
inputLayer1->GetOutputSlot(0).SetTensorInfo(inputTensorInfo1);
inputLayer2->GetOutputSlot(0).Connect(greaterLayer->GetInputSlot(1));
inputLayer2->GetOutputSlot(0).SetTensorInfo(inputTensorInfo2);
greaterLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
greaterLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
BOOST_CHECK(deserializedNetwork);
VerifyGreaterName nameChecker;
deserializedNetwork->Accept(nameChecker);
CheckDeserializedNetworkAgainstOriginal(*network,
*deserializedNetwork,
{inputTensorInfo1.GetShape(), inputTensorInfo2.GetShape()},
{outputTensorInfo.GetShape()},
{0, 1});
}
BOOST_AUTO_TEST_CASE(SerializeDeserializeReshape)
{
class VerifyReshapeName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
{
public:
void VisitReshapeLayer(const armnn::IConnectableLayer*, const armnn::ReshapeDescriptor&, const char* name)
{
BOOST_TEST(name == "reshape");
}
};
unsigned int inputShape[] = { 1, 9 };
unsigned int outputShape[] = { 3, 3 };
auto inputTensorInfo = armnn::TensorInfo(2, inputShape, armnn::DataType::Float32);
auto outputTensorInfo = armnn::TensorInfo(2, outputShape, armnn::DataType::Float32);
auto reshapeOutputTensorInfo = armnn::TensorInfo(2, outputShape, armnn::DataType::Float32);
armnn::ReshapeDescriptor reshapeDescriptor;
reshapeDescriptor.m_TargetShape = reshapeOutputTensorInfo.GetShape();
armnn::INetworkPtr network = armnn::INetwork::Create();
armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
armnn::IConnectableLayer* const reshapeLayer = network->AddReshapeLayer(reshapeDescriptor, "reshape");
armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
inputLayer->GetOutputSlot(0).Connect(reshapeLayer->GetInputSlot(0));
inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
reshapeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
reshapeLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
BOOST_CHECK(deserializedNetwork);
VerifyReshapeName nameChecker;
deserializedNetwork->Accept(nameChecker);
CheckDeserializedNetworkAgainstOriginal(*network,
*deserializedNetwork,
{inputTensorInfo.GetShape()},
{outputTensorInfo.GetShape()});
}
BOOST_AUTO_TEST_CASE(SerializeDeserializeDepthwiseConvolution2d)
{
class VerifyDepthwiseConvolution2dName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
{
public:
void VisitDepthwiseConvolution2dLayer(const armnn::IConnectableLayer*,
const armnn::DepthwiseConvolution2dDescriptor&,
const armnn::ConstTensor&,
const armnn::Optional<armnn::ConstTensor>&,
const char* name) override
{
BOOST_TEST(name == "depthwise_convolution");
}
};
armnn::TensorInfo inputInfo ({ 1, 5, 5, 3 }, armnn::DataType::Float32);
armnn::TensorInfo outputInfo({ 1, 3, 3, 3 }, armnn::DataType::Float32);
armnn::TensorInfo weightsInfo({ 1, 3, 3, 3 }, armnn::DataType::Float32);
armnn::TensorInfo biasesInfo ({ 3 }, armnn::DataType::Float32);
armnn::DepthwiseConvolution2dDescriptor descriptor;
descriptor.m_StrideX = 1;
descriptor.m_StrideY = 1;
descriptor.m_BiasEnabled = true;
descriptor.m_DataLayout = armnn::DataLayout::NHWC;
std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements());
armnn::ConstTensor weights(weightsInfo, weightsData);
std::vector<int32_t> biasesData = GenerateRandomData<int32_t>(biasesInfo.GetNumElements());
armnn::ConstTensor biases(biasesInfo, biasesData);
armnn::INetworkPtr network = armnn::INetwork::Create();
armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
armnn::IConnectableLayer* const depthwiseConvLayer =
network->AddDepthwiseConvolution2dLayer(descriptor, weights, biases, "depthwise_convolution");
armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
inputLayer->GetOutputSlot(0).Connect(depthwiseConvLayer->GetInputSlot(0));
inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
depthwiseConvLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
depthwiseConvLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
BOOST_CHECK(deserializedNetwork);
VerifyDepthwiseConvolution2dName nameChecker;
deserializedNetwork->Accept(nameChecker);
CheckDeserializedNetworkAgainstOriginal(*network,
*deserializedNetwork,
{inputInfo.GetShape()},
{outputInfo.GetShape()});
}
BOOST_AUTO_TEST_CASE(SerializeDeserializeSoftmax)
{
class VerifySoftmaxName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
{
public:
void VisitSoftmaxLayer(const armnn::IConnectableLayer*, const armnn::SoftmaxDescriptor&, const char* name)
{
BOOST_TEST(name == "softmax");
}
};
armnn::TensorInfo tensorInfo({1, 10}, armnn::DataType::Float32);
armnn::SoftmaxDescriptor descriptor;
descriptor.m_Beta = 1.0f;
armnn::INetworkPtr network = armnn::INetwork::Create();
armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
armnn::IConnectableLayer* const softmaxLayer = network->AddSoftmaxLayer(descriptor, "softmax");
armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
inputLayer->GetOutputSlot(0).Connect(softmaxLayer->GetInputSlot(0));
inputLayer->GetOutputSlot(0).SetTensorInfo(tensorInfo);
softmaxLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
softmaxLayer->GetOutputSlot(0).SetTensorInfo(tensorInfo);
armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
BOOST_CHECK(deserializedNetwork);
VerifySoftmaxName nameChecker;
deserializedNetwork->Accept(nameChecker);
CheckDeserializedNetworkAgainstOriginal(*network,
*deserializedNetwork,
{tensorInfo.GetShape()},
{tensorInfo.GetShape()});
}
BOOST_AUTO_TEST_CASE(SerializeDeserializePooling2d)
{
class VerifyPooling2dName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
{
void VisitPooling2dLayer(const armnn::IConnectableLayer*, const armnn::Pooling2dDescriptor&, const char* name)
{
BOOST_TEST(name == "pooling2d");
}
};
unsigned int inputShape[] = {1, 2, 2, 1};
unsigned int outputShape[] = {1, 1, 1, 1};
auto inputInfo = armnn::TensorInfo(4, inputShape, armnn::DataType::Float32);
auto outputInfo = armnn::TensorInfo(4, outputShape, armnn::DataType::Float32);
armnn::Pooling2dDescriptor desc;
desc.m_DataLayout = armnn::DataLayout::NHWC;
desc.m_PadTop = 0;
desc.m_PadBottom = 0;
desc.m_PadLeft = 0;
desc.m_PadRight = 0;
desc.m_PoolType = armnn::PoolingAlgorithm::Average;
desc.m_OutputShapeRounding = armnn::OutputShapeRounding::Floor;
desc.m_PaddingMethod = armnn::PaddingMethod::Exclude;
desc.m_PoolHeight = 2;
desc.m_PoolWidth = 2;
desc.m_StrideX = 2;
desc.m_StrideY = 2;
armnn::INetworkPtr network = armnn::INetwork::Create();
armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
armnn::IConnectableLayer* const pooling2dLayer = network->AddPooling2dLayer(desc, "pooling2d");
armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
inputLayer->GetOutputSlot(0).Connect(pooling2dLayer->GetInputSlot(0));
inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
pooling2dLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
pooling2dLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
BOOST_CHECK(deserializedNetwork);
VerifyPooling2dName nameChecker;
deserializedNetwork->Accept(nameChecker);
CheckDeserializedNetworkAgainstOriginal(*network,
*deserializedNetwork,
{inputInfo.GetShape()},
{outputInfo.GetShape()});
}
BOOST_AUTO_TEST_CASE(SerializeDeserializePermute)
{
class VerifyPermuteName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
{
public:
void VisitPermuteLayer(const armnn::IConnectableLayer*, const armnn::PermuteDescriptor&, const char* name)
{
BOOST_TEST(name == "permute");
}
};
unsigned int inputShape[] = { 4, 3, 2, 1 };
unsigned int outputShape[] = { 1, 2, 3, 4 };
unsigned int dimsMapping[] = { 3, 2, 1, 0 };
auto inputTensorInfo = armnn::TensorInfo(4, inputShape, armnn::DataType::Float32);
auto outputTensorInfo = armnn::TensorInfo(4, outputShape, armnn::DataType::Float32);
armnn::PermuteDescriptor permuteDescriptor(armnn::PermutationVector(dimsMapping, 4));
armnn::INetworkPtr network = armnn::INetwork::Create();
armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
armnn::IConnectableLayer* const permuteLayer = network->AddPermuteLayer(permuteDescriptor, "permute");
armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
inputLayer->GetOutputSlot(0).Connect(permuteLayer->GetInputSlot(0));
inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
permuteLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
permuteLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
BOOST_CHECK(deserializedNetwork);
VerifyPermuteName nameChecker;
deserializedNetwork->Accept(nameChecker);
CheckDeserializedNetworkAgainstOriginal(*network,
*deserializedNetwork,
{inputTensorInfo.GetShape()},
{outputTensorInfo.GetShape()});
}
BOOST_AUTO_TEST_CASE(SerializeDeserializeFullyConnected)
{
class VerifyFullyConnectedName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
{
public:
void VisitFullyConnectedLayer(const armnn::IConnectableLayer*,
const armnn::FullyConnectedDescriptor&,
const armnn::ConstTensor&,
const armnn::Optional<armnn::ConstTensor>&,
const char* name) override
{
BOOST_TEST(name == "fully_connected");
}
};
armnn::TensorInfo inputInfo ({ 2, 5, 1, 1 }, armnn::DataType::Float32);
armnn::TensorInfo outputInfo({ 2, 3 }, armnn::DataType::Float32);
armnn::TensorInfo weightsInfo({ 5, 3 }, armnn::DataType::Float32);
armnn::TensorInfo biasesInfo ({ 3 }, armnn::DataType::Float32);
armnn::FullyConnectedDescriptor descriptor;
descriptor.m_BiasEnabled = true;
descriptor.m_TransposeWeightMatrix = false;
std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements());
std::vector<float> biasesData = GenerateRandomData<float>(biasesInfo.GetNumElements());
armnn::ConstTensor weights(weightsInfo, weightsData);
armnn::ConstTensor biases(biasesInfo, biasesData);
armnn::INetworkPtr network = armnn::INetwork::Create();
armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0, "input");
armnn::IConnectableLayer* const fullyConnectedLayer = network->AddFullyConnectedLayer(descriptor,
weights,
biases,
"fully_connected");
armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0, "output");
inputLayer->GetOutputSlot(0).Connect(fullyConnectedLayer->GetInputSlot(0));
inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
fullyConnectedLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
fullyConnectedLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
BOOST_CHECK(deserializedNetwork);
VerifyFullyConnectedName nameChecker;
deserializedNetwork->Accept(nameChecker);
CheckDeserializedNetworkAgainstOriginal(*network,
*deserializedNetwork,
{inputInfo.GetShape()},
{outputInfo.GetShape()});
}
BOOST_AUTO_TEST_CASE(SerializeDeserializeSpaceToBatchNd)
{
class VerifySpaceToBatchNdName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
{
public:
void VisitSpaceToBatchNdLayer(const armnn::IConnectableLayer*,
const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
const char* name) override
{
BOOST_TEST(name == "SpaceToBatchNdLayer");
}
};
unsigned int inputShape[] = {2, 1, 2, 4};
unsigned int outputShape[] = {8, 1, 1, 3};
armnn::SpaceToBatchNdDescriptor desc;
desc.m_DataLayout = armnn::DataLayout::NCHW;
desc.m_BlockShape = {2, 2};
desc.m_PadList = {{0, 0}, {2, 0}};
auto inputTensorInfo = armnn::TensorInfo(4, inputShape, armnn::DataType::Float32);
auto outputTensorInfo = armnn::TensorInfo(4, outputShape, armnn::DataType::Float32);
armnn::INetworkPtr network = armnn::INetwork::Create();
armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
armnn::IConnectableLayer* const spaceToBatchNdLayer = network->AddSpaceToBatchNdLayer(desc, "SpaceToBatchNdLayer");
armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
inputLayer->GetOutputSlot(0).Connect(spaceToBatchNdLayer->GetInputSlot(0));
inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
spaceToBatchNdLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
spaceToBatchNdLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
BOOST_CHECK(deserializedNetwork);
VerifySpaceToBatchNdName nameChecker;
deserializedNetwork->Accept(nameChecker);
CheckDeserializedNetworkAgainstOriginal(*network,
*deserializedNetwork,
{inputTensorInfo.GetShape()},
{outputTensorInfo.GetShape()});
}
BOOST_AUTO_TEST_CASE(SerializeDeserializeBatchToSpaceNd)
{
class VerifyBatchToSpaceNdName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
{
public:
void VisitBatchToSpaceNdLayer(const armnn::IConnectableLayer*,
const armnn::BatchToSpaceNdDescriptor& descriptor,
const char* name) override
{
BOOST_TEST(name == "BatchToSpaceNdLayer");
}
};
unsigned int inputShape[] = {4, 1, 2, 2};
unsigned int outputShape[] = {1, 1, 4, 4};
armnn::BatchToSpaceNdDescriptor desc;
desc.m_DataLayout = armnn::DataLayout::NCHW;
desc.m_BlockShape = {2, 2};
desc.m_Crops = {{0, 0}, {0, 0}};
auto inputTensorInfo = armnn::TensorInfo(4, inputShape, armnn::DataType::Float32);
auto outputTensorInfo = armnn::TensorInfo(4, outputShape, armnn::DataType::Float32);
armnn::INetworkPtr network = armnn::INetwork::Create();
armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
armnn::IConnectableLayer* const batchToSpaceNdLayer = network->AddBatchToSpaceNdLayer(desc, "BatchToSpaceNdLayer");
armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
inputLayer->GetOutputSlot(0).Connect(batchToSpaceNdLayer->GetInputSlot(0));
inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
batchToSpaceNdLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
batchToSpaceNdLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
BOOST_CHECK(deserializedNetwork);
VerifyBatchToSpaceNdName nameChecker;
deserializedNetwork->Accept(nameChecker);
CheckDeserializedNetworkAgainstOriginal(*network,
*deserializedNetwork,
{inputTensorInfo.GetShape()},
{outputTensorInfo.GetShape()});
}
BOOST_AUTO_TEST_CASE(SerializeDeserializeBatchNormalization)
{
class VerifyBatchNormalizationName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
{
public:
void VisitBatchNormalizationLayer(const armnn::IConnectableLayer*,
const armnn::BatchNormalizationDescriptor&,
const armnn::ConstTensor&,
const armnn::ConstTensor&,
const armnn::ConstTensor&,
const armnn::ConstTensor&,
const char* name) override
{
BOOST_TEST(name == "BatchNormalization:1");
}
};
armnn::TensorInfo inputInfo ({ 1, 3, 3, 1 }, armnn::DataType::Float32);
armnn::TensorInfo outputInfo({ 1, 3, 3, 1 }, armnn::DataType::Float32);
armnn::TensorInfo meanInfo({1}, armnn::DataType::Float32);
armnn::TensorInfo varianceInfo({1}, armnn::DataType::Float32);
armnn::TensorInfo scaleInfo({1}, armnn::DataType::Float32);
armnn::TensorInfo offsetInfo({1}, armnn::DataType::Float32);
armnn::BatchNormalizationDescriptor descriptor;
descriptor.m_Eps = 0.0010000000475f;
descriptor.m_DataLayout = armnn::DataLayout::NHWC;
std::vector<float> meanData({5.0});
std::vector<float> varianceData({2.0});
std::vector<float> scaleData({1.0});
std::vector<float> offsetData({0.0});
armnn::ConstTensor mean(meanInfo, meanData);
armnn::ConstTensor variance(varianceInfo, varianceData);
armnn::ConstTensor scale(scaleInfo, scaleData);
armnn::ConstTensor offset(offsetInfo, offsetData);
armnn::INetworkPtr network = armnn::INetwork::Create();
armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
armnn::IConnectableLayer* const batchNormalizationLayer = network->AddBatchNormalizationLayer(
descriptor,
mean,
variance,
scale,
offset,
"BatchNormalizationLayer");
armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
inputLayer->GetOutputSlot(0).Connect(batchNormalizationLayer->GetInputSlot(0));
inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
batchNormalizationLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
batchNormalizationLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
BOOST_CHECK(deserializedNetwork);
VerifyBatchNormalizationName nameChecker;
deserializedNetwork->Accept(nameChecker);
CheckDeserializedNetworkAgainstOriginal(*network,
*deserializedNetwork,
{inputInfo.GetShape()},
{outputInfo.GetShape()});
}
BOOST_AUTO_TEST_CASE(SerializeDivision)
{
class VerifyDivisionName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
{
public:
void VisitDivisionLayer(const armnn::IConnectableLayer*, const char* name) override
{
BOOST_TEST(name == "division");
}
};
const armnn::TensorInfo info({ 1, 5, 2, 3 }, armnn::DataType::Float32);
armnn::INetworkPtr network = armnn::INetwork::Create();
armnn::IConnectableLayer* const inputLayer0 = network->AddInputLayer(0);
armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(1);
const char* divLayerName = "division";
armnn::IConnectableLayer* const divisionLayer = network->AddDivisionLayer(divLayerName);
inputLayer0->GetOutputSlot(0).Connect(divisionLayer->GetInputSlot(0));
inputLayer1->GetOutputSlot(0).Connect(divisionLayer->GetInputSlot(1));
armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
divisionLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
inputLayer0->GetOutputSlot(0).SetTensorInfo(info);
inputLayer1->GetOutputSlot(0).SetTensorInfo(info);
divisionLayer->GetOutputSlot(0).SetTensorInfo(info);
armnnSerializer::Serializer serializer;
serializer.Serialize(*network);
std::stringstream stream;
serializer.SaveSerializedToStream(stream);
BOOST_TEST(stream.str().length() > 0);
BOOST_TEST(stream.str().find(divLayerName) != stream.str().npos);
armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(stream.str());
BOOST_CHECK(deserializedNetwork);
VerifyDivisionName nameChecker;
deserializedNetwork->Accept(nameChecker);
}
BOOST_AUTO_TEST_CASE(SerializeDeserializeNormalization)
{
class VerifyNormalizationName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
{
public:
void VisitNormalizationLayer(const armnn::IConnectableLayer*,
const armnn::NormalizationDescriptor& normalizationDescriptor,
const char* name) override
{
BOOST_TEST(name == "NormalizationLayer");
}
};
unsigned int inputShape[] = {2, 1, 2, 2};
unsigned int outputShape[] = {2, 1, 2, 2};
armnn::NormalizationDescriptor desc;
desc.m_DataLayout = armnn::DataLayout::NCHW;
desc.m_NormSize = 3;
desc.m_Alpha = 1;
desc.m_Beta = 1;
desc.m_K = 1;
auto inputTensorInfo = armnn::TensorInfo(4, inputShape, armnn::DataType::Float32);
auto outputTensorInfo = armnn::TensorInfo(4, outputShape, armnn::DataType::Float32);
armnn::INetworkPtr network = armnn::INetwork::Create();
armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
armnn::IConnectableLayer* const normalizationLayer = network->AddNormalizationLayer(desc, "NormalizationLayer");
armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
inputLayer->GetOutputSlot(0).Connect(normalizationLayer->GetInputSlot(0));
inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
normalizationLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
normalizationLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
BOOST_CHECK(deserializedNetwork);
VerifyNormalizationName nameChecker;
deserializedNetwork->Accept(nameChecker);
CheckDeserializedNetworkAgainstOriginal(*network,
*deserializedNetwork,
{inputTensorInfo.GetShape()},
{outputTensorInfo.GetShape()});
}
BOOST_AUTO_TEST_CASE(SerializeDeserializeEqual)
{
class VerifyEqualName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
{
public:
void VisitEqualLayer(const armnn::IConnectableLayer*,
const char* name) override
{
BOOST_TEST(name == "EqualLayer");
}
};
const armnn::TensorInfo inputTensorInfo1 = armnn::TensorInfo({2, 1, 2, 4}, armnn::DataType::Float32);
const armnn::TensorInfo inputTensorInfo2 = armnn::TensorInfo({2, 1, 2, 4}, armnn::DataType::Float32);
const armnn::TensorInfo outputTensorInfo = armnn::TensorInfo({2, 1, 2, 4}, armnn::DataType::Boolean);
armnn::INetworkPtr network = armnn::INetwork::Create();
armnn::IConnectableLayer* const inputLayer1 = network->AddInputLayer(0);
armnn::IConnectableLayer* const inputLayer2 = network->AddInputLayer(1);
armnn::IConnectableLayer* const equalLayer = network->AddEqualLayer("EqualLayer");
armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
inputLayer1->GetOutputSlot(0).Connect(equalLayer->GetInputSlot(0));
inputLayer1->GetOutputSlot(0).SetTensorInfo(inputTensorInfo1);
inputLayer2->GetOutputSlot(0).Connect(equalLayer->GetInputSlot(1));
inputLayer2->GetOutputSlot(0).SetTensorInfo(inputTensorInfo2);
equalLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
equalLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
BOOST_CHECK(deserializedNetwork);
VerifyEqualName nameChecker;
deserializedNetwork->Accept(nameChecker);
CheckDeserializedNetworkAgainstOriginal(*network,
*deserializedNetwork,
{inputTensorInfo1.GetShape(), inputTensorInfo2.GetShape()},
{outputTensorInfo.GetShape()},
{0, 1});
}
BOOST_AUTO_TEST_CASE(SerializeDeserializePad)
{
class VerifyPadName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
{
public:
void VisitPadLayer(const armnn::IConnectableLayer*,
const armnn::PadDescriptor& descriptor,
const char* name) override
{
BOOST_TEST(name == "PadLayer");
}
};
armnn::PadDescriptor desc({{0, 0}, {1, 0}, {1, 1}, {1, 2}});
const armnn::TensorInfo inputTensorInfo = armnn::TensorInfo({1, 2, 3, 4}, armnn::DataType::Float32);
const armnn::TensorInfo outputTensorInfo = armnn::TensorInfo({1, 3, 5, 7}, armnn::DataType::Float32);
armnn::INetworkPtr network = armnn::INetwork::Create();
armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
armnn::IConnectableLayer* const padLayer = network->AddPadLayer(desc, "PadLayer");
armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
inputLayer->GetOutputSlot(0).Connect(padLayer->GetInputSlot(0));
inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
padLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
padLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
BOOST_CHECK(deserializedNetwork);
VerifyPadName nameChecker;
deserializedNetwork->Accept(nameChecker);
CheckDeserializedNetworkAgainstOriginal(*network,
*deserializedNetwork,
{inputTensorInfo.GetShape()},
{outputTensorInfo.GetShape()});
}
BOOST_AUTO_TEST_CASE(SerializeRsqrt)
{
class VerifyRsqrtName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
{
public:
void VisitRsqrtLayer(const armnn::IConnectableLayer*, const char* name) override
{
BOOST_TEST(name == "rsqrt");
}
};
const armnn::TensorInfo tensorInfo({ 3, 1, 2 }, armnn::DataType::Float32);
armnn::INetworkPtr network = armnn::INetwork::Create();
armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
armnn::IConnectableLayer* const rsqrtLayer = network->AddRsqrtLayer("rsqrt");
armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
inputLayer->GetOutputSlot(0).Connect(rsqrtLayer->GetInputSlot(0));
rsqrtLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
inputLayer->GetOutputSlot(0).SetTensorInfo(tensorInfo);
rsqrtLayer->GetOutputSlot(0).SetTensorInfo(tensorInfo);
armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
BOOST_CHECK(deserializedNetwork);
VerifyRsqrtName nameChecker;
deserializedNetwork->Accept(nameChecker);
CheckDeserializedNetworkAgainstOriginal(*network,
*deserializedNetwork,
{tensorInfo.GetShape()},
{tensorInfo.GetShape()});
}
BOOST_AUTO_TEST_CASE(SerializeDeserializeResizeBilinear)
{
class VerifyResizeBilinearName : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
{
public:
void VisitResizeBilinearLayer(const armnn::IConnectableLayer*,
const armnn::ResizeBilinearDescriptor& descriptor,
const char* name) override
{
BOOST_TEST(name == "ResizeBilinearLayer");
}
};
armnn::ResizeBilinearDescriptor desc;
desc.m_TargetWidth = 4;
desc.m_TargetHeight = 2;
const armnn::TensorInfo inputTensorInfo = armnn::TensorInfo({1, 3, 5, 5}, armnn::DataType::Float32);
const armnn::TensorInfo outputTensorInfo = armnn::TensorInfo({1, 3, 2, 4}, armnn::DataType::Float32);
armnn::INetworkPtr network = armnn::INetwork::Create();
armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
armnn::IConnectableLayer* const resizeLayer = network->AddResizeBilinearLayer(desc, "ResizeBilinearLayer");
armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
inputLayer->GetOutputSlot(0).Connect(resizeLayer->GetInputSlot(0));
inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
resizeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
resizeLayer->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
BOOST_CHECK(deserializedNetwork);
VerifyResizeBilinearName nameChecker;
deserializedNetwork->Accept(nameChecker);
CheckDeserializedNetworkAgainstOriginal(*network,
*deserializedNetwork,
{inputTensorInfo.GetShape()},
{outputTensorInfo.GetShape()});
}
BOOST_AUTO_TEST_SUITE_END()