ArmNN
 22.05.01
ActivationSerializationTests.cpp File Reference
#include "../Serializer.hpp"
#include <armnn/Descriptors.hpp>
#include <armnn/INetwork.hpp>
#include <armnn/IRuntime.hpp>
#include <armnnDeserializer/IDeserializer.hpp>
#include <armnn/utility/IgnoreUnused.hpp>
#include <doctest/doctest.h>
#include <sstream>

Go to the source code of this file.

Functions

 TEST_SUITE ("SerializerTests")
 

Function Documentation

◆ TEST_SUITE()

TEST_SUITE ( "SerializerTests"  )

Definition at line 18 of file ActivationSerializationTests.cpp.

References armnn::Activation, IOutputSlot::Connect(), ISerializer::Create(), IDeserializer::Create(), INetwork::Create(), IStrategy::ExecuteStrategy(), armnn::Float32, IConnectableLayer::GetInputSlot(), IConnectableLayer::GetOutputSlot(), IConnectableLayer::GetType(), armnn::IgnoreUnused(), ActivationDescriptor::m_A, ActivationDescriptor::m_B, ActivationDescriptor::m_Function, armnn::ReLu, and IOutputSlot::SetTensorInfo().

19 {
20 class VerifyActivationName : public armnn::IStrategy
21 {
22 public:
23  void ExecuteStrategy(const armnn::IConnectableLayer* layer,
24  const armnn::BaseDescriptor& descriptor,
25  const std::vector<armnn::ConstTensor>& constants,
26  const char* name,
27  const armnn::LayerBindingId id = 0) override
28  {
29  IgnoreUnused(layer, descriptor, constants, id);
30  if (layer->GetType() == armnn::LayerType::Activation)
31  {
32  CHECK(std::string(name) == "activation");
33  }
34  }
35 };
36 
37 TEST_CASE("ActivationSerialization")
38 {
40 
41  armnn::TensorInfo inputInfo(armnn::TensorShape({1, 2, 2, 1}), armnn::DataType::Float32, 1.0f, 0);
42  armnn::TensorInfo outputInfo(armnn::TensorShape({1, 2, 2, 1}), armnn::DataType::Float32, 4.0f, 0);
43 
44  // Construct network
46 
47  armnn::ActivationDescriptor descriptor;
49  descriptor.m_A = 0;
50  descriptor.m_B = 0;
51 
52  armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0, "input");
53  armnn::IConnectableLayer* const activationLayer = network->AddActivationLayer(descriptor, "activation");
54  armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0, "output");
55 
56  inputLayer->GetOutputSlot(0).Connect(activationLayer->GetInputSlot(0));
57  inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
58 
59  activationLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
60  activationLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
61 
63 
64  serializer->Serialize(*network);
65 
66  std::stringstream stream;
67  serializer->SaveSerializedToStream(stream);
68 
69  std::string const serializerString{stream.str()};
70  std::vector<std::uint8_t> const serializerVector{serializerString.begin(), serializerString.end()};
71 
72  armnn::INetworkPtr deserializedNetwork = parser->CreateNetworkFromBinary(serializerVector);
73 
74  VerifyActivationName visitor;
75  deserializedNetwork->ExecuteStrategy(visitor);
76 
77  armnn::IRuntime::CreationOptions options; // default options
79  auto deserializedOptimized = Optimize(*deserializedNetwork, { armnn::Compute::CpuRef }, run->GetDeviceSpec());
80 
81  armnn::NetworkId networkIdentifier;
82 
83  // Load graph into runtime
84  run->LoadNetwork(networkIdentifier, std::move(deserializedOptimized));
85 
86  std::vector<float> inputData {0.0f, -5.3f, 42.0f, -42.0f};
87  armnn::TensorInfo inputTensorInfo = run->GetInputTensorInfo(networkIdentifier, 0);
88  inputTensorInfo.SetConstant(true);
89  armnn::InputTensors inputTensors
90  {
91  {0, armnn::ConstTensor(inputTensorInfo, inputData.data())}
92  };
93 
94  std::vector<float> expectedOutputData {0.0f, 0.0f, 42.0f, 0.0f};
95 
96  std::vector<float> outputData(4);
97  armnn::OutputTensors outputTensors
98  {
99  {0, armnn::Tensor(run->GetOutputTensorInfo(networkIdentifier, 0), outputData.data())}
100  };
101  run->EnqueueWorkload(networkIdentifier, inputTensors, outputTensors);
102  CHECK(std::equal(outputData.begin(), outputData.end(), expectedOutputData.begin(), expectedOutputData.end()));
103 }
104 
105 }
static IRuntimePtr Create(const CreationOptions &options)
Definition: Runtime.cpp:49
Interface for a layer that is connectable to other layers via InputSlots and OutputSlots.
Definition: INetwork.hpp:66
CPU Execution: Reference C++ kernels.
virtual void ExecuteStrategy(const armnn::IConnectableLayer *layer, const armnn::BaseDescriptor &descriptor, const std::vector< armnn::ConstTensor > &constants, const char *name, const armnn::LayerBindingId id=0)=0
std::unique_ptr< IRuntime, void(*)(IRuntime *runtime)> IRuntimePtr
Definition: IRuntime.hpp:33
static IDeserializerPtr Create()
std::vector< std::pair< LayerBindingId, class ConstTensor > > InputTensors
Definition: Tensor.hpp:392
void IgnoreUnused(Ts &&...)
int LayerBindingId
Type of identifiers for bindable layers (inputs, outputs).
Definition: Types.hpp:290
virtual void SetTensorInfo(const TensorInfo &tensorInfo)=0
Base class for all descriptors.
Definition: Descriptors.hpp:22
A tensor defined by a TensorInfo (shape and data type) and a mutable backing store.
Definition: Tensor.hpp:319
IOptimizedNetworkPtr Optimize(const INetwork &network, const std::vector< BackendId > &backendPreferences, const IDeviceSpec &deviceSpec, const OptimizerOptions &options=OptimizerOptions(), Optional< std::vector< std::string > &> messages=EmptyOptional())
Create an optimized version of the network.
Definition: Network.cpp:1847
int NetworkId
Definition: IRuntime.hpp:27
A tensor defined by a TensorInfo (shape and data type) and an immutable backing store.
Definition: Tensor.hpp:327
std::vector< std::pair< LayerBindingId, class Tensor > > OutputTensors
Definition: Tensor.hpp:393
std::unique_ptr< IDeserializer, void(*)(IDeserializer *parser)> IDeserializerPtr
An ActivationDescriptor for the ActivationLayer.
Definition: Descriptors.hpp:36
virtual LayerType GetType() const =0
Returns the armnn::LayerType of this layer.
float m_A
Alpha upper bound value used by the activation functions. (BoundedReLu, Linear, TanH, Elu).
Definition: Descriptors.hpp:61
std::unique_ptr< ISerializer, void(*)(ISerializer *serializer)> ISerializerPtr
Definition: ISerializer.hpp:15
virtual const IInputSlot & GetInputSlot(unsigned int index) const =0
Get a const input slot handle by slot index.
void SetConstant(const bool IsConstant=true)
Marks the data corresponding to this tensor info as constant.
Definition: Tensor.cpp:514
static ISerializerPtr Create()
Definition: Serializer.cpp:35
virtual const IOutputSlot & GetOutputSlot(unsigned int index) const =0
Get the const output slot handle by slot index.
std::unique_ptr< INetwork, void(*)(INetwork *network)> INetworkPtr
Definition: INetwork.hpp:241
virtual int Connect(IInputSlot &destination)=0
static INetworkPtr Create(NetworkOptions networkOptions={})
Definition: Network.cpp:476
float m_B
Beta lower bound value used by the activation functions. (BoundedReLu, Linear, TanH).
Definition: Descriptors.hpp:63
ActivationFunction m_Function
The activation function to use (Sigmoid, TanH, Linear, ReLu, BoundedReLu, SoftReLu, LeakyReLu, Abs, Sqrt, Square, Elu).
Definition: Descriptors.hpp:59