From a4b6090eea91d4c11f4319d175b5c6fbf1d2a984 Mon Sep 17 00:00:00 2001 From: Teresa Charlin Date: Wed, 7 Feb 2024 20:55:53 +0000 Subject: Add and tidy up activation and elementwise binary end to end tests Signed-off-by: Teresa Charlin Change-Id: I9714c4c57e923ac775dcde2951de07cea35c40ee --- .../test/ActivationEndToEndTestImpl.hpp | 214 ++++++++++++------ src/backends/cl/test/ClEndToEndTests.cpp | 189 +++++++++++----- src/backends/neon/test/NeonEndToEndTests.cpp | 82 +++++-- src/backends/reference/test/RefEndToEndTests.cpp | 241 +++++++++++++++++---- .../tosaCommon/test/OneToManyMappingTests.cpp | 18 +- 5 files changed, 558 insertions(+), 186 deletions(-) diff --git a/src/backends/backendsCommon/test/ActivationEndToEndTestImpl.hpp b/src/backends/backendsCommon/test/ActivationEndToEndTestImpl.hpp index 996e7605d2..09d71923b6 100644 --- a/src/backends/backendsCommon/test/ActivationEndToEndTestImpl.hpp +++ b/src/backends/backendsCommon/test/ActivationEndToEndTestImpl.hpp @@ -57,12 +57,12 @@ armnn::INetworkPtr CreateActivationNetwork(const armnn::TensorInfo& inputInfo, INetworkPtr net(INetwork::Create()); - IConnectableLayer* input = net->AddInputLayer(0, "input"); - IConnectableLayer* prelu = net->AddActivationLayer(descriptor, ActivationName); - IConnectableLayer* output = net->AddOutputLayer(0, "output"); + IConnectableLayer* inputLayer = net->AddInputLayer(0, "input"); + IConnectableLayer* activationLayer = net->AddActivationLayer(descriptor, ActivationName); + IConnectableLayer* outputLayer = net->AddOutputLayer(0, "output"); - Connect(input, prelu, inputInfo, 0, 0); - Connect(prelu, output, outputInfo, 0, 0); + Connect(inputLayer, activationLayer, inputInfo, 0, 0); + Connect(activationLayer, outputLayer, outputInfo, 0, 0); return net; } @@ -113,83 +113,169 @@ void ActivationEndToEndImpl(const std::vector& backends, tolerance); } -/** Executes an end to end test for Elu activation with specific input and expected-output data - * - * @tparam ArmnnType The armnn data type for the input and expected-output data - * @param backends The backends on which to run the test - */ -template> -void EluEndToEndTest(const std::vector& backends) +std::vector Activation(const std::vector& input, + const ActivationDescriptor& descriptor) { - std::vector floatInputData{ -2.0f, -1.0f, -0.0f, 0.0f, - 1.0f, 2.0f, 3.0f, 4.0f }; + float a = descriptor.m_A; + float b = descriptor.m_B; - std::vector floatExpectedOutputData{ -0.86466471676f, -0.63212055882f, -0.0f, 0.0f, - 1.0f , 2.0f , 3.0f, 4.0f }; + std::vector output; + output.reserve(input.size()); - float qScale = 1.0f; - int32_t qOffset = 0; - armnn::TensorInfo inputInfo({ 2, 2, 2, 1 }, ArmnnType, qScale, qOffset, true); - armnn::TensorInfo outputInfo({ 2, 2, 2, 1 }, ArmnnType, qScale, qOffset); - - armnn::ActivationDescriptor descriptor(ActivationFunction::Elu, 1.0); - - ActivationEndToEndImpl(backends, - floatInputData, - floatExpectedOutputData, - inputInfo, - outputInfo, - descriptor); + // Compute the result of the activation function. + switch (descriptor.m_Function) + { + case ActivationFunction::Linear: + { + for (auto in :input) + { + auto out = a * in + b; + output.push_back(out); + } + break; + } + case ActivationFunction::Sigmoid: + { + for (auto in :input) + { + auto out = 1.f / (1.f + expf(-in)); + output.push_back(out); + } + break; + } + case ActivationFunction::ReLu: + { + for (auto in :input) + { + auto out = std::max(0.f, in); + output.push_back(out); + } + break; + } + case ActivationFunction::BoundedReLu: + { + for (auto in :input) + { + auto out = std::min(a, std::max(b, in)); + output.push_back(out); + } + break; + } + case ActivationFunction::SoftReLu: + { + for (auto in :input) + { + auto out = logf(1.0f + expf(in)); + output.push_back(out); + } + break; + } + case ActivationFunction::LeakyReLu: + { + for (auto in :input) + { + auto out = in > 0.0f ? in : (in * a); + output.push_back(out); + } + break; + } + case ActivationFunction::Abs: + { + for (auto in :input) + { + auto out = in < 0 ? -in : in; + output.push_back(out); + } + break; + } + case ActivationFunction::Sqrt: + { + for (auto in :input) + { + auto out = sqrtf(in); + output.push_back(out); + } + break; + } + case ActivationFunction::Square: + { + for (auto in :input) + { + auto out = in * in; + output.push_back(out); + } + break; + } + case ActivationFunction::TanH: + { + for (auto in :input) + { + auto out = a * tanhf(b * in); + output.push_back(out); + } + break; + } + case ActivationFunction::Elu: + { + for (auto in: input) { + auto out = (in >= 0) ? in : a * (expf(in) - 1); + output.push_back(out); + } + break; + } + case ActivationFunction::HardSwish: + { + for (auto in :input) + { + // hard_swish(x) = x * relu6(x+3) / 6 + // relu6(x) = min(max(x,0),6) + auto out = in * (std::min(std::max((in + 3), 0.0f), 6.0f)) / 6; + output.push_back(out); + } + break; + } + case ActivationFunction::Gelu: + { + for (auto in :input) + { + // gelu(x) = x * 1/2 * (1 + erf(x / sqrt(2))), + // where erf is Gaussian error function + auto out = in * (0.5f * (1.0f + erff(static_cast(in / std::sqrt(2))))); + output.push_back(out); + } + break; + } + default: + { + throw InvalidArgumentException("Unsupported activation function"); + } + } + return output; } -/** Executes an end to end test for HardSwish activation with specific input and expected-output data +/** Executes an end to end test for activation layers with specific input and expected-output data * * @tparam ArmnnType The armnn data type for the input and expected-output data * @param backends The backends on which to run the test */ template> -void HardSwishEndToEndTest(const std::vector& backends) +void ActivationEndToEndTest(const std::vector& backends, + const ActivationFunction activationFunction, + const float qScale=1.0f, + const int32_t qOffset=0, + const float a = 1, + const float b = 0) { - std::vector floatInputData{ -2.0f, -1.0f, -0.5f, 0.0f, + std::vector floatInputData{ -2.0f, -1.0f, -0.0f, 0.0f, 1.0f, 2.0f, 3.0f, 4.0f }; - std::vector floatExpectedOutputData{ -0.33333333333f, -0.33333333333f, -0.208333f, 0.0f, - 0.66666666667f, 1.66666666667f, 3.0f , 4.0f }; - - float qScale = 1.0f; - int32_t qOffset = 0; - armnn::TensorInfo inputInfo({ 2, 2, 2, 1 }, ArmnnType, qScale, qOffset, true); - armnn::TensorInfo outputInfo({ 2, 2, 2, 1 }, ArmnnType, qScale, qOffset); + ActivationDescriptor descriptor(activationFunction, a, b); - armnn::ActivationDescriptor descriptor(ActivationFunction::HardSwish, 1.0); - - ActivationEndToEndImpl(backends, - floatInputData, - floatExpectedOutputData, - inputInfo, - outputInfo, - descriptor); -} - -/** Executes an end to end test for Leaky Relu activation with specific input and expected-output data - * - * @tparam ArmnnType The armnn data type for the input and expected-output data - * @param backends The backends on which to run the test - */ -template -void LeakyReluEndToEndTest(const std::vector& backends, const float qScale=1.0f, const int32_t qOffset=0) -{ - std::vector floatInputData{ -2.0f, -1.0f, -0.0f, 0.0f, - 1.0f, 2.0f, 3.0f, 4.0f }; - - std::vector floatExpectedOutputData{ -0.02f, -0.01f, -0.0f, 0.0f, - 1.0f, 2.0f, 3.0f, 4.0f }; + std::vector floatExpectedOutputData = Activation(floatInputData, descriptor); armnn::TensorInfo inputInfo({ 2, 2, 2, 1 }, ArmnnType, qScale, qOffset, true); armnn::TensorInfo outputInfo({ 2, 2, 2, 1 }, ArmnnType, qScale, qOffset); - armnn::ActivationDescriptor descriptor(ActivationFunction::LeakyReLu, static_cast(0.01)); - ActivationEndToEndImpl(backends, floatInputData, floatExpectedOutputData, diff --git a/src/backends/cl/test/ClEndToEndTests.cpp b/src/backends/cl/test/ClEndToEndTests.cpp index 3acd7dc29b..c48aa8aac0 100644 --- a/src/backends/cl/test/ClEndToEndTests.cpp +++ b/src/backends/cl/test/ClEndToEndTests.cpp @@ -39,18 +39,106 @@ TEST_SUITE("ClEndToEnd") { std::vector clDefaultBackends = {armnn::Compute::GpuAcc}; +// Activations +// Linear +TEST_CASE("ClLinearEndToEndTestFloat32") +{ + ActivationEndToEndTest(clDefaultBackends, ActivationFunction::Linear); +} + +TEST_CASE("ClLinearEndToEndTestFloat16") +{ + ActivationEndToEndTest(clDefaultBackends, ActivationFunction::Linear); +} + +// Sigmoid +TEST_CASE("ClSigmoidEndToEndTestFloat32") +{ + ActivationEndToEndTest(clDefaultBackends, ActivationFunction::Sigmoid); +} + +// ReLu +TEST_CASE("ClReLuEndToEndTestFloat32") +{ + ActivationEndToEndTest(clDefaultBackends, ActivationFunction::ReLu); +} + +TEST_CASE("ClReLuEndToEndTestFloat16") +{ + ActivationEndToEndTest(clDefaultBackends, ActivationFunction::ReLu); +} + +// BoundedReLu +TEST_CASE("ClBoundedReLuEndToEndTestFloat32") +{ + ActivationEndToEndTest(clDefaultBackends, ActivationFunction::BoundedReLu); +} + +TEST_CASE("ClBoundedReLuEndToEndTestFloat16") +{ + ActivationEndToEndTest(clDefaultBackends, ActivationFunction::BoundedReLu); +} + +// SoftReLu +TEST_CASE("ClSoftReLuEndToEndTestFloat32") +{ + ActivationEndToEndTest(clDefaultBackends, ActivationFunction::SoftReLu); +} + +// LeakyRelu +TEST_CASE("ClLeakyReluActivationFloat32") +{ + ActivationEndToEndTest(clDefaultBackends, ActivationFunction::LeakyReLu, 1.f, 0, 0.01f); +} + +TEST_CASE("ClLeakyReluActivationFloat16") +{ + ActivationEndToEndTest(clDefaultBackends, ActivationFunction::LeakyReLu, 0.3f, 5, 0.01f); +} + +// Elu +TEST_CASE("ClEluEndToEndTestFloat32") +{ + ActivationEndToEndTest(clDefaultBackends, ActivationFunction::Elu); +} + +TEST_CASE("ClEluEndToEndTestFloat16") +{ + ActivationEndToEndTest(clDefaultBackends, ActivationFunction::Elu); +} + +// HardSwish +TEST_CASE("ClHardSwishEndToEndTestFloat32") +{ + ActivationEndToEndTest(clDefaultBackends, ActivationFunction::HardSwish); +} + +TEST_CASE("ClHardSwishEndToEndTestFloat16") +{ + ActivationEndToEndTest(clDefaultBackends, ActivationFunction::HardSwish); +} + +// TanH +TEST_CASE("ClTanHEndToEndTestFloat32") +{ + ActivationEndToEndTest(clDefaultBackends, ActivationFunction::TanH, 1.f, 0, 2, 3); +} + +TEST_CASE("ClTanHEndToEndTestFloat16") +{ + ActivationEndToEndTest(clDefaultBackends, ActivationFunction::TanH, 1.f, 0, 2, 3); +} + // ElementwiseUnary // Abs TEST_CASE("ClAbsEndToEndTestFloat32") { - ElementwiseUnarySimpleEndToEnd(clDefaultBackends, - UnaryOperation::Abs); + ElementwiseUnarySimpleEndToEnd(clDefaultBackends, UnaryOperation::Abs); } // Rsqrt TEST_CASE("ClRsqrtEndToEndTestFloat32") { - ElementwiseUnarySimpleEndToEnd(clDefaultBackends, - UnaryOperation::Rsqrt); + ElementwiseUnarySimpleEndToEnd(clDefaultBackends, UnaryOperation::Rsqrt); } // ElementwiseBinary @@ -59,7 +147,6 @@ TEST_CASE("ClAdditionEndToEndFloat32Test") { AdditionEndToEnd(clDefaultBackends); } - TEST_CASE("ClAdditionEndToEndUint8Test") { AdditionEndToEnd(clDefaultBackends); @@ -74,23 +161,23 @@ TEST_CASE("ClAdditionEndToEndFloat16Simple3DTest") ElementwiseBinarySimple3DEndToEnd(clDefaultBackends, BinaryOperation::Add); } -// Power -TEST_CASE("ClPowerEndToEndTestFloat32") +// Div +TEST_CASE("ClDivEndToEndTestFloat32") { - ElementwiseBinarySimpleEndToEnd(clDefaultBackends, BinaryOperation::Power); + ElementwiseBinarySimpleEndToEnd(clDefaultBackends, BinaryOperation::Div); } -// SqDiff -TEST_CASE("ClSquaredDifferenceEndToEndTestFloat32") +// Mul +TEST_CASE("ClMulEndToEndTestFloat32") { - ElementwiseBinarySimpleEndToEnd(clDefaultBackends, BinaryOperation::SqDiff); + ElementwiseBinarySimpleEndToEnd(clDefaultBackends, BinaryOperation::Mul); } - -TEST_CASE("ClSquaredDifferenceEndToEndTestUint8") +TEST_CASE("ClMulEndToEndTestUint8") { - ElementwiseBinarySimpleEndToEnd(clDefaultBackends, BinaryOperation::SqDiff); + ElementwiseBinarySimpleEndToEnd(clDefaultBackends, BinaryOperation::Mul); } +// Sub TEST_CASE("ClSubtractionEndToEndFloat32Simple3DTest") { ElementwiseBinarySimple3DEndToEnd(clDefaultBackends, BinaryOperation::Sub); @@ -100,6 +187,42 @@ TEST_CASE("ClSubtractionEndToEndFloat16Simple3DTest") ElementwiseBinarySimple3DEndToEnd(clDefaultBackends, BinaryOperation::Sub); } +// Max +TEST_CASE("ClMaximumEndToEndTestFloat32") +{ + ElementwiseBinarySimpleEndToEnd(clDefaultBackends, BinaryOperation::Maximum); +} +TEST_CASE("ClMaximumEndToEndTestUint8") +{ + ElementwiseBinarySimpleEndToEnd(clDefaultBackends, BinaryOperation::Maximum); +} + +// Min +TEST_CASE("ClMinimumEndToEndTestFloat32") +{ + ElementwiseBinarySimpleEndToEnd(clDefaultBackends, BinaryOperation::Minimum); +} +TEST_CASE("ClMinimumEndToEndTestUint8") +{ + ElementwiseBinarySimpleEndToEnd(clDefaultBackends, BinaryOperation::Minimum); +} + +// Power +TEST_CASE("ClPowerEndToEndTestFloat32") +{ + ElementwiseBinarySimpleEndToEnd(clDefaultBackends, BinaryOperation::Power); +} + +// SqDiff +TEST_CASE("ClSquaredDifferenceEndToEndTestFloat32") +{ + ElementwiseBinarySimpleEndToEnd(clDefaultBackends, BinaryOperation::SqDiff); +} +TEST_CASE("ClSquaredDifferenceEndToEndTestUint8") +{ + ElementwiseBinarySimpleEndToEnd(clDefaultBackends, BinaryOperation::SqDiff); +} + // Batch Mat Mul TEST_CASE("ClBatchMatMulEndToEndFloat32Test") { @@ -220,16 +343,6 @@ TEST_CASE("ClStridedSliceInvalidSliceEndToEndTest") StridedSliceInvalidSliceEndToEndTest(clDefaultBackends); } -TEST_CASE("ClEluEndToEndTestFloat32") -{ - EluEndToEndTest(clDefaultBackends); -} - -TEST_CASE("ClEluEndToEndTestFloat16") -{ - EluEndToEndTest(clDefaultBackends); -} - TEST_CASE("ClGreaterSimpleEndToEndTest") { const std::vector expectedOutput({ 0, 0, 0, 0, 1, 1, 1, 1, @@ -270,32 +383,6 @@ TEST_CASE("ClGreaterBroadcastEndToEndUint8Test") expectedOutput); } -// HardSwish -TEST_CASE("ClHardSwishEndToEndTestFloat32") -{ - HardSwishEndToEndTest(clDefaultBackends); -} - -TEST_CASE("ClHardSwishEndToEndTestFloat16") -{ - HardSwishEndToEndTest(clDefaultBackends); -} - -TEST_CASE("ClHardSwishEndToEndTestQAsymmS8") -{ - HardSwishEndToEndTest(clDefaultBackends); -} - -TEST_CASE("ClHardSwishEndToEndTestQAsymmU8") -{ - HardSwishEndToEndTest(clDefaultBackends); -} - -TEST_CASE("ClHardSwishEndToEndTestQSymmS16") -{ - HardSwishEndToEndTest(clDefaultBackends); -} - // InstanceNormalization TEST_CASE("ClInstanceNormalizationNhwcEndToEndTest1") { @@ -366,7 +453,7 @@ TEST_CASE("ClFillEndToEndTest") FillEndToEnd(clDefaultBackends); } -TEST_CASE("RefFillEndToEndTestFloat16") +TEST_CASE("ClFillEndToEndTestFloat16") { FillEndToEnd(clDefaultBackends); } diff --git a/src/backends/neon/test/NeonEndToEndTests.cpp b/src/backends/neon/test/NeonEndToEndTests.cpp index 1bf9344883..f505b7fd46 100644 --- a/src/backends/neon/test/NeonEndToEndTests.cpp +++ b/src/backends/neon/test/NeonEndToEndTests.cpp @@ -161,23 +161,23 @@ TEST_CASE("NeonAdditionEndToEndFloat16Simple3DTest") ElementwiseBinarySimple3DEndToEnd(neonDefaultBackends, BinaryOperation::Add); } -// Power -TEST_CASE("NeonPowerEndToEndTestFloat32") +// Div +TEST_CASE("NeonDivEndToEndTestFloat32") { - ElementwiseBinarySimpleEndToEnd(neonDefaultBackends, BinaryOperation::Power); + ElementwiseBinarySimpleEndToEnd(neonDefaultBackends, BinaryOperation::Div); } -// SqDiff -TEST_CASE("NeonSquaredDifferenceEndToEndTestFloat32") +// Mul +TEST_CASE("NeonMulEndToEndTestFloat32") { - ElementwiseBinarySimpleEndToEnd(neonDefaultBackends, BinaryOperation::SqDiff); + ElementwiseBinarySimpleEndToEnd(neonDefaultBackends, BinaryOperation::Mul); } - -TEST_CASE("NeonSquaredDifferenceEndToEndTestUint8") +TEST_CASE("NeonMulEndToEndTestUint8") { - ElementwiseBinarySimpleEndToEnd(neonDefaultBackends, BinaryOperation::SqDiff); + ElementwiseBinarySimpleEndToEnd(neonDefaultBackends, BinaryOperation::Mul); } +// Sub TEST_CASE("NeonSubtractionEndToEndFloat32Simple3DTest") { ElementwiseBinarySimple3DEndToEnd(neonDefaultBackends, BinaryOperation::Sub); @@ -187,6 +187,23 @@ TEST_CASE("NeonSubtractionEndToEndFloat16Simple3DTest") ElementwiseBinarySimple3DEndToEnd(neonDefaultBackends, BinaryOperation::Sub); } +// Power +TEST_CASE("NeonPowerEndToEndTestFloat32") +{ + ElementwiseBinarySimpleEndToEnd(neonDefaultBackends, BinaryOperation::Power); +} + +// SqDiff +TEST_CASE("NeonSquaredDifferenceEndToEndTestFloat32") +{ + ElementwiseBinarySimpleEndToEnd(neonDefaultBackends, BinaryOperation::SqDiff); +} + +TEST_CASE("NeonSquaredDifferenceEndToEndTestUint8") +{ + ElementwiseBinarySimpleEndToEnd(neonDefaultBackends, BinaryOperation::SqDiff); +} + // Batch Mat Mul TEST_CASE("NeonBatchMatMulEndToEndFloat32Test") { @@ -281,37 +298,56 @@ TEST_CASE("DequantizeEndToEndOffsetTest") DequantizeEndToEndOffset(neonDefaultBackends); } -TEST_CASE("NeonEluEndToEndTestFloat32") +// Activations +// Linear +TEST_CASE("NeonLinearEndToEndTestFloat32") { - EluEndToEndTest(neonDefaultBackends); + ActivationEndToEndTest(neonDefaultBackends, ActivationFunction::Linear); } -TEST_CASE("NeonEluEndToEndTestFloat16") +// Sigmoid +TEST_CASE("NeonSigmoidEndToEndTestFloat32") { - EluEndToEndTest(neonDefaultBackends); + ActivationEndToEndTest(neonDefaultBackends, ActivationFunction::Sigmoid); } -// HardSwish -TEST_CASE("NeonHardSwishEndToEndTestFloat32") +// ReLu +TEST_CASE("NeonReLuEndToEndTestFloat32") { - HardSwishEndToEndTest(neonDefaultBackends); + ActivationEndToEndTest(neonDefaultBackends, ActivationFunction::ReLu); } -TEST_CASE("NeonHardSwishEndToEndTestFloat16") +// BoundedReLu +TEST_CASE("NeonBoundedReLuEndToEndTestFloat32") { - HardSwishEndToEndTest(neonDefaultBackends); + ActivationEndToEndTest(neonDefaultBackends, ActivationFunction::BoundedReLu); } -TEST_CASE("NeonHardSwishEndToEndTestQAsymmS8") +// LeakyRelu +TEST_CASE("NeonLeakyReluActivationFloat32") +{ + ActivationEndToEndTest(neonDefaultBackends, ActivationFunction::LeakyReLu, 1.f, 0, 0.01f); +} + +// Elu +TEST_CASE("NeonEluEndToEndTestFloat32") +{ + ActivationEndToEndTest(neonDefaultBackends, ActivationFunction::Elu); +} + +// HardSwish +TEST_CASE("NeonHardSwishEndToEndTestFloat32") { - HardSwishEndToEndTest(neonDefaultBackends); + ActivationEndToEndTest(neonDefaultBackends, ActivationFunction::HardSwish); } -TEST_CASE("NeonHardSwishEndToEndTestQAsymmU8") +// TanH +TEST_CASE("NeonTanHEndToEndTestFloat32") { - HardSwishEndToEndTest(neonDefaultBackends); + ActivationEndToEndTest(neonDefaultBackends, ActivationFunction::TanH, 1.f, 0, 2, 3); } +// Prelu TEST_CASE("NeonPreluEndToEndFloat32Test") { PreluEndToEndNegativeTest(neonDefaultBackends); @@ -322,6 +358,7 @@ TEST_CASE("NeonPreluEndToEndTestUint8Test") PreluEndToEndPositiveTest(neonDefaultBackends); } +// SpaceToDepth TEST_CASE("NeonSpaceToDepthNhwcEndToEndTest1") { SpaceToDepthNhwcEndToEndTest1(neonDefaultBackends); @@ -342,6 +379,7 @@ TEST_CASE("NeonSpaceToDepthNchwEndToEndTest2") SpaceToDepthNchwEndToEndTest2(neonDefaultBackends); } +// Split TEST_CASE("NeonSplitter1dEndToEndTest") { Splitter1dEndToEnd(neonDefaultBackends); diff --git a/src/backends/reference/test/RefEndToEndTests.cpp b/src/backends/reference/test/RefEndToEndTests.cpp index 9f80059712..2c5dc37d8e 100644 --- a/src/backends/reference/test/RefEndToEndTests.cpp +++ b/src/backends/reference/test/RefEndToEndTests.cpp @@ -660,31 +660,6 @@ TEST_CASE("RefDepthwiseConvolution2dEndtoEndFloat32Test") armnn::DataLayout::NHWC); } -TEST_CASE("RefEluEndToEndTestFloat32") -{ - EluEndToEndTest(defaultBackends); -} - -TEST_CASE("RefEluEndToEndTestFloat16") -{ - EluEndToEndTest(defaultBackends); -} - -TEST_CASE("RefEluEndToEndTestQAsymmS8") -{ - EluEndToEndTest(defaultBackends); -} - -TEST_CASE("RefEluEndToEndTestQAsymmU8") -{ - EluEndToEndTest(defaultBackends); -} - -TEST_CASE("RefEluEndToEndTestQSymmS16") -{ - EluEndToEndTest(defaultBackends); -} - TEST_CASE("RefFillEndToEndTest") { FillEndToEnd(defaultBackends); @@ -1026,56 +1001,239 @@ TEST_CASE("RefDetectionPostProcessFastNmsUint8Test") 1.0f, 1, 0.01f, 0, 0.5f, 0); } -// HardSwish -TEST_CASE("RefHardSwishEndToEndTestFloat32") +// Activations +// Linear +TEST_CASE("RefLinearEndToEndTestFloat32") { - HardSwishEndToEndTest(defaultBackends); + ActivationEndToEndTest(defaultBackends, ActivationFunction::Linear); } -TEST_CASE("RefHardSwishEndToEndTestFloat16") +TEST_CASE("RefLinearEndToEndTestFloat16") { - HardSwishEndToEndTest(defaultBackends); + ActivationEndToEndTest(defaultBackends, ActivationFunction::Linear); } -TEST_CASE("RefHardSwishEndToEndTestQAsymmS8") +TEST_CASE("RefLinearEndToEndTestQAsymmS8") { - HardSwishEndToEndTest(defaultBackends); + ActivationEndToEndTest(defaultBackends, ActivationFunction::Linear); } -TEST_CASE("RefHardSwishEndToEndTestQAsymmU8") +TEST_CASE("RefLinearEndToEndTestQAsymmU8") { - HardSwishEndToEndTest(defaultBackends); + ActivationEndToEndTest(defaultBackends, ActivationFunction::Linear); } -TEST_CASE("RefHardSwishEndToEndTestQSymmS16") +TEST_CASE("RefLinearEndToEndTestQSymmS16") +{ + ActivationEndToEndTest(defaultBackends, ActivationFunction::Linear); +} + +// Sigmoid +TEST_CASE("RefSigmoidEndToEndTestFloat32") +{ + ActivationEndToEndTest(defaultBackends, ActivationFunction::Sigmoid); +} + +TEST_CASE("RefSigmoidEndToEndTestFloat16") +{ + ActivationEndToEndTest(defaultBackends, ActivationFunction::Sigmoid); +} + +TEST_CASE("RefSigmoidEndToEndTestQAsymmS8") +{ + ActivationEndToEndTest(defaultBackends, ActivationFunction::Sigmoid); +} + +TEST_CASE("RefSigmoidEndToEndTestQAsymmU8") +{ + ActivationEndToEndTest(defaultBackends, ActivationFunction::Sigmoid, 0.12f, 15); +} + +TEST_CASE("RefSigmoidEndToEndTestQSymmS16") +{ + ActivationEndToEndTest(defaultBackends, ActivationFunction::Sigmoid); +} + +// ReLu +TEST_CASE("RefReLuEndToEndTestFloat32") +{ + ActivationEndToEndTest(defaultBackends, ActivationFunction::ReLu); +} + +TEST_CASE("RefReLuEndToEndTestFloat16") +{ + ActivationEndToEndTest(defaultBackends, ActivationFunction::ReLu); +} + +TEST_CASE("RefReLuEndToEndTestQAsymmS8") +{ + ActivationEndToEndTest(defaultBackends, ActivationFunction::ReLu); +} + +TEST_CASE("RefReLuEndToEndTestQAsymmU8") +{ + ActivationEndToEndTest(defaultBackends, ActivationFunction::ReLu); +} + +TEST_CASE("RefReLuEndToEndTestQSymmS16") +{ + ActivationEndToEndTest(defaultBackends, ActivationFunction::ReLu); +} + +// BoundedReLu +TEST_CASE("RefBoundedReLuEndToEndTestFloat32") +{ + ActivationEndToEndTest(defaultBackends, ActivationFunction::BoundedReLu); +} + +TEST_CASE("RefBoundedReLuEndToEndTestFloat16") +{ + ActivationEndToEndTest(defaultBackends, ActivationFunction::BoundedReLu); +} + +TEST_CASE("RefBoundedReLuEndToEndTestQAsymmS8") +{ + ActivationEndToEndTest(defaultBackends, ActivationFunction::BoundedReLu); +} + +TEST_CASE("RefBoundedReLuEndToEndTestQAsymmU8") +{ + ActivationEndToEndTest(defaultBackends, ActivationFunction::BoundedReLu); +} + +TEST_CASE("RefBoundedReLuEndToEndTestQSymmS16") { - HardSwishEndToEndTest(defaultBackends); + ActivationEndToEndTest(defaultBackends, ActivationFunction::BoundedReLu); +} + +// SoftReLu +TEST_CASE("RefSoftReLuEndToEndTestFloat32") +{ + ActivationEndToEndTest(defaultBackends, ActivationFunction::SoftReLu); +} + +TEST_CASE("RefSoftReLuEndToEndTestFloat16") +{ + ActivationEndToEndTest(defaultBackends, ActivationFunction::SoftReLu); +} + +TEST_CASE("RefSoftReLuEndToEndTestQAsymmS8") +{ + ActivationEndToEndTest(defaultBackends, ActivationFunction::SoftReLu); +} + +TEST_CASE("RefSoftReLuEndToEndTestQAsymmU8") +{ + ActivationEndToEndTest(defaultBackends, ActivationFunction::SoftReLu, 0.12f, 15); +} + +TEST_CASE("RefSoftReLuEndToEndTestQSymmS16") +{ + ActivationEndToEndTest(defaultBackends, ActivationFunction::SoftReLu); } // LeakyRelu TEST_CASE("RefLeakyReluActivationFloat32") { - LeakyReluEndToEndTest(defaultBackends); + ActivationEndToEndTest(defaultBackends, ActivationFunction::LeakyReLu, 1.f, 0, 0.01f); } TEST_CASE("RefLeakyReluActivationFloat16") { - LeakyReluEndToEndTest(defaultBackends, 0.3f, 5); + ActivationEndToEndTest(defaultBackends, ActivationFunction::LeakyReLu, 0.3f, 5, 0.01f); } TEST_CASE("RefLeakyReluActivationInt8") { - LeakyReluEndToEndTest(defaultBackends, 0.6f, 7); + ActivationEndToEndTest(defaultBackends, ActivationFunction::LeakyReLu, 0.6f, 7, 0.01f); } TEST_CASE("RefLeakyReluActivationUInt8") { - LeakyReluEndToEndTest(defaultBackends, 0.12f, 15); + ActivationEndToEndTest(defaultBackends, ActivationFunction::LeakyReLu, 0.12f, 15, 0.01f); } TEST_CASE("RefLeakyReluActivationInt16") { - LeakyReluEndToEndTest(defaultBackends, 0.15f, 55); + ActivationEndToEndTest(defaultBackends, ActivationFunction::LeakyReLu, 0.15f, 55, 0.01f); +} + +// Elu +TEST_CASE("RefEluEndToEndTestFloat32") +{ + ActivationEndToEndTest(defaultBackends, ActivationFunction::Elu); +} + +TEST_CASE("RefEluEndToEndTestFloat16") +{ + ActivationEndToEndTest(defaultBackends, ActivationFunction::Elu); +} + +TEST_CASE("RefEluEndToEndTestQAsymmS8") +{ + ActivationEndToEndTest(defaultBackends, ActivationFunction::Elu); +} + +TEST_CASE("RefEluEndToEndTestQAsymmU8") +{ + ActivationEndToEndTest(defaultBackends, ActivationFunction::Elu); +} + +TEST_CASE("RefEluEndToEndTestQSymmS16") +{ + ActivationEndToEndTest(defaultBackends, ActivationFunction::Elu); +} + +// HardSwish +TEST_CASE("RefHardSwishEndToEndTestFloat32") +{ + ActivationEndToEndTest(defaultBackends, ActivationFunction::HardSwish); +} + +TEST_CASE("RefHardSwishEndToEndTestFloat16") +{ + ActivationEndToEndTest(defaultBackends, ActivationFunction::HardSwish); +} + +TEST_CASE("RefHardSwishEndToEndTestQAsymmS8") +{ + ActivationEndToEndTest(defaultBackends, ActivationFunction::HardSwish); +} + +TEST_CASE("RefHardSwishEndToEndTestQAsymmU8") +{ + ActivationEndToEndTest(defaultBackends, ActivationFunction::HardSwish); +} + +TEST_CASE("RefHardSwishEndToEndTestQSymmS16") +{ + ActivationEndToEndTest(defaultBackends, ActivationFunction::HardSwish); +} + +// TanH +TEST_CASE("RefTanHEndToEndTestFloat32") +{ + ActivationEndToEndTest(defaultBackends, ActivationFunction::TanH, 1.f, 0, 2, 3); +} + +TEST_CASE("RefTanHEndToEndTestFloat16") +{ + ActivationEndToEndTest(defaultBackends, ActivationFunction::TanH, 1.f, 0, 2, 3); +} + +TEST_CASE("RefTanHEndToEndTestQAsymmS8") +{ + ActivationEndToEndTest(defaultBackends, ActivationFunction::TanH, 1.f, 0, 3, 2); +} + +TEST_CASE("RefTanHEndToEndTestQAsymmU8") +{ + ActivationEndToEndTest(defaultBackends, ActivationFunction::TanH, 1.f, 0, 3, 2); +} + +TEST_CASE("RefTanHEndToEndTestQSymmS16") +{ + ActivationEndToEndTest(defaultBackends, ActivationFunction::TanH, 1.f, 0, 3, 2); } // LogSoftmax @@ -1084,6 +1242,7 @@ TEST_CASE("RefLogSoftmaxEndToEndTest") LogSoftmaxEndToEndTest(defaultBackends); } +// Prelu TEST_CASE("RefPreluEndToEndTestFloat32") { PreluEndToEndNegativeTest(defaultBackends); diff --git a/src/backends/tosaCommon/test/OneToManyMappingTests.cpp b/src/backends/tosaCommon/test/OneToManyMappingTests.cpp index dde4d79392..cc129f3e14 100644 --- a/src/backends/tosaCommon/test/OneToManyMappingTests.cpp +++ b/src/backends/tosaCommon/test/OneToManyMappingTests.cpp @@ -197,14 +197,15 @@ static std::vector tosaDefaultBackends = { "TosaRef" }; TEST_CASE("GetTosaMapping_ActivationFloat32") { - LeakyReluEndToEndTest(tosaDefaultBackends); + ActivationEndToEndTest(tosaDefaultBackends, ActivationFunction::LeakyReLu, 1.f, 0, 0.01f); } -TEST_CASE("GetTosaMapping_ActivationFloat16") +TEST_CASE("UNSUPPORTED_GetTosaMapping_ActivationFloat16") { try { - LeakyReluEndToEndTest(tosaDefaultBackends); + ActivationEndToEndTest(tosaDefaultBackends, ActivationFunction::LeakyReLu, 1.f, 0, 0.01f); + FAIL("An exception should have been thrown"); } catch (armnn::Exception& e) { @@ -214,24 +215,25 @@ TEST_CASE("GetTosaMapping_ActivationFloat16") TEST_CASE("GetTosaMapping_ActivationInt32") { - LeakyReluEndToEndTest(tosaDefaultBackends, 0.15f, 0); + ActivationEndToEndTest(tosaDefaultBackends, ActivationFunction::LeakyReLu, 0.15f, 0, 0.01f); } TEST_CASE("GetTosaMapping_ActivationInt16") { - LeakyReluEndToEndTest(tosaDefaultBackends, 0.35f, 0); + ActivationEndToEndTest(tosaDefaultBackends, ActivationFunction::LeakyReLu, 0.35f, 0, 0.01f); } TEST_CASE("GetTosaMapping_ActivationInt8") { - LeakyReluEndToEndTest(tosaDefaultBackends, 0.75f, 0); + ActivationEndToEndTest(tosaDefaultBackends, ActivationFunction::LeakyReLu, 0.75f, 0, 0.01f); } -TEST_CASE("GetTosaMapping_ActivationUInt8") +TEST_CASE("UNSUPPORTED_GetTosaMapping_ActivationUInt8") { try { - LeakyReluEndToEndTest(tosaDefaultBackends); + ActivationEndToEndTest(tosaDefaultBackends, ActivationFunction::LeakyReLu, 1.f, 0, 0.01f); + FAIL("An exception should have been thrown"); } catch (armnn::Exception& e) { -- cgit v1.2.1