diff options
author | Matthew Sloyan <matthew.sloyan@arm.com> | 2022-12-08 13:38:23 +0000 |
---|---|---|
committer | Cathal Corbett <cathal.corbett@arm.com> | 2022-12-15 10:00:12 +0000 |
commit | fc9d5e7d1e0c1a4d7fed4ebc363832e03c3e2543 (patch) | |
tree | 5c1b7efd146256c2de9781ae5a60e22cf2d6142a /src/backends/tosaCommon/test | |
parent | 67fd526f8f7c79803d514a6045454049104eced9 (diff) | |
download | armnn-fc9d5e7d1e0c1a4d7fed4ebc363832e03c3e2543.tar.gz |
IVGCVSW-7204 Add TransposeConv2d support to TOSA Reference Backend
Signed-off-by: Matthew Sloyan <matthew.sloyan@arm.com>
Change-Id: I9bfd597afd41468f304edfbe5d7141378ce60d4f
Diffstat (limited to 'src/backends/tosaCommon/test')
-rw-r--r-- | src/backends/tosaCommon/test/OneToOneMappingTests.cpp | 102 | ||||
-rw-r--r-- | src/backends/tosaCommon/test/TosaTestUtils.hpp | 21 |
2 files changed, 117 insertions, 6 deletions
diff --git a/src/backends/tosaCommon/test/OneToOneMappingTests.cpp b/src/backends/tosaCommon/test/OneToOneMappingTests.cpp index 0d19a328d6..2b0c1e55c7 100644 --- a/src/backends/tosaCommon/test/OneToOneMappingTests.cpp +++ b/src/backends/tosaCommon/test/OneToOneMappingTests.cpp @@ -438,6 +438,108 @@ TEST_CASE("GetTosaMappingFromLayer_SliceLayer") } +TEST_CASE("GetTosaMapping_TransposeConv2dLayer") +{ + const TensorInfo inputInfo ({ 1, 7, 7, 1 }, DataType::Float32); + const TensorInfo outputInfo({ 1, 9, 9, 1 }, DataType::Float32); + const TensorInfo weightsInfo({ 1, 3, 3, 1 }, DataType::Float32, 0.0f, 0, true); + const TensorInfo biasesInfo ({ 1 }, DataType::Float32, 0.0f, 0, true); + + TransposeConvolution2dDescriptor descriptor; + descriptor.m_PadLeft = 1; + descriptor.m_PadRight = 1; + descriptor.m_PadTop = 1; + descriptor.m_PadBottom = 1; + descriptor.m_StrideX = 1; + descriptor.m_StrideY = 1; + descriptor.m_BiasEnabled = true; + descriptor.m_DataLayout = DataLayout::NHWC; + + TosaSerializationBasicBlock* basicBlock = GetTosaMapping(nullptr, + LayerType::TransposeConvolution2d, + {&inputInfo, &weightsInfo, &biasesInfo}, + {&outputInfo}, + descriptor); + + CHECK(basicBlock->GetInputs().size() == 3); + CHECK(basicBlock->GetOutputs().size() == 1); + CHECK(basicBlock->GetOperators().size() == 3); + CHECK(basicBlock->GetTensors().size() == 4); + + CHECK(basicBlock->GetInputs()[0].find("input0_") != std::string::npos); + CHECK(basicBlock->GetInputs()[1].find("constant_") != std::string::npos); + CHECK(basicBlock->GetInputs()[2].find("constant_") != std::string::npos); + CHECK(basicBlock->GetOutputs()[0].find("output0_") != std::string::npos); + + VerifyTosaAttribute(descriptor, + basicBlock->GetOperators().at(2)->GetAttribute(), + {}, + {}, + LayerType::TransposeConvolution2d); +} + +TEST_CASE("GetTosaMappingFromLayer_TransposeConv2dLayer") +{ + IRuntime::CreationOptions options; + IRuntimePtr runtime(IRuntime::Create(options)); + + // Builds up the structure of the network. + INetworkPtr net(INetwork::Create()); + + const TensorInfo inputInfo ({ 1, 7, 7, 1 }, DataType::Float32); + const TensorInfo outputInfo({ 1, 9, 9, 1 }, DataType::Float32); + const TensorInfo weightsInfo({ 1, 3, 3, 1 }, DataType::Float32, 0.0f, 0, true); + const TensorInfo biasesInfo ({ 1 }, DataType::Float32, 0.0f, 0, true); + + std::vector<float> weightsData = GenerateRandomData<float>(weightsInfo.GetNumElements()); + ConstTensor weights(weightsInfo, weightsData); + + std::vector<float> biasesData = GenerateRandomData<float>(biasesInfo.GetNumElements()); + ConstTensor biases(biasesInfo, biasesData); + + TransposeConvolution2dDescriptor descriptor; + descriptor.m_PadLeft = 1; + descriptor.m_PadRight = 1; + descriptor.m_PadTop = 1; + descriptor.m_PadBottom = 1; + descriptor.m_StrideX = 1; + descriptor.m_StrideY = 1; + descriptor.m_BiasEnabled = true; + descriptor.m_DataLayout = DataLayout::NHWC; + + IConnectableLayer* const inputLayer = net->AddInputLayer(0); + IConnectableLayer* const convLayer = + net->AddTransposeConvolution2dLayer(descriptor, + weights, + Optional<ConstTensor>(biases), + "transposeConvolution2d"); + IConnectableLayer* const outputLayer = net->AddOutputLayer(0); + + inputLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(0)); + convLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0)); + + inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo); + convLayer->GetOutputSlot(0).SetTensorInfo(outputInfo); + + TosaSerializationBasicBlock* basicBlock = GetTosaMappingFromLayer(PolymorphicDowncast<Layer*>(convLayer)); + + CHECK(basicBlock->GetInputs().size() == 3); + CHECK(basicBlock->GetOutputs().size() == 1); + CHECK(basicBlock->GetOperators().size() == 3); + CHECK(basicBlock->GetTensors().size() == 4); + + CHECK(basicBlock->GetInputs()[0].find("input0_") != std::string::npos); + CHECK(basicBlock->GetInputs()[1].find("constant_") != std::string::npos); + CHECK(basicBlock->GetInputs()[2].find("constant_") != std::string::npos); + CHECK(basicBlock->GetOutputs()[0].find("output0_") != std::string::npos); + + VerifyTosaAttribute(descriptor, + basicBlock->GetOperators().at(2)->GetAttribute(), + {}, + {}, + LayerType::TransposeConvolution2d); +} + TEST_CASE("GetTosaMapping_Unimplemented") { TosaSerializationBasicBlock* basicBlock = diff --git a/src/backends/tosaCommon/test/TosaTestUtils.hpp b/src/backends/tosaCommon/test/TosaTestUtils.hpp index 93b9e7d36f..140cb83983 100644 --- a/src/backends/tosaCommon/test/TosaTestUtils.hpp +++ b/src/backends/tosaCommon/test/TosaTestUtils.hpp @@ -144,6 +144,20 @@ inline void VerifyTosaAttribute(const BaseDescriptor& descriptor, break; } + case LayerType::TransposeConvolution2d: + { + auto transposeConv2dDesc = PolymorphicDowncast<const TransposeConvolution2dDescriptor*>(&descriptor); + std::vector<int> outPad = {-static_cast<int>(transposeConv2dDesc->m_PadTop), + -static_cast<int>(transposeConv2dDesc->m_PadBottom), + -static_cast<int>(transposeConv2dDesc->m_PadLeft), + -static_cast<int>(transposeConv2dDesc->m_PadRight)}; + std::vector<int> stride = {static_cast<int>(transposeConv2dDesc->m_StrideY), + static_cast<int>(transposeConv2dDesc->m_StrideX)}; + TosaTransposeConvAttribute transposeConvAttribute(attribute); + CHECK(outPad == transposeConvAttribute.out_pad()); + CHECK(stride == transposeConvAttribute.stride()); + break; + } default: break; } @@ -167,12 +181,7 @@ inline void AssertTosaOneToOneMappingBasicBlock(TosaSerializationBasicBlock* bas // The number of tensors in the block can be different if there are constant layers, as they are created separately. if(type == LayerType::Convolution2d) { - numInputTensors = 2; - auto conv2dDesc = PolymorphicDowncast<const Convolution2dDescriptor*>(&descriptor); - if(conv2dDesc->m_BiasEnabled) - { - numInputTensors = 3; - } + numInputTensors = PolymorphicDowncast<const Convolution2dDescriptor*>(&descriptor)->m_BiasEnabled ? 3 : 2; } std::string blockStr = operatorString + "_block_"; |