From e2062cdf1eb31b87860f9889f0e799e89f0dfa30 Mon Sep 17 00:00:00 2001 From: Jan Eilers Date: Mon, 30 Mar 2020 15:07:45 +0100 Subject: IVGCVSW-4590 Fix Lstm layers CellToInputWeights * CellToInputWeights were not handeled correctly * Changed CellToInputWeights from Cifg to peephole parameter * Modified exiting unit tests * Added unit test to cover new configuration * Added more descriptive error messages Signed-off-by: Jan Eilers Change-Id: Ied5dc1253d3df1fd1a79b887a58603d0a9c8f396 --- src/armnn/test/ConstTensorLayerVisitor.cpp | 126 ++++++++++++++++++++++++++--- src/armnn/test/OptimizerTests.cpp | 9 ++- 2 files changed, 120 insertions(+), 15 deletions(-) (limited to 'src/armnn/test') diff --git a/src/armnn/test/ConstTensorLayerVisitor.cpp b/src/armnn/test/ConstTensorLayerVisitor.cpp index 7ef3dd2920..ab83a891a1 100644 --- a/src/armnn/test/ConstTensorLayerVisitor.cpp +++ b/src/armnn/test/ConstTensorLayerVisitor.cpp @@ -861,11 +861,6 @@ BOOST_AUTO_TEST_CASE(CheckLstmLayerCifgDisabled) ConstTensor recurrentToInputWeights(TensorInfo( 4, recurrentToInputWeightsDimensions.data(), DataType::Float32), recurrentToInputWeightsData); - std::vector cellToInputWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0}; - std::vector cellToInputWeightsDimensions = {1, 1, 3, 3}; - ConstTensor cellToInputWeights( - TensorInfo(4, cellToInputWeightsDimensions.data(), DataType::Float32), cellToInputWeightsData); - std::vector inputGateBiasData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0}; std::vector inputGateBiasDimensions = {1, 1, 3, 3}; ConstTensor inputGateBias( @@ -884,7 +879,6 @@ BOOST_AUTO_TEST_CASE(CheckLstmLayerCifgDisabled) params.m_InputToInputWeights = &inputToInputWeights; params.m_RecurrentToInputWeights = &recurrentToInputWeights; - params.m_CellToInputWeights = &cellToInputWeights; params.m_InputGateBias = &inputGateBias; TestLstmLayerVisitor visitor(descriptor, params); @@ -959,11 +953,6 @@ BOOST_AUTO_TEST_CASE(CheckNamedLstmLayerCifgDisabled) ConstTensor recurrentToInputWeights(TensorInfo( 4, recurrentToInputWeightsDimensions.data(), DataType::Float32), recurrentToInputWeightsData); - std::vector cellToInputWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0}; - std::vector cellToInputWeightsDimensions = {1, 1, 3, 3}; - ConstTensor cellToInputWeights( - TensorInfo(4, cellToInputWeightsDimensions.data(), DataType::Float32), cellToInputWeightsData); - std::vector inputGateBiasData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0}; std::vector inputGateBiasDimensions = {1, 1, 3, 3}; ConstTensor inputGateBias( @@ -982,7 +971,6 @@ BOOST_AUTO_TEST_CASE(CheckNamedLstmLayerCifgDisabled) params.m_InputToInputWeights = &inputToInputWeights; params.m_RecurrentToInputWeights = &recurrentToInputWeights; - params.m_CellToInputWeights = &cellToInputWeights; params.m_InputGateBias = &inputGateBias; TestLstmLayerVisitor visitor(descriptor, params, layerName); @@ -1080,6 +1068,120 @@ BOOST_AUTO_TEST_CASE(CheckLstmLayerPeephole) layer->Accept(visitor); } +BOOST_AUTO_TEST_CASE(CheckLstmLayerPeepholeCifgDisabled) +{ + LstmDescriptor descriptor; + descriptor.m_ActivationFunc = 3; + descriptor.m_ClippingThresProj = 0.5f; + descriptor.m_ClippingThresCell = 0.3f; + descriptor.m_CifgEnabled = false; + descriptor.m_PeepholeEnabled = true; + + std::vector inputToForgetWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0}; + std::vector inputToForgetWeightsDimensions = {1, 1, 3, 3}; + ConstTensor inputToForgetWeights( + TensorInfo(4, inputToForgetWeightsDimensions.data(), DataType::Float32), inputToForgetWeightsData); + + std::vector inputToCellWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0}; + std::vector inputToCellWeightsDimensions = {1, 1, 3, 3}; + ConstTensor inputToCellWeights( + TensorInfo(4, inputToCellWeightsDimensions.data(), DataType::Float32), inputToCellWeightsData); + + std::vector inputToOutputWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0}; + std::vector inputToOutputWeightsDimensions = {1, 1, 3, 3}; + ConstTensor inputToOutputWeights( + TensorInfo(4, inputToOutputWeightsDimensions.data(), DataType::Float32), inputToOutputWeightsData); + + std::vector recurrentToForgetWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0}; + std::vector recurrentToForgetWeightsDimensions = {1, 1, 3, 3}; + ConstTensor recurrentToForgetWeights(TensorInfo( + 4, recurrentToForgetWeightsDimensions.data(), DataType::Float32), recurrentToForgetWeightsData); + + std::vector recurrentToCellWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0}; + std::vector recurrentToCellWeightsDimensions = {1, 1, 3, 3}; + ConstTensor recurrentToCellWeights(TensorInfo( + 4, recurrentToCellWeightsDimensions.data(), DataType::Float32), recurrentToCellWeightsData); + + std::vector recurrentToOutputWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0}; + std::vector recurrentToOutputWeightsDimensions = {1, 1, 3, 3}; + ConstTensor recurrentToOutputWeights(TensorInfo( + 4, recurrentToOutputWeightsDimensions.data(), DataType::Float32), recurrentToOutputWeightsData); + + std::vector forgetGateBiasData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0}; + std::vector forgetGateBiasDimensions = {1, 1, 3, 3}; + ConstTensor forgetGateBias(TensorInfo( + 4, forgetGateBiasDimensions.data(), DataType::Float32), forgetGateBiasData); + + std::vector cellBiasData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0}; + std::vector cellBiasDimensions = {1, 1, 3, 3}; + ConstTensor cellBias(TensorInfo( + 4, cellBiasDimensions.data(), DataType::Float32), cellBiasData); + + std::vector outputGateBiasData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0}; + std::vector outputGateBiasDimensions = {1, 1, 3, 3}; + ConstTensor outputGateBias(TensorInfo( + 4, outputGateBiasDimensions.data(), DataType::Float32), outputGateBiasData); + + std::vector cellToInputWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0}; + std::vector cellToInputWeightsDimensions = {1, 1, 3, 3}; + ConstTensor cellToInputWeights( + TensorInfo(4, cellToInputWeightsDimensions.data(), DataType::Float32), cellToInputWeightsData); + + std::vector cellToForgetWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0}; + std::vector cellToForgetWeightsDimensions = {1, 1, 3, 3}; + ConstTensor cellToForgetWeights( + TensorInfo(4, cellToForgetWeightsDimensions.data(), DataType::Float32), cellToForgetWeightsData); + + std::vector cellToOutputWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0}; + std::vector cellToOutputWeightsDimensions = {1, 1, 3, 3}; + ConstTensor cellToOutputWeights( + TensorInfo(4, cellToOutputWeightsDimensions.data(), DataType::Float32), cellToOutputWeightsData); + + std::vector inputToInputWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0}; + std::vector inputToInputWeightsDimensions = {1, 1, 3, 3}; + ConstTensor inputToInputWeights( + TensorInfo(4, inputToInputWeightsDimensions.data(), DataType::Float32), inputToInputWeightsData); + + std::vector recurrentToInputWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0}; + std::vector recurrentToInputWeightsDimensions = {1, 1, 3, 3}; + ConstTensor recurrentToInputWeights(TensorInfo( + 4, recurrentToInputWeightsDimensions.data(), DataType::Float32), recurrentToInputWeightsData); + + std::vector inputGateBiasData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0}; + std::vector inputGateBiasDimensions = {1, 1, 3, 3}; + ConstTensor inputGateBias( + TensorInfo(4, inputGateBiasDimensions.data(), DataType::Float32), inputGateBiasData); + + LstmInputParams params; + // Basic params + params.m_InputToForgetWeights = &inputToForgetWeights; + params.m_InputToCellWeights = &inputToCellWeights; + params.m_InputToOutputWeights = &inputToOutputWeights; + params.m_RecurrentToForgetWeights = &recurrentToForgetWeights; + params.m_RecurrentToCellWeights = &recurrentToCellWeights; + params.m_RecurrentToOutputWeights = &recurrentToOutputWeights; + params.m_ForgetGateBias = &forgetGateBias; + params.m_CellBias = &cellBias; + params.m_OutputGateBias = &outputGateBias; + + // Peephole params + params.m_CellToInputWeights = &cellToInputWeights; + params.m_CellToForgetWeights = &cellToForgetWeights; + params.m_CellToOutputWeights = &cellToOutputWeights; + + // Cifg params + params.m_InputToInputWeights = &inputToInputWeights; + params.m_RecurrentToInputWeights = &recurrentToInputWeights; + params.m_InputGateBias = &inputGateBias; + + TestLstmLayerVisitor visitor(descriptor, params); + + Network net; + + IConnectableLayer* const layer = net.AddLstmLayer(descriptor, params); + layer->Accept(visitor); +} + BOOST_AUTO_TEST_CASE(CheckNamedLstmLayerPeephole) { const char* layerName = "LstmLayer"; diff --git a/src/armnn/test/OptimizerTests.cpp b/src/armnn/test/OptimizerTests.cpp index 56032adc33..a7b23dbd86 100644 --- a/src/armnn/test/OptimizerTests.cpp +++ b/src/armnn/test/OptimizerTests.cpp @@ -78,13 +78,10 @@ void CreateLSTMLayerHelper(Graph &graph, bool CifgEnabled) (TensorInfo({ numUnits, inputSize }, DataType::Float32)); layer->m_CifgParameters.m_RecurrentToInputWeights = std::make_unique (TensorInfo({ numUnits, outputSize }, DataType::Float32)); - layer->m_CifgParameters.m_CellToInputWeights = std::make_unique - (TensorInfo({ numUnits }, DataType::Float32)); layer->m_CifgParameters.m_InputGateBias = std::make_unique (TensorInfo({ numUnits }, DataType::Float32)); layer->m_CifgParameters.m_InputToInputWeights->Allocate(); layer->m_CifgParameters.m_RecurrentToInputWeights->Allocate(); - layer->m_CifgParameters.m_CellToInputWeights->Allocate(); layer->m_CifgParameters.m_InputGateBias->Allocate(); } @@ -100,6 +97,12 @@ void CreateLSTMLayerHelper(Graph &graph, bool CifgEnabled) if (layerDesc.m_PeepholeEnabled) { + if (!layerDesc.m_CifgEnabled) + { + layer->m_PeepholeParameters.m_CellToInputWeights = std::make_unique + (TensorInfo({ numUnits }, DataType::Float32)); + layer->m_PeepholeParameters.m_CellToInputWeights->Allocate(); + } layer->m_PeepholeParameters.m_CellToForgetWeights = std::make_unique (TensorInfo({ numUnits }, DataType::Float32)); layer->m_PeepholeParameters.m_CellToOutputWeights = std::make_unique -- cgit v1.2.1