From 7205fed8ae4d6f85b350f3612cc43ee7e25176a7 Mon Sep 17 00:00:00 2001 From: Derek Lamberti Date: Wed, 6 Feb 2019 16:20:46 +0000 Subject: IVGCVSW-2654 Test quantization of addition, input and output Change-Id: I6c61df213278e6ba65807932548bb2eaa159deba Signed-off-by: Derek Lamberti --- src/armnn/test/QuantizerTest.cpp | 96 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 src/armnn/test/QuantizerTest.cpp (limited to 'src/armnn/test') diff --git a/src/armnn/test/QuantizerTest.cpp b/src/armnn/test/QuantizerTest.cpp new file mode 100644 index 0000000000..56b1497967 --- /dev/null +++ b/src/armnn/test/QuantizerTest.cpp @@ -0,0 +1,96 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include +#include +#include +#include + +#include "../LayerVisitorBase.hpp" +#include "../Network.hpp" +#include "../Graph.hpp" + +#include + +namespace armnn +{ +BOOST_AUTO_TEST_SUITE(Quantizer) + +void VisitLayersTopologically(const INetwork* inputNetwork, ILayerVisitor& visitor) +{ + auto network = boost::polymorphic_downcast(inputNetwork); + + auto graph = network->GetGraph().TopologicalSort(); + for (auto layer : graph) + { + layer->Accept(visitor); + } +} + +BOOST_AUTO_TEST_CASE(QuantizeAddition) +{ + class TestQuantization : public LayerVisitorBase + { + public: + virtual void VisitAdditionLayer(const IConnectableLayer* layer, + const char* name = nullptr) + { + TensorInfo info = layer->GetOutputSlot(0).GetTensorInfo(); + + BOOST_TEST((info.GetDataType() == DataType::QuantisedAsymm8)); + + BOOST_TEST((info.GetQuantizationOffset() == 128)); + + // Based off current static value [-20.0f, 20.0f] + BOOST_CHECK_CLOSE(info.GetQuantizationScale(), 40.0f/255.0f, 0.000001f ); + } + + virtual void VisitInputLayer(const IConnectableLayer* layer, + LayerBindingId id, + const char* name = nullptr) + { + TensorInfo info = layer->GetOutputSlot(0).GetTensorInfo(); + + BOOST_TEST((info.GetDataType() == DataType::QuantisedAsymm8)); + + BOOST_TEST((info.GetQuantizationOffset() == 128)); + + // Based off current default [-15.0f, 15.0f] + BOOST_CHECK_CLOSE(info.GetQuantizationScale(), 30.0f/255.0f, 0.000001f ); + } + + virtual void VisitOutputLayer(const IConnectableLayer* layer, + LayerBindingId id, + const char* name = nullptr) + {} + }; + + auto network = INetwork::Create(); + + // Add the layers + IConnectableLayer* input0 = network->AddInputLayer(0); + IConnectableLayer* input1 = network->AddInputLayer(1); + IConnectableLayer* addition = network->AddAdditionLayer(); + IConnectableLayer* output = network->AddOutputLayer(2); + + // Establish connections + input0->GetOutputSlot(0).Connect(addition->GetInputSlot(0)); + input1->GetOutputSlot(0).Connect(addition->GetInputSlot(1)); + addition->GetOutputSlot(0).Connect(output->GetInputSlot(0)); + + //Set TensorInfo + TensorShape shape{1U}; + TensorInfo info(shape, DataType::Float32); + input0->GetOutputSlot(0).SetTensorInfo(info); + input1->GetOutputSlot(0).SetTensorInfo(info); + addition->GetOutputSlot(0).SetTensorInfo(info); + + auto quantizedNetwork = INetworkQuantizer::Create(network.get())->ExportNetwork(); + TestQuantization validator; + VisitLayersTopologically(quantizedNetwork.get(), validator); +} + +BOOST_AUTO_TEST_SUITE_END() +} //namespace armnn -- cgit v1.2.1