From 5f94124ac11afbbf2d2a4cda539b316964802c76 Mon Sep 17 00:00:00 2001 From: Narumol Prangnawarat Date: Fri, 11 Aug 2023 16:09:26 +0100 Subject: IVGCVSW-7964 Fix UnidirectionalSequenceLstm * Fix incorrect batch size and time size * Fix incorrect time major when max time =1 * Fix incorrect permutation * Fix incorrect scratch buffer * Unit tests Signed-off-by: Narumol Prangnawarat Change-Id: I510fae55528be412a58d020e82bd283852e7800b --- .../classic/src/UnidirectionalSequenceLstm.hpp | 2 +- delegate/opaque/src/UnidirectionalSequenceLstm.hpp | 2 +- delegate/test/UnidirectionalSequenceLstmTest.cpp | 62 +++++++++++++++++----- 3 files changed, 51 insertions(+), 15 deletions(-) (limited to 'delegate') diff --git a/delegate/classic/src/UnidirectionalSequenceLstm.hpp b/delegate/classic/src/UnidirectionalSequenceLstm.hpp index 5fa6bb0260..3529640aa1 100644 --- a/delegate/classic/src/UnidirectionalSequenceLstm.hpp +++ b/delegate/classic/src/UnidirectionalSequenceLstm.hpp @@ -184,7 +184,7 @@ TfLiteStatus VisitUnidirectionalSequenceLstmOperator(DelegateData& delegateData, const armnn::TensorInfo& inputTensorInfo = GetTensorInfoForTfLiteTensor(tfLiteInputTensor); const armnn::TensorInfo& outputTensorInfo = GetTensorInfoForTfLiteTensor(tfLiteOutputTensor, true); - unsigned int batchSize = inputTensorInfo.GetShape()[0]; + unsigned int batchSize = desc.m_TimeMajor ? inputTensorInfo.GetShape()[1] : inputTensorInfo.GetShape()[0]; unsigned int outputSize = outputTensorInfo.GetShape()[2]; unsigned int numUnits = cellStateInInfo.GetShape()[1]; diff --git a/delegate/opaque/src/UnidirectionalSequenceLstm.hpp b/delegate/opaque/src/UnidirectionalSequenceLstm.hpp index 2fd64c0dd0..19a57e87df 100644 --- a/delegate/opaque/src/UnidirectionalSequenceLstm.hpp +++ b/delegate/opaque/src/UnidirectionalSequenceLstm.hpp @@ -226,7 +226,7 @@ TfLiteStatus VisitUnidirectionalSequenceLstmOperator(DelegateData& delegateData, const armnn::TensorInfo& inputTensorInfo = GetTensorInfoForTfLiteOpaqueTensor(tfLiteInputTensor); const armnn::TensorInfo& outputTensorInfo = GetTensorInfoForTfLiteOpaqueTensor(tfLiteOutputTensor, true); - unsigned int batchSize = inputTensorInfo.GetShape()[0]; + unsigned int batchSize = desc.m_TimeMajor ? inputTensorInfo.GetShape()[1] : inputTensorInfo.GetShape()[0]; unsigned int outputSize = outputTensorInfo.GetShape()[2]; unsigned int numUnits = cellStateInInfo.GetShape()[1]; diff --git a/delegate/test/UnidirectionalSequenceLstmTest.cpp b/delegate/test/UnidirectionalSequenceLstmTest.cpp index 6d896d7d5d..7fd43fc0d6 100644 --- a/delegate/test/UnidirectionalSequenceLstmTest.cpp +++ b/delegate/test/UnidirectionalSequenceLstmTest.cpp @@ -157,10 +157,12 @@ void UnidirectionalSequenceLstmTest(std::vector& backends) isTimeMajor); } -void UnidirectionalSequenceLstmTimeMajorTest(std::vector& backends) +void UnidirectionalSequenceLstmTimeMajorTestImpl(std::vector& backends, + int32_t timeSize, + std::vector& inputValues, + std::vector& expectedOutputValues) { int32_t batchSize = 3; - int32_t timeSize = 2; int32_t inputSize = 3; int32_t outputSize = 4; // cellSize and outputSize have the same size when there is no projection. @@ -243,16 +245,6 @@ void UnidirectionalSequenceLstmTimeMajorTest(std::vector& back bool hasOutputLayerNormWeights = false; std::vector outputLayerNormWeights; - std::vector inputValues = { 1., 2., 3., 4., 5., 4., - 3., 2., 1., 2., 3., 4., - 5., 4., 3., 2., 1., 2. }; - std::vector expectedOutputValues = { 0.135658f, 0.124673f, 0.021209f, -0.0530204f, - 0.106138f, 0.0404792f, 0.0151644f, -0.00675166f, - -0.0128514f, 0.0644884f, 0.0709072f, -0.0454045f, - 0.162886f, 0.166494f, 0.0277046f, -0.0369807f, - 0.111716f, 0.043119f, 0.0762981f, -0.0122854f, - 0.104397f, 0.2144f, 0.119192f, -0.0839058f }; - tflite::ActivationFunctionType activationFunction = tflite::ActivationFunctionType_TANH; float clippingThresCell = 10.f; float clippingThresProj = 0.f; @@ -303,7 +295,45 @@ void UnidirectionalSequenceLstmTimeMajorTest(std::vector& back activationFunction, clippingThresCell, clippingThresProj, - isTimeMajor); + isTimeMajor);} + +void UnidirectionalSequenceLstmTimeMajorTest(std::vector& backends) +{ + int32_t timeSize = 2; + + std::vector inputValues = { 1., 2., 3., 4., 5., 4., + 3., 2., 1., 2., 3., 4., + 5., 4., 3., 2., 1., 2. }; + + std::vector expectedOutputValues = { 0.135658f, 0.124673f, 0.021209f, -0.0530204f, + 0.106138f, 0.0404792f, 0.0151644f, -0.00675166f, + -0.0128514f, 0.0644884f, 0.0709072f, -0.0454045f, + 0.162886f, 0.166494f, 0.0277046f, -0.0369807f, + 0.111716f, 0.043119f, 0.0762981f, -0.0122854f, + 0.104397f, 0.2144f, 0.119192f, -0.0839058f }; + + UnidirectionalSequenceLstmTimeMajorTestImpl(backends, + timeSize, + inputValues, + expectedOutputValues); +} + +void UnidirectionalSequenceLstmTimeMajorSingleTimeTest(std::vector& backends) +{ + int32_t timeSize = 1; + + std::vector inputValues = { 1., 2., 3., + 4., 5., 6., + 7., 8., 9. }; + + std::vector expectedOutputValues = { 0.13565768f, 0.12467254f, 0.02120903f, -0.05302038f, + 0.1053334f, 0.08508634f, 0.00667238f, -0.00356043f, + 0.05638668f, 0.02924093f, 0.00119751f, -0.00017249f }; + + UnidirectionalSequenceLstmTimeMajorTestImpl(backends, + timeSize, + inputValues, + expectedOutputValues); } void UnidirectionalSequenceLstmNoCifgWithPeepholeWithProjectionTest(std::vector& backends) @@ -1411,6 +1441,12 @@ TEST_CASE ("UnidirectionalSequenceLstmTimeMajorTest_CpuRef_Test") UnidirectionalSequenceLstmTimeMajorTest(backends); } +TEST_CASE ("UnidirectionalSequenceLstmTimeMajorSingleTimeTest_CpuRef_Test") +{ + std::vector backends = {armnn::Compute::CpuRef}; + UnidirectionalSequenceLstmTimeMajorSingleTimeTest(backends); +} + TEST_CASE ("UnidirectionalSequenceLstmNoCifgWithPeepholeWithProjectionTest_CpuRef_Test") { std::vector backends = {armnn::Compute::CpuRef}; -- cgit v1.2.1