From 07f2121feeeeae36a7e67eeb8a6965df63b848f3 Mon Sep 17 00:00:00 2001 From: Francis Murtagh Date: Tue, 23 Jul 2019 09:50:50 +0100 Subject: IVGCVSW-3536 Add Axis parameter to reference Softmax implementation * Add Axis parameter to Softmax Descriptor * Add new reference implementation for Softmax using Axis parameter * Add unit tests to cover each Axis Change-Id: Iafac2275d2212337456f2b1b56b0f76f77fb9543 Signed-off-by: Francis Murtagh --- .../backendsCommon/test/SoftmaxTestImpl.hpp | 99 ++++++++++++++++++---- 1 file changed, 82 insertions(+), 17 deletions(-) (limited to 'src/backends/backendsCommon/test/SoftmaxTestImpl.hpp') diff --git a/src/backends/backendsCommon/test/SoftmaxTestImpl.hpp b/src/backends/backendsCommon/test/SoftmaxTestImpl.hpp index 8081950ab8..983a53be9c 100644 --- a/src/backends/backendsCommon/test/SoftmaxTestImpl.hpp +++ b/src/backends/backendsCommon/test/SoftmaxTestImpl.hpp @@ -25,7 +25,9 @@ LayerTestResult SimpleSoftmaxBaseTestImpl( const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, float beta, const armnn::TensorShape& inputShape, - const std::vector& outputData) + const std::vector& outputData, + const std::vector& inputData, + int axis = 1) { using std::exp; @@ -47,16 +49,14 @@ LayerTestResult SimpleSoftmaxBaseTestImpl( // Each row is independently softmax'd. auto input = MakeTensor(inputTensorInfo, std::vector( - QuantizedVector(qScale, qOffset, { - 0.f, 1.f, 0.f, 0.f, - .5f, 0.f, 0.f, 0.f, - }))); + QuantizedVector(qScale, qOffset, inputData))); std::unique_ptr inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo); std::unique_ptr outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo); armnn::SoftmaxQueueDescriptor data; data.m_Parameters.m_Beta = beta; + data.m_Parameters.m_Axis = axis; armnn::WorkloadInfo info; AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get()); @@ -100,33 +100,98 @@ LayerTestResult SimpleSoftmaxTestImpl( const std::vector outputData = { x0[0] / sum0, x0[1] / sum0, x0[2] / sum0, x0[3] / sum0, x1[0] / sum1, x1[1] / sum1, x1[2] / sum1, x1[3] / sum1 }; - return SimpleSoftmaxBaseTestImpl(workloadFactory, memoryManager, beta, inputShape, outputData); + const std::vector inputData = + { + 0.f, 1.f, 0.f, 0.f, + .5f, 0.f, 0.f, 0.f, + }; + + return SimpleSoftmaxBaseTestImpl(workloadFactory, memoryManager, beta, + inputShape, outputData, inputData); +} + +template> +LayerTestResult SimpleSoftmaxTestImpl( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + float beta, + int axis) +{ + armnn::TensorShape inputShape; + std::vector inputData; + std::vector outputData; + switch (axis) + { + case -2: + case 0: + { + inputShape = {5, 2}; + + inputData = + { + 17.0f, -1.0f, 16.0f, -2.0f, 15.0f, -3.0f, 14.0f, -4.0f, 1.0f, -17.0f + }; + + outputData = + { + 0.643914213228014f, 0.643914213228014f, 0.236882800924671f, 0.236882800924671f, + 0.087144312427294f, + 0.087144312427294f, 0.032058600957022f, 0.032058600957022f, 7.246299848982885e-08f, + 7.246299848982885e-08f + }; + break; + } + case -1: + case 1: + { + inputShape = {2, 5}; + + inputData = + { + 17.0f, 16.0f, 15.0f, 14.0f, 1.0f, -1.0f, -2.0f, -3.0f, -4.0f, -17.0f + }; + + outputData = + { + 0.643914213228014f, 0.236882800924671f, 0.087144312427294f, 0.032058600957022f, + 7.246299848982885e-08f, + 0.643914213228014f, 0.236882800924671f, 0.087144312427294f, 0.032058600957022f, + 7.246299848982885e-08f + }; + break; + } + } + return SimpleSoftmaxBaseTestImpl(workloadFactory, memoryManager, beta, + inputShape, outputData, inputData, axis); } template> LayerTestResult Simple3dSoftmaxTestImpl( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, - float beta) + float beta, + const armnn::TensorShape& inputShape, + const std::vector& outputData, + const std::vector& inputData, + int axis = 1) { - const armnn::TensorShape inputShape{ 1, 8, 1 }; - const std::vector outputData = { 0.0964599f, 0.26220518f, 0.0964599f, 0.0964599f, - 0.15903549f, 0.0964599f, 0.0964599f, 0.0964599f }; - - return SimpleSoftmaxBaseTestImpl(workloadFactory, memoryManager, beta, inputShape, outputData); + return SimpleSoftmaxBaseTestImpl(workloadFactory, memoryManager, beta, + inputShape, outputData, inputData, axis); } template> LayerTestResult Simple4dSoftmaxTestImpl( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, - float beta) + float beta, + const armnn::TensorShape& inputShape, + const std::vector& outputData, + const std::vector& inputData, + int axis = 1) { - const armnn::TensorShape inputShape{ 1, 8, 1, 1 }; - const std::vector outputData = { 0.0964599f, 0.26220518f, 0.0964599f, 0.0964599f, - 0.15903549f, 0.0964599f, 0.0964599f, 0.0964599f }; - return SimpleSoftmaxBaseTestImpl(workloadFactory, memoryManager, beta, inputShape, outputData); + return SimpleSoftmaxBaseTestImpl(workloadFactory, memoryManager, beta, + inputShape, outputData, inputData, axis); } template> -- cgit v1.2.1