diff options
author | Derek Lamberti <derek.lamberti@arm.com> | 2019-02-06 16:20:46 +0000 |
---|---|---|
committer | Matteo Martincigh <matteo.martincigh@arm.com> | 2019-02-06 17:07:51 +0000 |
commit | 7205fed8ae4d6f85b350f3612cc43ee7e25176a7 (patch) | |
tree | e22e3af9d33dea7fbc9765ce7fb2b347ea356dcf /src/armnn/test/QuantizerTest.cpp | |
parent | 949f1255a247f3a1a7eabe8c8f96087d02da1d5a (diff) | |
download | armnn-7205fed8ae4d6f85b350f3612cc43ee7e25176a7.tar.gz |
IVGCVSW-2654 Test quantization of addition, input and output
Change-Id: I6c61df213278e6ba65807932548bb2eaa159deba
Signed-off-by: Derek Lamberti <derek.lamberti@arm.com>
Diffstat (limited to 'src/armnn/test/QuantizerTest.cpp')
-rw-r--r-- | src/armnn/test/QuantizerTest.cpp | 96 |
1 files changed, 96 insertions, 0 deletions
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 <armnn/INetwork.hpp> +#include <armnn/Tensor.hpp> +#include <armnn/INetworkQuantizer.hpp> +#include <armnn/Types.hpp> + +#include "../LayerVisitorBase.hpp" +#include "../Network.hpp" +#include "../Graph.hpp" + +#include <boost/test/unit_test.hpp> + +namespace armnn +{ +BOOST_AUTO_TEST_SUITE(Quantizer) + +void VisitLayersTopologically(const INetwork* inputNetwork, ILayerVisitor& visitor) +{ + auto network = boost::polymorphic_downcast<const Network*>(inputNetwork); + + auto graph = network->GetGraph().TopologicalSort(); + for (auto layer : graph) + { + layer->Accept(visitor); + } +} + +BOOST_AUTO_TEST_CASE(QuantizeAddition) +{ + class TestQuantization : public LayerVisitorBase<VisitorThrowingPolicy> + { + 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 |