From 1299496996bc332f02218f926640a9255ed60310 Mon Sep 17 00:00:00 2001 From: Mike Kelly Date: Thu, 21 Apr 2022 11:57:09 +0100 Subject: IVGCVSW-6806 Add Unidirectional Sequence Lstm support to Neon * Corrected TensorInfo order for IsUnidirectionalSequenceLstmSupported * outputStateOut TensorInfo is not optional. * cellStateOut TensorInfo is not optional. * TensorInfo Order matches other QLSTM/LSTM layers. * Added missing parameters to UnidirectionalSequenceLstmOperator for delegate. * Added quantized UnidirectionalSequenceLstm support to Neon !android-nn-driver:7457 Signed-off-by: Mike Kelly Change-Id: I26dde1bb96793dd25eb9081ca5ae5f63752288c4 --- .../UnidirectionalSequenceLstmTestImpl.cpp | 175 +++++++++++++++++++-- 1 file changed, 166 insertions(+), 9 deletions(-) (limited to 'src/backends/backendsCommon/test/layerTests/UnidirectionalSequenceLstmTestImpl.cpp') diff --git a/src/backends/backendsCommon/test/layerTests/UnidirectionalSequenceLstmTestImpl.cpp b/src/backends/backendsCommon/test/layerTests/UnidirectionalSequenceLstmTestImpl.cpp index c719472711..6effa9c85d 100644 --- a/src/backends/backendsCommon/test/layerTests/UnidirectionalSequenceLstmTestImpl.cpp +++ b/src/backends/backendsCommon/test/layerTests/UnidirectionalSequenceLstmTestImpl.cpp @@ -31,7 +31,7 @@ UnidirectionalSequenceLstmTimeMajorSingleBatchTestImpl( armnn::DataType constantDataType = armnn::DataType::Float32) { IgnoreUnused(memoryManager); - unsigned int batchSize = armnn::numeric_cast(inputShape[1]); + unsigned int batchSize = armnn::numeric_cast(inputShape[0]); unsigned int inputSize = armnn::numeric_cast(inputShape[2]); unsigned int outputSize = armnn::numeric_cast(outputExpectedShape[2]); unsigned numUnits = outputSize; @@ -39,7 +39,8 @@ UnidirectionalSequenceLstmTimeMajorSingleBatchTestImpl( armnn::TensorInfo inputTensorInfo({1, batchSize , inputSize}, ArmnnType, qScale, qOffset ); armnn::TensorInfo cellStateInTensorInfo({batchSize , numUnits}, ArmnnType, qScale, qOffset); armnn::TensorInfo outputStateInTensorInfo({batchSize , outputSize}, ArmnnType, qScale, qOffset); - + armnn::TensorInfo outputStateOutTensorInfo({ batchSize, 1, outputSize }, ArmnnType, qScale, qOffset); + armnn::TensorInfo cellStateOutTensorInfo({ batchSize, 1, outputSize }, ArmnnType, qScale, qOffset); armnn::TensorInfo outputTensorInfo({1, batchSize, outputSize}, ArmnnType, qScale, qOffset); std::vector inputVector; @@ -48,6 +49,8 @@ UnidirectionalSequenceLstmTimeMajorSingleBatchTestImpl( std::vector cellStateInVector(batchSize * numUnits, T()); std::vector outputStateInVector(batchSize * outputSize, T()); + std::vector actualOutputStateOut(outputStateOutTensorInfo.GetNumElements()); + std::vector actualCellStateOut(cellStateOutTensorInfo.GetNumElements()); std::vector actualOutput(outputTensorInfo.GetNumElements()); std::vector outputVector; @@ -59,6 +62,10 @@ UnidirectionalSequenceLstmTimeMajorSingleBatchTestImpl( std::unique_ptr outputStateInHandle = tensorHandleFactory.CreateTensorHandle(outputStateInTensorInfo); + std::unique_ptr outputStateOutHandle = + tensorHandleFactory.CreateTensorHandle(outputStateOutTensorInfo); + std::unique_ptr cellStateOutHandle = + tensorHandleFactory.CreateTensorHandle(cellStateOutTensorInfo); std::unique_ptr outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo); armnn::UnidirectionalSequenceLstmQueueDescriptor data; @@ -68,6 +75,8 @@ UnidirectionalSequenceLstmTimeMajorSingleBatchTestImpl( AddInputToWorkload(data, info, outputStateInTensorInfo, outputStateInHandle.get()); AddInputToWorkload(data, info, cellStateInTensorInfo, cellStateInHandle.get()); + AddOutputToWorkload(data, info, outputStateOutTensorInfo, outputStateOutHandle.get()); + AddOutputToWorkload(data, info, cellStateOutTensorInfo, cellStateOutHandle.get()); AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get()); armnn::TensorInfo tensorInfo4({numUnits}, constantDataType , qScale, qOffset); @@ -184,6 +193,8 @@ UnidirectionalSequenceLstmTimeMajorSingleBatchTestImpl( outputStateInHandle->Allocate(); cellStateInHandle->Allocate(); + outputStateOutHandle->Allocate(); + cellStateOutHandle->Allocate(); outputHandle->Allocate(); CopyDataToITensorHandle(inputHandle.get(), inputVector.data()); @@ -192,6 +203,8 @@ UnidirectionalSequenceLstmTimeMajorSingleBatchTestImpl( workload->Execute(); + CopyDataFromITensorHandle(actualOutputStateOut.data(), outputStateOutHandle.get()); + CopyDataFromITensorHandle(actualCellStateOut.data(), cellStateOutHandle.get()); CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get()); return LayerTestResult(actualOutput, @@ -222,7 +235,8 @@ LayerTestResult UnidirectionalSequenceLstmLayerFloat32TestImpl( armnn::TensorInfo inputTensorInfo({batchSize, timeSize, inputSize}, ArmnnType, qScale, qOffset); armnn::TensorInfo cellStateInTensorInfo({batchSize, numUnits}, ArmnnType, qScale, qOffset); armnn::TensorInfo outputStateInTensorInfo({batchSize, outputSize}, ArmnnType, qScale, qOffset); - + armnn::TensorInfo outputStateOutTensorInfo({batchSize, timeSize, outputSize}, ArmnnType, qScale, qOffset); + armnn::TensorInfo cellStateOutTensorInfo({batchSize, timeSize, outputSize}, ArmnnType, qScale, qOffset); armnn::TensorInfo outputTensorInfo({batchSize, timeSize, outputSize}, ArmnnType, qScale, qOffset); std::vector inputVector; @@ -231,6 +245,8 @@ LayerTestResult UnidirectionalSequenceLstmLayerFloat32TestImpl( std::vector cellStateInVector(batchSize * numUnits, T()); std::vector outputStateInVector(batchSize * outputSize, T()); + std::vector actualOutputStateOut(outputStateOutTensorInfo.GetNumElements()); + std::vector actualCellStateOut(cellStateOutTensorInfo.GetNumElements()); std::vector actualOutput(outputTensorInfo.GetNumElements()); std::vector outputVector; @@ -242,6 +258,10 @@ LayerTestResult UnidirectionalSequenceLstmLayerFloat32TestImpl( std::unique_ptr outputStateInHandle = tensorHandleFactory.CreateTensorHandle(outputStateInTensorInfo); + std::unique_ptr outputStateOutHandle = + tensorHandleFactory.CreateTensorHandle(outputStateOutTensorInfo); + std::unique_ptr cellStateOutHandle = + tensorHandleFactory.CreateTensorHandle(cellStateOutTensorInfo); std::unique_ptr outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo); armnn::UnidirectionalSequenceLstmQueueDescriptor data; @@ -251,6 +271,8 @@ LayerTestResult UnidirectionalSequenceLstmLayerFloat32TestImpl( AddInputToWorkload(data, info, outputStateInTensorInfo, outputStateInHandle.get()); AddInputToWorkload(data, info, cellStateInTensorInfo, cellStateInHandle.get()); + AddOutputToWorkload(data, info, outputStateOutTensorInfo, outputStateOutHandle.get()); + AddOutputToWorkload(data, info, cellStateOutTensorInfo, cellStateOutHandle.get()); AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get()); armnn::TensorInfo tensorInfo4({numUnits}, constantDataType, qScale, qOffset); @@ -359,6 +381,8 @@ LayerTestResult UnidirectionalSequenceLstmLayerFloat32TestImpl( outputStateInHandle->Allocate(); cellStateInHandle->Allocate(); + outputStateOutHandle->Allocate(); + cellStateOutHandle->Allocate(); outputHandle->Allocate(); CopyDataToITensorHandle(inputHandle.get(), inputVector.data()); @@ -367,6 +391,8 @@ LayerTestResult UnidirectionalSequenceLstmLayerFloat32TestImpl( workload->Execute(); + CopyDataFromITensorHandle(actualOutputStateOut.data(), outputStateOutHandle.get()); + CopyDataFromITensorHandle(actualCellStateOut.data(), cellStateOutHandle.get()); CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get()); return LayerTestResult(actualOutput, @@ -398,7 +424,8 @@ UnidirectionalSequenceLstmLayerFloat32TimeMajorTestImpl( armnn::TensorInfo inputTensorInfo({timeSize, batchSize, inputSize}, ArmnnType, qScale, qOffset); armnn::TensorInfo cellStateInTensorInfo({batchSize, numUnits}, ArmnnType, qScale, qOffset); armnn::TensorInfo outputStateInTensorInfo({batchSize, outputSize}, ArmnnType, qScale, qOffset); - + armnn::TensorInfo outputStateOutTensorInfo({batchSize, timeSize, outputSize}, armnn::DataType::Float32); + armnn::TensorInfo cellStateOutTensorInfo({batchSize, timeSize, outputSize}, armnn::DataType::Float32); armnn::TensorInfo outputTensorInfo({timeSize, batchSize, outputSize}, ArmnnType, qScale, qOffset); std::vector inputVector; @@ -407,6 +434,8 @@ UnidirectionalSequenceLstmLayerFloat32TimeMajorTestImpl( std::vector cellStateInVector(batchSize * numUnits, T()); std::vector outputStateInVector(batchSize * outputSize, T()); + std::vector actualOutputStateOut(outputStateOutTensorInfo.GetNumElements()); + std::vector actualCellStateOut(cellStateOutTensorInfo.GetNumElements()); std::vector actualOutput(outputTensorInfo.GetNumElements()); std::vector outputVector; @@ -418,6 +447,10 @@ UnidirectionalSequenceLstmLayerFloat32TimeMajorTestImpl( std::unique_ptr outputStateInHandle = tensorHandleFactory.CreateTensorHandle(outputStateInTensorInfo); + std::unique_ptr outputStateOutHandle = + tensorHandleFactory.CreateTensorHandle(outputStateOutTensorInfo); + std::unique_ptr cellStateOutHandle = + tensorHandleFactory.CreateTensorHandle(cellStateOutTensorInfo); std::unique_ptr outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo); armnn::UnidirectionalSequenceLstmQueueDescriptor data; @@ -427,6 +460,8 @@ UnidirectionalSequenceLstmLayerFloat32TimeMajorTestImpl( AddInputToWorkload(data, info, outputStateInTensorInfo, outputStateInHandle.get()); AddInputToWorkload(data, info, cellStateInTensorInfo, cellStateInHandle.get()); + AddOutputToWorkload(data, info, outputStateOutTensorInfo, outputStateOutHandle.get()); + AddOutputToWorkload(data, info, cellStateOutTensorInfo, cellStateOutHandle.get()); AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get()); armnn::TensorInfo tensorInfo4({numUnits}, constantDataType, qScale, qOffset); @@ -535,6 +570,8 @@ UnidirectionalSequenceLstmLayerFloat32TimeMajorTestImpl( outputStateInHandle->Allocate(); cellStateInHandle->Allocate(); + outputStateOutHandle->Allocate(); + cellStateOutHandle->Allocate(); outputHandle->Allocate(); CopyDataToITensorHandle(inputHandle.get(), inputVector.data()); @@ -543,6 +580,8 @@ UnidirectionalSequenceLstmLayerFloat32TimeMajorTestImpl( workload->Execute(); + CopyDataFromITensorHandle(actualOutputStateOut.data(), outputStateOutHandle.get()); + CopyDataFromITensorHandle(actualCellStateOut.data(), cellStateOutHandle.get()); CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get()); return LayerTestResult(actualOutput, @@ -644,6 +683,8 @@ LayerTestResult UnidirectionalSequenceLstmLayerNoCifgWithPeepholeWithP armnn::TensorInfo inputTensorInfo({batchSize, timeSize, inputSize}, armnn::DataType::Float32); armnn::TensorInfo cellStateInTensorInfo({batchSize , numUnits}, armnn::DataType::Float32); armnn::TensorInfo outputStateInTensorInfo({batchSize , outputSize}, armnn::DataType::Float32); + armnn::TensorInfo outputStateOutTensorInfo({batchSize, timeSize, outputSize}, armnn::DataType::Float32); + armnn::TensorInfo cellStateOutTensorInfo({batchSize, timeSize, outputSize}, armnn::DataType::Float32); armnn::TensorInfo outputTensorInfo({batchSize, timeSize, outputSize}, armnn::DataType::Float32); const std::vector inputVector = { 1., 2., 3., 4., 5., 4., @@ -654,6 +695,8 @@ LayerTestResult UnidirectionalSequenceLstmLayerNoCifgWithPeepholeWithP std::vector cellStateInVector(batchSize * numUnits, 0.f); std::vector outputStateInVector(batchSize * outputSize, 0.f); + std::vector actualOutputStateOut(outputStateOutTensorInfo.GetNumElements()); + std::vector actualCellStateOut(cellStateOutTensorInfo.GetNumElements()); std::vector actualOutput(outputTensorInfo.GetNumElements()); const std::vector expectedOutput = { -0.0135612f, -0.0263441f, 0.0314008f, -0.00883455f, 0.00763052f, @@ -668,6 +711,11 @@ LayerTestResult UnidirectionalSequenceLstmLayerNoCifgWithPeepholeWithP tensorHandleFactory.CreateTensorHandle(cellStateInTensorInfo); std::unique_ptr outputStateInHandle = tensorHandleFactory.CreateTensorHandle(outputStateInTensorInfo); + + std::unique_ptr outputStateOutHandle = + tensorHandleFactory.CreateTensorHandle(outputStateOutTensorInfo); + std::unique_ptr cellStateOutHandle = + tensorHandleFactory.CreateTensorHandle(cellStateOutTensorInfo); std::unique_ptr outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo); armnn::UnidirectionalSequenceLstmQueueDescriptor data; @@ -676,6 +724,9 @@ LayerTestResult UnidirectionalSequenceLstmLayerNoCifgWithPeepholeWithP AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get()); AddInputToWorkload(data, info, outputStateInTensorInfo, outputStateInHandle.get()); AddInputToWorkload(data, info, cellStateInTensorInfo, cellStateInHandle.get()); + + AddOutputToWorkload(data, info, outputStateOutTensorInfo, outputStateOutHandle.get()); + AddOutputToWorkload(data, info, cellStateOutTensorInfo, cellStateOutHandle.get()); AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get()); armnn::TensorInfo tensorInfo5({outputSize}, armnn::DataType::Float32); @@ -849,6 +900,9 @@ LayerTestResult UnidirectionalSequenceLstmLayerNoCifgWithPeepholeWithP inputHandle->Allocate(); outputStateInHandle->Allocate(); cellStateInHandle->Allocate(); + + outputStateOutHandle->Allocate(); + cellStateOutHandle->Allocate(); outputHandle->Allocate(); CopyDataToITensorHandle(inputHandle.get(), inputVector.data()); @@ -857,6 +911,8 @@ LayerTestResult UnidirectionalSequenceLstmLayerNoCifgWithPeepholeWithP workload->Execute(); + CopyDataFromITensorHandle(actualOutputStateOut.data(), outputStateOutHandle.get()); + CopyDataFromITensorHandle(actualCellStateOut.data(), cellStateOutHandle.get()); CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get()); return LayerTestResult(actualOutput, @@ -880,6 +936,8 @@ LayerTestResult UnidirectionalSequenceLstmLayerNoCifgWithPeepholeWithP armnn::TensorInfo inputTensorInfo({batchSize, timeSize, inputSize}, armnn::DataType::Float32); armnn::TensorInfo cellStateInTensorInfo({batchSize , numUnits}, armnn::DataType::Float32); armnn::TensorInfo outputStateInTensorInfo({batchSize , outputSize}, armnn::DataType::Float32); + armnn::TensorInfo outputStateOutTensorInfo({batchSize, timeSize, outputSize}, armnn::DataType::Float32); + armnn::TensorInfo cellStateOutTensorInfo({batchSize, timeSize, outputSize}, armnn::DataType::Float32); armnn::TensorInfo outputTensorInfo({batchSize, timeSize, outputSize}, armnn::DataType::Float32); const std::vector inputVector = { 1., 2., 3., 4., 5., 4., @@ -889,6 +947,8 @@ LayerTestResult UnidirectionalSequenceLstmLayerNoCifgWithPeepholeWithP std::vector cellStateInVector(batchSize * numUnits, 0.f); std::vector outputStateInVector(batchSize * outputSize, 0.f); + std::vector actualOutputStateOut(outputStateOutTensorInfo.GetNumElements()); + std::vector actualCellStateOut(cellStateOutTensorInfo.GetNumElements()); std::vector actualOutput(outputTensorInfo.GetNumElements()); const std::vector expectedOutput = { 0.0642256f, 0.0343966f, 0.184122f, 0.114717f, @@ -904,6 +964,10 @@ LayerTestResult UnidirectionalSequenceLstmLayerNoCifgWithPeepholeWithP std::unique_ptr outputStateInHandle = tensorHandleFactory.CreateTensorHandle(outputStateInTensorInfo); + std::unique_ptr outputStateOutHandle = + tensorHandleFactory.CreateTensorHandle(outputStateOutTensorInfo); + std::unique_ptr cellStateOutHandle = + tensorHandleFactory.CreateTensorHandle(cellStateOutTensorInfo); std::unique_ptr outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo); armnn::UnidirectionalSequenceLstmQueueDescriptor data; @@ -913,6 +977,8 @@ LayerTestResult UnidirectionalSequenceLstmLayerNoCifgWithPeepholeWithP AddInputToWorkload(data, info, outputStateInTensorInfo, outputStateInHandle.get()); AddInputToWorkload(data, info, cellStateInTensorInfo, cellStateInHandle.get()); + AddOutputToWorkload(data, info, outputStateOutTensorInfo, outputStateOutHandle.get()); + AddOutputToWorkload(data, info, cellStateOutTensorInfo, cellStateOutHandle.get()); AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get()); armnn::TensorInfo tensorInfo4({outputSize}, armnn::DataType::Float32); @@ -1074,6 +1140,9 @@ LayerTestResult UnidirectionalSequenceLstmLayerNoCifgWithPeepholeWithP inputHandle->Allocate(); outputStateInHandle->Allocate(); cellStateInHandle->Allocate(); + + outputStateOutHandle->Allocate(); + cellStateOutHandle->Allocate(); outputHandle->Allocate(); CopyDataToITensorHandle(inputHandle.get(), inputVector.data()); @@ -1082,6 +1151,8 @@ LayerTestResult UnidirectionalSequenceLstmLayerNoCifgWithPeepholeWithP workload->Execute(); + CopyDataFromITensorHandle(actualOutputStateOut.data(), outputStateOutHandle.get()); + CopyDataFromITensorHandle(actualCellStateOut.data(), cellStateOutHandle.get()); CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get()); return LayerTestResult(actualOutput, @@ -1105,7 +1176,8 @@ LayerTestResult UnidirectionalSequenceLstmWithCifgWithPeepholeNoProjec armnn::TensorInfo inputTensorInfo({batchSize, timeSize, inputSize}, armnn::DataType::Float32); armnn::TensorInfo cellStateInTensorInfo({batchSize, numUnits}, armnn::DataType::Float32); armnn::TensorInfo outputStateInTensorInfo({batchSize, outputSize}, armnn::DataType::Float32); - + armnn::TensorInfo outputStateOutTensorInfo({batchSize, timeSize, outputSize}, armnn::DataType::Float32); + armnn::TensorInfo cellStateOutTensorInfo({batchSize, timeSize, outputSize}, armnn::DataType::Float32); armnn::TensorInfo outputTensorInfo({batchSize, timeSize, outputSize}, armnn::DataType::Float32); std::vector inputVector = { 1., 2., 3., 4., 5., 4., @@ -1115,6 +1187,8 @@ LayerTestResult UnidirectionalSequenceLstmWithCifgWithPeepholeNoProjec std::vector cellStateInVector(batchSize * numUnits, 0.f); std::vector outputStateInVector(batchSize * outputSize, 0.f); + std::vector actualOutputStateOut(outputStateOutTensorInfo.GetNumElements()); + std::vector actualCellStateOut(cellStateOutTensorInfo.GetNumElements()); std::vector actualOutput(outputTensorInfo.GetNumElements()); std::vector outputVector = { -0.0129257f, -0.070531f, -0.153508f, -0.0392391f, @@ -1130,6 +1204,10 @@ LayerTestResult UnidirectionalSequenceLstmWithCifgWithPeepholeNoProjec std::unique_ptr outputStateInHandle = tensorHandleFactory.CreateTensorHandle(outputStateInTensorInfo); + std::unique_ptr outputStateOutHandle = + tensorHandleFactory.CreateTensorHandle(outputStateOutTensorInfo); + std::unique_ptr cellStateOutHandle = + tensorHandleFactory.CreateTensorHandle(cellStateOutTensorInfo); std::unique_ptr outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo); armnn::UnidirectionalSequenceLstmQueueDescriptor data; @@ -1139,6 +1217,8 @@ LayerTestResult UnidirectionalSequenceLstmWithCifgWithPeepholeNoProjec AddInputToWorkload(data, info, outputStateInTensorInfo, outputStateInHandle.get()); AddInputToWorkload(data, info, cellStateInTensorInfo, cellStateInHandle.get()); + AddOutputToWorkload(data, info, outputStateOutTensorInfo, outputStateOutHandle.get()); + AddOutputToWorkload(data, info, cellStateOutTensorInfo, cellStateOutHandle.get()); AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get()); armnn::TensorInfo tensorInfo4({numUnits}, armnn::DataType::Float32); @@ -1236,6 +1316,8 @@ LayerTestResult UnidirectionalSequenceLstmWithCifgWithPeepholeNoProjec outputStateInHandle->Allocate(); cellStateInHandle->Allocate(); + outputStateOutHandle->Allocate(); + cellStateOutHandle->Allocate(); outputHandle->Allocate(); CopyDataToITensorHandle(inputHandle.get(), inputVector.data()); @@ -1244,6 +1326,8 @@ LayerTestResult UnidirectionalSequenceLstmWithCifgWithPeepholeNoProjec workload->Execute(); + CopyDataFromITensorHandle(actualOutputStateOut.data(), outputStateOutHandle.get()); + CopyDataFromITensorHandle(actualCellStateOut.data(), cellStateOutHandle.get()); CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get()); return LayerTestResult(actualOutput, @@ -1267,7 +1351,8 @@ LayerTestResult UnidirectionalSequenceLstmLayerInt8Test( armnn::TensorInfo inputTensorInfo({batchSize, timeSize, inputSize}, armnn::DataType::Float32); armnn::TensorInfo cellStateInTensorInfo({batchSize, numUnits}, armnn::DataType::Float32); armnn::TensorInfo outputStateInTensorInfo({batchSize, outputSize}, armnn::DataType::Float32); - + armnn::TensorInfo outputStateOutTensorInfo({batchSize, timeSize, outputSize}, armnn::DataType::Float32); + armnn::TensorInfo cellStateOutTensorInfo({batchSize, timeSize, outputSize}, armnn::DataType::Float32); armnn::TensorInfo outputTensorInfo({batchSize, timeSize, outputSize}, armnn::DataType::Float32); const std::vector inputVector = { 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.4f, @@ -1277,6 +1362,8 @@ LayerTestResult UnidirectionalSequenceLstmLayerInt8Test( std::vector cellStateInVector(batchSize * numUnits, 0.f); std::vector outputStateInVector(batchSize * outputSize, 0.f); + std::vector actualOutputStateOut(outputStateOutTensorInfo.GetNumElements()); + std::vector actualCellStateOut(cellStateOutTensorInfo.GetNumElements()); std::vector actualOutput(outputTensorInfo.GetNumElements()); const std::vector outputVector = { -0.0142517f, -0.0198845f, -0.0120569f, -0.0116868f, @@ -1292,8 +1379,13 @@ LayerTestResult UnidirectionalSequenceLstmLayerInt8Test( std::unique_ptr outputStateInHandle = tensorHandleFactory.CreateTensorHandle(outputStateInTensorInfo); + std::unique_ptr outputStateOutHandle = + tensorHandleFactory.CreateTensorHandle(outputStateOutTensorInfo); + std::unique_ptr cellStateOutHandle = + tensorHandleFactory.CreateTensorHandle(cellStateOutTensorInfo); std::unique_ptr outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo); + armnn::UnidirectionalSequenceLstmQueueDescriptor data; armnn::WorkloadInfo info; @@ -1301,6 +1393,8 @@ LayerTestResult UnidirectionalSequenceLstmLayerInt8Test( AddInputToWorkload(data, info, outputStateInTensorInfo, outputStateInHandle.get()); AddInputToWorkload(data, info, cellStateInTensorInfo, cellStateInHandle.get()); + AddOutputToWorkload(data, info, outputStateOutTensorInfo, outputStateOutHandle.get()); + AddOutputToWorkload(data, info, cellStateOutTensorInfo, cellStateOutHandle.get()); AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get()); armnn::TensorInfo tensorInfoNumFp({numUnits}, armnn::DataType::Float32); @@ -1376,6 +1470,8 @@ LayerTestResult UnidirectionalSequenceLstmLayerInt8Test( outputStateInHandle->Allocate(); cellStateInHandle->Allocate(); + outputStateOutHandle->Allocate(); + cellStateOutHandle->Allocate(); outputHandle->Allocate(); CopyDataToITensorHandle(inputHandle.get(), inputVector.data()); @@ -1384,6 +1480,8 @@ LayerTestResult UnidirectionalSequenceLstmLayerInt8Test( workload->Execute(); + CopyDataFromITensorHandle(actualOutputStateOut.data(), outputStateOutHandle.get()); + CopyDataFromITensorHandle(actualCellStateOut.data(), cellStateOutHandle.get()); CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get()); return LayerTestResult(actualOutput, @@ -1407,7 +1505,8 @@ LayerTestResult UnidirectionalSequenceLstmLayerInt8TimeMajorTest( armnn::TensorInfo inputTensorInfo({timeSize, batchSize, inputSize}, armnn::DataType::Float32); armnn::TensorInfo cellStateInTensorInfo({batchSize, numUnits}, armnn::DataType::Float32); armnn::TensorInfo outputStateInTensorInfo({batchSize, outputSize}, armnn::DataType::Float32); - + armnn::TensorInfo outputStateOutTensorInfo({batchSize, timeSize, outputSize}, armnn::DataType::Float32); + armnn::TensorInfo cellStateOutTensorInfo({batchSize, timeSize, outputSize}, armnn::DataType::Float32); armnn::TensorInfo outputTensorInfo({timeSize, batchSize, outputSize}, armnn::DataType::Float32); const std::vector inputVector = { 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.4f, @@ -1417,6 +1516,8 @@ LayerTestResult UnidirectionalSequenceLstmLayerInt8TimeMajorTest( std::vector cellStateInVector(batchSize * numUnits, 0.f); std::vector outputStateInVector(batchSize * outputSize, 0.f); + std::vector actualOutputStateOut(outputStateOutTensorInfo.GetNumElements()); + std::vector actualCellStateOut(cellStateOutTensorInfo.GetNumElements()); std::vector actualOutput(outputTensorInfo.GetNumElements()); const std::vector outputVector = { -0.0142517f, -0.0198845f, -0.0120122f, -0.0116868f, @@ -1431,8 +1532,13 @@ LayerTestResult UnidirectionalSequenceLstmLayerInt8TimeMajorTest( std::unique_ptr outputStateInHandle = tensorHandleFactory.CreateTensorHandle(outputStateInTensorInfo); + std::unique_ptr outputStateOutHandle = + tensorHandleFactory.CreateTensorHandle(outputStateOutTensorInfo); + std::unique_ptr cellStateOutHandle = + tensorHandleFactory.CreateTensorHandle(cellStateOutTensorInfo); std::unique_ptr outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo); + armnn::UnidirectionalSequenceLstmQueueDescriptor data; armnn::WorkloadInfo info; @@ -1440,6 +1546,8 @@ LayerTestResult UnidirectionalSequenceLstmLayerInt8TimeMajorTest( AddInputToWorkload(data, info, outputStateInTensorInfo, outputStateInHandle.get()); AddInputToWorkload(data, info, cellStateInTensorInfo, cellStateInHandle.get()); + AddOutputToWorkload(data, info, outputStateOutTensorInfo, outputStateOutHandle.get()); + AddOutputToWorkload(data, info, cellStateOutTensorInfo, cellStateOutHandle.get()); AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get()); armnn::TensorInfo tensorInfoNumFp({numUnits}, armnn::DataType::Float32); @@ -1516,6 +1624,8 @@ LayerTestResult UnidirectionalSequenceLstmLayerInt8TimeMajorTest( outputStateInHandle->Allocate(); cellStateInHandle->Allocate(); + outputStateOutHandle->Allocate(); + cellStateOutHandle->Allocate(); outputHandle->Allocate(); CopyDataToITensorHandle(inputHandle.get(), inputVector.data()); @@ -1524,6 +1634,8 @@ LayerTestResult UnidirectionalSequenceLstmLayerInt8TimeMajorTest( workload->Execute(); + CopyDataFromITensorHandle(actualOutputStateOut.data(), outputStateOutHandle.get()); + CopyDataFromITensorHandle(actualCellStateOut.data(), cellStateOutHandle.get()); CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get()); return LayerTestResult(actualOutput, @@ -1547,6 +1659,8 @@ LayerTestResult UnidirectionalSequenceLstmLayerInt8NoCifgWithPeepholeW armnn::TensorInfo inputTensorInfo({batchSize, timeSize, inputSize}, armnn::DataType::Float32); armnn::TensorInfo cellStateInTensorInfo({batchSize , numUnits}, armnn::DataType::Float32); armnn::TensorInfo outputStateInTensorInfo({batchSize , outputSize}, armnn::DataType::Float32); + armnn::TensorInfo outputStateOutTensorInfo({batchSize, timeSize, outputSize}, armnn::DataType::Float32); + armnn::TensorInfo cellStateOutTensorInfo({batchSize, timeSize, outputSize}, armnn::DataType::Float32); armnn::TensorInfo outputTensorInfo({batchSize, timeSize, outputSize}, armnn::DataType::Float32); const std::vector inputVector = { 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.4f, @@ -1556,6 +1670,8 @@ LayerTestResult UnidirectionalSequenceLstmLayerInt8NoCifgWithPeepholeW std::vector cellStateInVector(batchSize * numUnits, 0.f); std::vector outputStateInVector(batchSize * outputSize, 0.f); + std::vector actualOutputStateOut(outputStateOutTensorInfo.GetNumElements()); + std::vector actualCellStateOut(cellStateOutTensorInfo.GetNumElements()); std::vector actualOutput(outputTensorInfo.GetNumElements()); const std::vector expectedOutput = { 0.612103f, 1.56788f, 0.31966f, 1.42956f, @@ -1570,6 +1686,11 @@ LayerTestResult UnidirectionalSequenceLstmLayerInt8NoCifgWithPeepholeW tensorHandleFactory.CreateTensorHandle(cellStateInTensorInfo); std::unique_ptr outputStateInHandle = tensorHandleFactory.CreateTensorHandle(outputStateInTensorInfo); + + std::unique_ptr outputStateOutHandle = + tensorHandleFactory.CreateTensorHandle(outputStateOutTensorInfo); + std::unique_ptr cellStateOutHandle = + tensorHandleFactory.CreateTensorHandle(cellStateOutTensorInfo); std::unique_ptr outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo); armnn::UnidirectionalSequenceLstmQueueDescriptor data; @@ -1578,6 +1699,9 @@ LayerTestResult UnidirectionalSequenceLstmLayerInt8NoCifgWithPeepholeW AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get()); AddInputToWorkload(data, info, outputStateInTensorInfo, outputStateInHandle.get()); AddInputToWorkload(data, info, cellStateInTensorInfo, cellStateInHandle.get()); + + AddOutputToWorkload(data, info, outputStateOutTensorInfo, outputStateOutHandle.get()); + AddOutputToWorkload(data, info, cellStateOutTensorInfo, cellStateOutHandle.get()); AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get()); armnn::TensorInfo tensorInfoOut({outputSize}, armnn::DataType::Float32); @@ -1679,6 +1803,9 @@ LayerTestResult UnidirectionalSequenceLstmLayerInt8NoCifgWithPeepholeW inputHandle->Allocate(); outputStateInHandle->Allocate(); cellStateInHandle->Allocate(); + + outputStateOutHandle->Allocate(); + cellStateOutHandle->Allocate(); outputHandle->Allocate(); CopyDataToITensorHandle(inputHandle.get(), inputVector.data()); @@ -1687,6 +1814,8 @@ LayerTestResult UnidirectionalSequenceLstmLayerInt8NoCifgWithPeepholeW workload->Execute(); + CopyDataFromITensorHandle(actualOutputStateOut.data(), outputStateOutHandle.get()); + CopyDataFromITensorHandle(actualCellStateOut.data(), cellStateOutHandle.get()); CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get()); return LayerTestResult(actualOutput, @@ -1710,6 +1839,8 @@ LayerTestResult UnidirectionalSequenceLstmLayerInt8NoCifgWithPeepholeW armnn::TensorInfo inputTensorInfo({batchSize, timeSize, inputSize}, armnn::DataType::Float32); armnn::TensorInfo cellStateInTensorInfo({batchSize , numUnits}, armnn::DataType::Float32); armnn::TensorInfo outputStateInTensorInfo({batchSize , outputSize}, armnn::DataType::Float32); + armnn::TensorInfo outputStateOutTensorInfo({batchSize, timeSize, outputSize}, armnn::DataType::Float32); + armnn::TensorInfo cellStateOutTensorInfo({batchSize, timeSize, outputSize}, armnn::DataType::Float32); armnn::TensorInfo outputTensorInfo({batchSize, timeSize, outputSize}, armnn::DataType::Float32); const std::vector inputVector = { 1., 8., 3., 4., 5., 4., @@ -1719,6 +1850,8 @@ LayerTestResult UnidirectionalSequenceLstmLayerInt8NoCifgWithPeepholeW std::vector cellStateInVector(batchSize * numUnits, 0.f); std::vector outputStateInVector(batchSize * outputSize, 0.f); + std::vector actualOutputStateOut(outputStateOutTensorInfo.GetNumElements()); + std::vector actualCellStateOut(cellStateOutTensorInfo.GetNumElements()); std::vector actualOutput(outputTensorInfo.GetNumElements()); const std::vector expectedOutput = { 0.0471276f, 0.0168155f, 0.0789885f, 0.16550f, @@ -1734,6 +1867,10 @@ LayerTestResult UnidirectionalSequenceLstmLayerInt8NoCifgWithPeepholeW std::unique_ptr outputStateInHandle = tensorHandleFactory.CreateTensorHandle(outputStateInTensorInfo); + std::unique_ptr outputStateOutHandle = + tensorHandleFactory.CreateTensorHandle(outputStateOutTensorInfo); + std::unique_ptr cellStateOutHandle = + tensorHandleFactory.CreateTensorHandle(cellStateOutTensorInfo); std::unique_ptr outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo); armnn::UnidirectionalSequenceLstmQueueDescriptor data; @@ -1743,6 +1880,8 @@ LayerTestResult UnidirectionalSequenceLstmLayerInt8NoCifgWithPeepholeW AddInputToWorkload(data, info, outputStateInTensorInfo, outputStateInHandle.get()); AddInputToWorkload(data, info, cellStateInTensorInfo, cellStateInHandle.get()); + AddOutputToWorkload(data, info, outputStateOutTensorInfo, outputStateOutHandle.get()); + AddOutputToWorkload(data, info, cellStateOutTensorInfo, cellStateOutHandle.get()); AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get()); armnn::TensorInfo tensorInfoOut({outputSize}, armnn::DataType::Float32); @@ -1871,6 +2010,9 @@ LayerTestResult UnidirectionalSequenceLstmLayerInt8NoCifgWithPeepholeW inputHandle->Allocate(); outputStateInHandle->Allocate(); cellStateInHandle->Allocate(); + + outputStateOutHandle->Allocate(); + cellStateOutHandle->Allocate(); outputHandle->Allocate(); CopyDataToITensorHandle(inputHandle.get(), inputVector.data()); @@ -1879,6 +2021,8 @@ LayerTestResult UnidirectionalSequenceLstmLayerInt8NoCifgWithPeepholeW workload->Execute(); + CopyDataFromITensorHandle(actualOutputStateOut.data(), outputStateOutHandle.get()); + CopyDataFromITensorHandle(actualCellStateOut.data(), cellStateOutHandle.get()); CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get()); return LayerTestResult(actualOutput, @@ -1902,7 +2046,8 @@ LayerTestResult UnidirectionalSequenceLstmInt8WithCifgWithPeepholeNoPr armnn::TensorInfo inputTensorInfo({batchSize, timeSize, inputSize}, armnn::DataType::Float32); armnn::TensorInfo cellStateInTensorInfo({batchSize, numUnits}, armnn::DataType::Float32); armnn::TensorInfo outputStateInTensorInfo({batchSize, outputSize}, armnn::DataType::Float32); - + armnn::TensorInfo outputStateOutTensorInfo({batchSize, timeSize, outputSize}, armnn::DataType::Float32); + armnn::TensorInfo cellStateOutTensorInfo({batchSize, timeSize, outputSize}, armnn::DataType::Float32); armnn::TensorInfo outputTensorInfo({batchSize, timeSize, outputSize}, armnn::DataType::Float32); const std::vector inputVector = { 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.4f, @@ -1912,6 +2057,8 @@ LayerTestResult UnidirectionalSequenceLstmInt8WithCifgWithPeepholeNoPr std::vector cellStateInVector(batchSize * numUnits, 0.f); std::vector outputStateInVector(batchSize * outputSize, 0.f); + std::vector actualOutputStateOut(outputStateOutTensorInfo.GetNumElements()); + std::vector actualCellStateOut(cellStateOutTensorInfo.GetNumElements()); std::vector actualOutput(outputTensorInfo.GetNumElements()); const std::vector outputVector = { -0.0072104f, -0.00991171f, -0.00650478f, -0.00713055f, @@ -1927,6 +2074,10 @@ LayerTestResult UnidirectionalSequenceLstmInt8WithCifgWithPeepholeNoPr std::unique_ptr outputStateInHandle = tensorHandleFactory.CreateTensorHandle(outputStateInTensorInfo); + std::unique_ptr outputStateOutHandle = + tensorHandleFactory.CreateTensorHandle(outputStateOutTensorInfo); + std::unique_ptr cellStateOutHandle = + tensorHandleFactory.CreateTensorHandle(cellStateOutTensorInfo); std::unique_ptr outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo); armnn::UnidirectionalSequenceLstmQueueDescriptor data; @@ -1936,6 +2087,8 @@ LayerTestResult UnidirectionalSequenceLstmInt8WithCifgWithPeepholeNoPr AddInputToWorkload(data, info, outputStateInTensorInfo, outputStateInHandle.get()); AddInputToWorkload(data, info, cellStateInTensorInfo, cellStateInHandle.get()); + AddOutputToWorkload(data, info, outputStateOutTensorInfo, outputStateOutHandle.get()); + AddOutputToWorkload(data, info, cellStateOutTensorInfo, cellStateOutHandle.get()); AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get()); armnn::TensorInfo tensorInfoNumFp({numUnits}, armnn::DataType::Float32); @@ -2009,6 +2162,8 @@ LayerTestResult UnidirectionalSequenceLstmInt8WithCifgWithPeepholeNoPr outputStateInHandle->Allocate(); cellStateInHandle->Allocate(); + outputStateOutHandle->Allocate(); + cellStateOutHandle->Allocate(); outputHandle->Allocate(); CopyDataToITensorHandle(inputHandle.get(), inputVector.data()); @@ -2017,10 +2172,12 @@ LayerTestResult UnidirectionalSequenceLstmInt8WithCifgWithPeepholeNoPr workload->Execute(); + CopyDataFromITensorHandle(actualOutputStateOut.data(), outputStateOutHandle.get()); + CopyDataFromITensorHandle(actualCellStateOut.data(), cellStateOutHandle.get()); CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get()); return LayerTestResult(actualOutput, outputVector, outputHandle->GetShape(), outputTensorInfo.GetShape()); -} \ No newline at end of file +} -- cgit v1.2.1