13 #include <boost/test/unit_test.hpp> 18 using namespace armnn;
24 const float g_qScale = 1.0f;
25 const int32_t g_qOffset = 0;
28 std::vector<T> GetVector(
unsigned int size,
float initial,
float increment)
30 std::vector<float> typeVector(size, initial);
31 std::vector<T> vector(size);
35 for (
unsigned int i = 0; i < size; ++i)
37 vector[i] = T(initial + (increment * static_cast<float>(i)));
43 template<armnn::DataType ArmnnType,
typename T = armnn::ResolveType<ArmnnType>>
44 struct Convolution2dTest
47 static std::string GetReceiverLayerName() {
return "Convolution2d"; };
48 static const bool isElementWise =
false;
54 constexpr
static const unsigned int inputSize = 48;
55 constexpr
static const unsigned int outputSize = 36;
66 std::vector<float> weightsData = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
67 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
68 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
69 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42};
70 std::vector<T> weightsVector = armnnUtils::QuantizedVector<T>(weightsData, g_qScale, g_qOffset);
71 TensorInfo weightsInfo(GetWeightsShape(), ArmnnType, g_qScale, g_qOffset);
79 template<armnn::DataType ArmnnType,
typename T = armnn::ResolveType<ArmnnType>>
84 static std::string GetReceiverLayerName() {
return "DepthwiseConvolution2d"; };
85 static const bool isElementWise =
false;
91 constexpr
static const unsigned int inputSize = 48;
92 constexpr
static const unsigned int outputSize = 108;
103 std::vector<float> weightsData = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
104 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
105 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
106 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42};
107 std::vector<T> weightsVector = armnnUtils::QuantizedVector<T>(weightsData, g_qScale, g_qOffset);
108 TensorInfo weightsInfo(GetWeightsShape(), ArmnnType, g_qScale, g_qOffset);
116 template<armnn::DataType ArmnnType,
typename T = armnn::ResolveType<ArmnnType>>
121 static std::string GetReceiverLayerName() {
return "FullyConnected"; };
122 static const bool isElementWise =
false;
128 constexpr
static const unsigned int inputSize = 10;
129 constexpr
static const unsigned int outputSize = 6;
137 std::vector<float> weightsData = { 1, 2, 3, 4, 5,
140 std::vector<T> weightsVector = armnnUtils::QuantizedVector<T>(weightsData, g_qScale, g_qOffset);
141 TensorInfo weightsInfo(GetWeightsShape(), ArmnnType, g_qScale, g_qOffset);
149 template<armnn::DataType ArmnnType,
typename T = armnn::ResolveType<ArmnnType>>
154 static std::string GetReceiverLayerName() {
return "BatchNorm"; };
155 static const bool isElementWise =
false;
160 constexpr
static const unsigned int inputSize = 48;
161 constexpr
static const unsigned int outputSize = 48;
169 std::vector<T> betaVector = GetVector<T>(GetOutputShape()[3], 0.0f, 0.2f);
170 std::vector<T> gammaVector = GetVector<T>(GetOutputShape()[3], 0.5f, 0.1f);
171 std::vector<T> meanVector = GetVector<T>(GetOutputShape()[3], 0.1f, 0.1f);
172 std::vector<T> varianceVector = GetVector<T>(GetOutputShape()[3], 1.0f, 0.1f);
174 const unsigned int outputChannelSize[] = { GetOutputShape()[3] };
184 template<armnn::DataType ArmnnType,
typename T = armnn::ResolveType<ArmnnType>>
188 static std::string GetReceiverLayerName() {
return "Multiplication"; };
189 static const bool isElementWise =
true;
194 constexpr
static const unsigned int inputSize = 48;
195 constexpr
static const unsigned int outputSize = 48;
204 template<armnn::DataType ArmnnType,
typename T = armnn::ResolveType<ArmnnType>>
208 static std::string GetReceiverLayerName() {
return "Addition"; };
209 static const bool isElementWise =
true;
214 constexpr
static const unsigned int inputSize = 48;
215 constexpr
static const unsigned int outputSize = 48;
224 template<armnn::DataType ArmnnType,
typename T = armnn::ResolveType<ArmnnType>>
228 static std::string GetReceiverLayerName() {
return "Subtraction"; };
229 static const bool isElementWise =
true;
234 constexpr
static const unsigned int inputSize = 48;
235 constexpr
static const unsigned int outputSize = 48;
244 template<armnn::DataType ArmnnType,
typename T = armnn::ResolveType<ArmnnType>>
248 static std::string GetReceiverLayerName() {
return "Division"; };
249 static const bool isElementWise =
true;
254 constexpr
static const unsigned int inputSize = 48;
255 constexpr
static const unsigned int outputSize = 48;
266 template<
typename LayerTest,
278 IConnectableLayer* activationLayer = network->AddActivationLayer(activationDescriptor,
282 IConnectableLayer* output2Layer = preventFusing?network->AddOutputLayer(1):
nullptr;
285 TensorInfo inputInfo(LayerTest::GetInputShape(), ArmnnType, g_qScale, g_qOffset);
286 TensorInfo outputInfo(LayerTest::GetOutputShape(), ArmnnType, g_qScale, g_qOffset);
291 activationLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
296 activationLayer->GetOutputSlot(0).Connect(outputLayer->
GetInputSlot(0));
298 if (LayerTest::isElementWise)
310 template<
typename LayerTest,
319 INetworkPtr networkFused = CreatNetwork<LayerTest, ArmnnType>(activationDescriptor,
false);
327 Graph graphFused = PolymorphicDowncast<OptimizedNetwork*>(optNetFused.get())->GetGraph();
329 auto checkFusedConv2d = [](
const armnn::Layer*
const layer)->
bool {
330 return IsLayerOfType<LayerType>(layer) &&
331 (layer->GetNameStr() ==
"fused-activation-into-receiverLayer");
334 BOOST_CHECK_MESSAGE(3 == graphFused.GetNumLayers(), LayerTest::GetReceiverLayerName());
337 &IsLayerOfType<InputLayer>,
339 &IsLayerOfType<OutputLayer>));
343 BOOST_TEST(run->LoadNetwork(networkIdentifier, std::move(optNetFused)) ==
Status::Success);
346 std::vector<float> data = GetVector<float>(LayerTest::inputSize, 1.0f, 0.1f);
347 std::vector<T> inputDataFused = armnnUtils::QuantizedVector<T>(data, g_qScale, g_qOffset);
348 std::vector<T> outputDataFused(LayerTest::outputSize);
351 {0,
ConstTensor(run->GetInputTensorInfo(networkIdentifier, 0), inputDataFused.data())}};
353 {0,
Tensor(run->GetOutputTensorInfo(networkIdentifier, 0), outputDataFused.data())}};
356 run->EnqueueWorkload(networkIdentifier, inputTensorsFused, outputTensorsFused);
360 INetworkPtr networkNotFused = CreatNetwork<LayerTest, ArmnnType>(activationDescriptor,
true);
368 Graph graphNotFused = PolymorphicDowncast<OptimizedNetwork*>(optNetNotFused.get())->GetGraph();
370 BOOST_CHECK(5 == graphNotFused.GetNumLayers());
372 graphNotFused.cend(),
373 &IsLayerOfType<armnn::InputLayer>,
374 &IsLayerOfType<LayerType>,
375 &IsLayerOfType<armnn::ActivationLayer>,
376 &IsLayerOfType<armnn::OutputLayer>,
377 &IsLayerOfType<armnn::OutputLayer>));
381 BOOST_TEST(runNotFused->LoadNetwork(networkIdentifierNotFused, std::move(optNetNotFused)) ==
Status::Success);
384 std::vector<T> inputDataNotFused = armnnUtils::QuantizedVector<T>(data, g_qScale, g_qOffset);
385 std::vector<T> outputDataNotFused(LayerTest::outputSize);
386 std::vector<T> outputData2NotFused(LayerTest::outputSize);
389 {0,
ConstTensor(runNotFused->GetInputTensorInfo(networkIdentifierNotFused, 0), inputDataNotFused.data())}};
391 {0,
Tensor(runNotFused->GetOutputTensorInfo(networkIdentifierNotFused, 0), outputDataNotFused.data())},
392 {1,
Tensor(runNotFused->GetOutputTensorInfo(networkIdentifierNotFused, 1), outputData2NotFused.data())}};
395 runNotFused->EnqueueWorkload(networkIdentifierNotFused, inputTensorsNotFused, outputTensorsNotFused);
398 for (
unsigned int n = 0; n < outputDataFused.size(); ++n)
400 BOOST_CHECK_CLOSE(static_cast<float>(outputDataFused[n]), static_cast<float>(outputDataNotFused[n]),
405 #if defined(ARMCOMPUTENEON_ENABLED) 412 FuseActivationIntoPreviousLayerTest<Convolution2dTest<DataType::Float32>,
DataType::Float32>
420 FuseActivationIntoPreviousLayerTest<DepthwiseConvolution2dTest<DataType::Float32>,
DataType::Float32>
428 FuseActivationIntoPreviousLayerTest<FullyConnectedTest<DataType::Float32>,
DataType::Float32>
436 FuseActivationIntoPreviousLayerTest<BatchNormTest<DataType::Float32>,
DataType::Float32>
445 activationDescriptor.
m_A = 1.0f;
446 activationDescriptor.
m_B = -1.0f;
448 FuseActivationIntoPreviousLayerTest<Convolution2dTest<DataType::Float32>,
DataType::Float32>
455 activationDescriptor.
m_A = 1.0f;
456 activationDescriptor.
m_B = -1.0f;
458 FuseActivationIntoPreviousLayerTest < DepthwiseConvolution2dTest < DataType::Float32 > ,
DataType::Float32 >
465 activationDescriptor.
m_A = 1.0f;
466 activationDescriptor.
m_B = -1.0f;
468 FuseActivationIntoPreviousLayerTest<FullyConnectedTest<DataType::Float32>,
DataType::Float32>
475 activationDescriptor.
m_A = 1.0f;
476 activationDescriptor.
m_B = -1.0f;
478 FuseActivationIntoPreviousLayerTest<BatchNormTest<DataType::Float32>,
DataType::Float32>
488 FuseActivationIntoPreviousLayerTest<Convolution2dTest<DataType::QAsymmU8>,
DataType::QAsymmU8>
496 FuseActivationIntoPreviousLayerTest<DepthwiseConvolution2dTest<DataType::QAsymmU8>,
DataType::QAsymmU8>
504 FuseActivationIntoPreviousLayerTest<FullyConnectedTest<DataType::QAsymmU8>,
DataType::QAsymmU8>
514 FuseActivationIntoPreviousLayerTest<Convolution2dTest<DataType::Float32>,
DataType::Float32>
524 FuseActivationIntoPreviousLayerTest<Convolution2dTest<DataType::Float32>,
DataType::Float32>
529 #if defined(ARMCOMPUTECL_ENABLED) 536 FuseActivationIntoPreviousLayerTest<Convolution2dTest<DataType::Float32>,
DataType::Float32>
544 FuseActivationIntoPreviousLayerTest<DepthwiseConvolution2dTest<DataType::Float32>,
DataType::Float32>
552 FuseActivationIntoPreviousLayerTest<FullyConnectedTest<DataType::Float32>,
DataType::Float32>
560 FuseActivationIntoPreviousLayerTest<BatchNormTest<DataType::Float32>,
DataType::Float32>
568 FuseActivationIntoPreviousLayerTest<MultiplicationTest<DataType::Float32>,
DataType::Float32>
576 FuseActivationIntoPreviousLayerTest<AdditionTest<DataType::Float32>,
DataType::Float32>
584 FuseActivationIntoPreviousLayerTest<SubtractionTest<DataType::Float32>,
DataType::Float32>
592 FuseActivationIntoPreviousLayerTest<DivisionTest<DataType::Float32>,
DataType::Float32>
601 activationDescriptor.
m_A = 1.0f;
602 activationDescriptor.
m_B = -1.0f;
604 FuseActivationIntoPreviousLayerTest<Convolution2dTest<DataType::Float32>,
DataType::Float32>
611 activationDescriptor.
m_A = 1.0f;
612 activationDescriptor.
m_B = -1.0f;
614 FuseActivationIntoPreviousLayerTest<DepthwiseConvolution2dTest<DataType::Float32>,
DataType::Float32>
621 activationDescriptor.
m_A = 1.0f;
622 activationDescriptor.
m_B = -1.0f;
624 FuseActivationIntoPreviousLayerTest<FullyConnectedTest<DataType::Float32>,
DataType::Float32>
631 activationDescriptor.
m_A = 1.0f;
632 activationDescriptor.
m_B = -1.0f;
634 FuseActivationIntoPreviousLayerTest<BatchNormTest<DataType::Float32>,
DataType::Float32>
641 activationDescriptor.
m_A = 1.0f;
642 activationDescriptor.
m_B = -1.0f;
644 FuseActivationIntoPreviousLayerTest<MultiplicationTest<DataType::Float32>,
DataType::Float32>
651 activationDescriptor.
m_A = 1.0f;
652 activationDescriptor.
m_B = -1.0f;
654 FuseActivationIntoPreviousLayerTest<AdditionTest<DataType::Float32>,
DataType::Float32>
661 activationDescriptor.
m_A = 1.0f;
662 activationDescriptor.
m_B = -1.0f;
664 FuseActivationIntoPreviousLayerTest<SubtractionTest<DataType::Float32>,
DataType::Float32>
671 activationDescriptor.
m_A = 1.0f;
672 activationDescriptor.
m_B = -1.0f;
674 FuseActivationIntoPreviousLayerTest<DivisionTest<DataType::Float32>,
DataType::Float32>
684 FuseActivationIntoPreviousLayerTest<Convolution2dTest<DataType::QAsymmU8>,
DataType::QAsymmU8>
692 FuseActivationIntoPreviousLayerTest<DepthwiseConvolution2dTest<DataType::QAsymmU8>,
DataType::QAsymmU8>
700 FuseActivationIntoPreviousLayerTest<FullyConnectedTest<DataType::QAsymmU8>,
DataType::QAsymmU8>
710 FuseActivationIntoPreviousLayerTest<Convolution2dTest<DataType::Float32>,
DataType::Float32>
718 FuseActivationIntoPreviousLayerTest<MultiplicationTest<DataType::Float32>,
DataType::Float32>
726 FuseActivationIntoPreviousLayerTest<AdditionTest<DataType::Float32>,
DataType::Float32>
734 FuseActivationIntoPreviousLayerTest<SubtractionTest<DataType::Float32>,
DataType::Float32>
742 FuseActivationIntoPreviousLayerTest<DivisionTest<DataType::Float32>,
DataType::Float32>
752 FuseActivationIntoPreviousLayerTest<Convolution2dTest<DataType::Float32>,
DataType::Float32>
760 FuseActivationIntoPreviousLayerTest<MultiplicationTest<DataType::Float32>,
DataType::Float32>
768 FuseActivationIntoPreviousLayerTest<AdditionTest<DataType::Float32>,
DataType::Float32>
776 FuseActivationIntoPreviousLayerTest<SubtractionTest<DataType::Float32>,
DataType::Float32>
784 FuseActivationIntoPreviousLayerTest<DivisionTest<DataType::Float32>,
DataType::Float32>
BOOST_AUTO_TEST_SUITE(TensorflowLiteParser)
bool m_BiasEnabled
Enable/disable bias.
DataLayout m_DataLayout
The data layout to be used (NCHW, NHWC).
static IRuntimePtr Create(const CreationOptions &options)
This layer represents a batch normalization operation.
Interface for a layer that is connectable to other layers via InputSlots and OutputSlots.
bool m_BiasEnabled
Enable/disable bias.
LayerTestResult< T, 2 > FullyConnectedTest(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory, bool biasEnabled)
DataLayout m_DataLayout
The data layout to be used (NCHW, NHWC).
This layer represents a depthwise convolution 2d operation.
A Convolution2dDescriptor for the Convolution2dLayer.
LayerTestResult< float, 4 > DivisionTest(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
std::unique_ptr< IRuntime, void(*)(IRuntime *runtime)> IRuntimePtr
DataLayout m_DataLayout
The data layout to be used (NCHW, NHWC).
typename ResolveTypeImpl< DT >::Type ResolveType
Main network class which provides the interface for building up a neural network. ...
virtual IConnectableLayer * AddBatchNormalizationLayer(const BatchNormalizationDescriptor &desc, const ConstTensor &mean, const ConstTensor &variance, const ConstTensor &beta, const ConstTensor &gamma, const char *name=nullptr)=0
Adds a batch normalization layer to the network.
std::vector< std::pair< LayerBindingId, class ConstTensor > > InputTensors
INetworkPtr CreatNetwork(ActivationDescriptor activationDescriptor, bool preventFusing)
Copyright (c) 2020 ARM Limited.
LayerTestResult< float, 4 > AdditionTest(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
virtual IConnectableLayer * AddFullyConnectedLayer(const FullyConnectedDescriptor &fullyConnectedDescriptor, const ConstTensor &weights, const Optional< ConstTensor > &biases, const char *name=nullptr)=0
Adds a fully connected layer to the network.
virtual void SetTensorInfo(const TensorInfo &tensorInfo)=0
virtual IConnectableLayer * AddConvolution2dLayer(const Convolution2dDescriptor &convolution2dDescriptor, const ConstTensor &weights, const Optional< ConstTensor > &biases, const char *name=nullptr)=0
Adds a 2D convolution layer to the network.
A tensor defined by a TensorInfo (shape and data type) and a mutable backing store.
virtual IConnectableLayer * AddAdditionLayer(const char *name=nullptr)=0
Adds an addition layer to the network.
uint32_t m_StrideX
Stride value when proceeding through input for the width dimension.
uint32_t m_StrideX
Stride value when proceeding through input for the width dimension.
Compute
The Compute enum is now deprecated and it is now being replaced by BackendId.
This layer represents a fully connected operation.
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.
A FullyConnectedDescriptor for the FullyConnectedLayer.
bool m_BiasEnabled
Enable/disable bias.
A tensor defined by a TensorInfo (shape and data type) and an immutable backing store.
std::vector< std::pair< LayerBindingId, class Tensor > > OutputTensors
std::unique_ptr< IOptimizedNetwork, void(*)(IOptimizedNetwork *network)> IOptimizedNetworkPtr
GPU Execution: OpenCL: ArmCompute.
BOOST_AUTO_TEST_CASE(CheckConvolution2dLayer)
An ActivationDescriptor for the ActivationLayer.
min(a, max(b, input)) ReLu1 & ReLu6.
virtual IConnectableLayer * AddDepthwiseConvolution2dLayer(const DepthwiseConvolution2dDescriptor &convolution2dDescriptor, const ConstTensor &weights, const Optional< ConstTensor > &biases, const char *name=nullptr)=0
Adds a 2D depthwise convolution layer to the network.
uint32_t m_StrideY
Stride value when proceeding through input for the height dimension.
void FuseActivationIntoPreviousLayerTest(ActivationDescriptor activationDescriptor, float tolerance, armnn::Compute backendId)
This layer represents an addition operation.
float m_A
Alpha upper bound value used by the activation functions. (BoundedReLu, Linear, TanH, Elu).
BOOST_AUTO_TEST_SUITE_END()
This layer represents a subtraction operation.
uint32_t m_StrideY
Stride value when proceeding through input for the height dimension.
LayerTestResult< float, 4 > SubtractionTest(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
CPU Execution: NEON: ArmCompute.
bool CheckSequence(const armnn::Graph::ConstIterator first, const armnn::Graph::ConstIterator last)
virtual const IInputSlot & GetInputSlot(unsigned int index) const =0
Get a const input slot handle by slot index.
This layer represents a division operation.
virtual const IOutputSlot & GetOutputSlot(unsigned int index) const =0
Get the const output slot handle by slot index.
This layer represents a convolution 2d operation.
std::unique_ptr< INetwork, void(*)(INetwork *network)> INetworkPtr
virtual int Connect(IInputSlot &destination)=0
This layer represents a multiplication operation.
static INetworkPtr Create(NetworkOptions networkOptions={})
virtual IConnectableLayer * AddDivisionLayer(const char *name=nullptr)=0
Adds a division layer to the network.
float m_B
Beta lower bound value used by the activation functions. (BoundedReLu, Linear, TanH).
LayerTestResult< float, 4 > MultiplicationTest(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
LayerTestResult< float, 4 > DepthwiseConvolution2dTest(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory, bool biasEnabled, const armnn::DataLayout layout)
ActivationFunction m_Function
The activation function to use (Sigmoid, TanH, Linear, ReLu, BoundedReLu, SoftReLu, LeakyReLu, Abs, Sqrt, Square, Elu).
A DepthwiseConvolution2dDescriptor for the DepthwiseConvolution2dLayer.
A BatchNormalizationDescriptor for the BatchNormalizationLayer.
virtual IConnectableLayer * AddMultiplicationLayer(const char *name=nullptr)=0
Adds a multiplication layer to the network.
virtual IConnectableLayer * AddSubtractionLayer(const char *name=nullptr)=0
Adds a subtraction layer to the network.