diff options
author | Teresa Charlin <teresa.charlinreyes@arm.com> | 2022-05-15 14:07:05 +0100 |
---|---|---|
committer | TeresaARM <teresa.charlinreyes@arm.com> | 2022-05-18 15:31:51 +0000 |
commit | 07307f3c40c4efd8615755ed92ce300a3e150732 (patch) | |
tree | fef7e7068a613e34491a7c846dda9b19b61e3a8f /src/armnn/test/optimizations | |
parent | 80512b0e1e98cb6782f5526fc8308ae6a571cd59 (diff) | |
download | armnn-07307f3c40c4efd8615755ed92ce300a3e150732.tar.gz |
IVGCVSW-6455 Support Const + Dequantize layer and optimize it.
* Support Float16 as input to Dequantize layer
* Add Optimization to substitute Const+Dequantize layers with Const layer
Signed-off-by: Teresa Charlin <teresa.charlinreyes@arm.com>
Change-Id: I58bb7e3871ca480c7b6fca93c4efb2de84e09e64
Signed-off-by: David <david.monahan@arm.com>
Diffstat (limited to 'src/armnn/test/optimizations')
-rw-r--r-- | src/armnn/test/optimizations/ConvertConstDequantisationLayersToConstLayersTest.cpp | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/src/armnn/test/optimizations/ConvertConstDequantisationLayersToConstLayersTest.cpp b/src/armnn/test/optimizations/ConvertConstDequantisationLayersToConstLayersTest.cpp new file mode 100644 index 0000000000..926ac2d26d --- /dev/null +++ b/src/armnn/test/optimizations/ConvertConstDequantisationLayersToConstLayersTest.cpp @@ -0,0 +1,105 @@ +// +// Copyright © 2022 Arm Ltd and Contributors. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "LayersFwd.hpp" +#include <Network.hpp> +#include <TestUtils.hpp> +#include <doctest/doctest.h> +#include <armnn/backends/TensorHandle.hpp> +#include <Optimizer.hpp> + +TEST_SUITE("Optimizer") +{ +using namespace armnn; +using namespace armnn::optimizations; + +TEST_CASE("ConvertConstFloat16DequantizeToConstFloat32") +{ + Graph graph; + const unsigned int shape[] = {1, 2, 2, 3}; + + const TensorInfo constTensorInfo(4, shape, DataType::Float16, 1.0, 0, true); + const TensorInfo outputDequantizeInfo(4, shape, DataType::Float32, 1.0, 0, true); + + ConstantLayer *constantLayer = graph.AddLayer<ConstantLayer>("constant"); + std::vector<float> constantValues(constTensorInfo.GetNumElements(), 4.5f); + ConstTensor constTensor(constTensorInfo, constantValues.data()); + constantLayer->m_LayerOutput = std::make_shared<ScopedTensorHandle>(constTensor); + constantLayer->GetOutputSlot().SetTensorInfo(constTensorInfo); + + DequantizeLayer *dequantizeLayer = graph.AddLayer<DequantizeLayer>("dequantize"); + dequantizeLayer->GetOutputSlot().SetTensorInfo(outputDequantizeInfo); + + OutputLayer *output = graph.AddLayer<OutputLayer>(0, "output"); + + // Connect up constant -> dequantize -> output + constantLayer->GetOutputSlot().Connect(dequantizeLayer->GetInputSlot(0)); + dequantizeLayer->GetOutputSlot().Connect(output->GetInputSlot(0)); + + auto checkConstantFloat16 = [](const armnn::Layer *const layer) -> bool { + return IsLayerOfType<ConstantLayer>(layer) && + (layer->GetDataType() == DataType::Float16); + }; + auto checkConstantFloat32 = [](const armnn::Layer *const layer) -> bool { + return IsLayerOfType<ConstantLayer>(layer) && + (layer->GetDataType() == DataType::Float32); + }; + + CHECK(CheckSequence(graph.cbegin(), graph.cend(), + checkConstantFloat16, + &IsLayerOfType<DequantizeLayer>, + &IsLayerOfType<OutputLayer>)); + + armnn::Optimizer::Pass(graph, MakeOptimizations(ConvertConstDequantisationLayersToConstLayers())); + + CHECK(CheckSequence(graph.cbegin(), graph.cend(), + checkConstantFloat32, + &IsLayerOfType<OutputLayer>)); +} + +TEST_CASE("ConvertConstInt8DequantizeToConstFloat32") +{ + Graph graph; + const unsigned int shape[] = {1, 2, 2, 3}; + + const TensorInfo constTensorInfo(4, shape, DataType::QAsymmS8, 1.0, 0, true); + const TensorInfo outputDequantizeInfo(4, shape, DataType::Float32, 1.0, 0, true); + + ConstantLayer *constantLayer = graph.AddLayer<ConstantLayer>("constant"); + std::vector<int8_t> constantValues(constTensorInfo.GetNumElements(), 5); + ConstTensor constTensor(constTensorInfo, constantValues.data()); + constantLayer->m_LayerOutput = std::make_shared<ScopedTensorHandle>(constTensor); + constantLayer->GetOutputSlot().SetTensorInfo(constTensorInfo); + + DequantizeLayer *dequantizeLayer = graph.AddLayer<DequantizeLayer>("dequantize"); + dequantizeLayer->GetOutputSlot().SetTensorInfo(outputDequantizeInfo); + + OutputLayer *output = graph.AddLayer<OutputLayer>(0, "output"); + + // Connect up constant -> dequantize -> output + constantLayer->GetOutputSlot().Connect(dequantizeLayer->GetInputSlot(0)); + dequantizeLayer->GetOutputSlot().Connect(output->GetInputSlot(0)); + + auto checkConstantQAsymmS8 = [](const armnn::Layer *const layer) -> bool { + return IsLayerOfType<ConstantLayer>(layer) && + (layer->GetDataType() == DataType::QAsymmS8); + }; + auto checkConstantFloat32 = [](const armnn::Layer *const layer) -> bool { + return IsLayerOfType<ConstantLayer>(layer) && + (layer->GetDataType() == DataType::Float32); + }; + + CHECK(CheckSequence(graph.cbegin(), graph.cend(), + checkConstantQAsymmS8, + &IsLayerOfType<DequantizeLayer>, + &IsLayerOfType<OutputLayer>)); + + armnn::Optimizer::Pass(graph, MakeOptimizations(ConvertConstDequantisationLayersToConstLayers())); + + CHECK(CheckSequence(graph.cbegin(), graph.cend(), + checkConstantFloat32, + &IsLayerOfType<OutputLayer>)); +} +} |