diff options
author | Nina Drozd <nina.drozd@arm.com> | 2019-04-25 15:45:20 +0100 |
---|---|---|
committer | Nina Drozd <nina.drozd@arm.com> | 2019-05-03 14:43:50 +0100 |
commit | 59e15b00ea51fee4baeea750dc11ab1952dfab1d (patch) | |
tree | 97e6c9230bf153d404ad3c3e0e285acdb0b6232d /src/armnnQuantizer/QuantizationInput.cpp | |
parent | 8b194fbe79d44cba566ad8b508d1c8902987ae3c (diff) | |
download | armnn-59e15b00ea51fee4baeea750dc11ab1952dfab1d.tar.gz |
IVGCVSW-2834 Add dynamic quantization via datasets
* Add QuantizationDataSet class for quantization data parsed from CSV file
* Add QuantizationInput for retrieving quantization data for each layer ID
* Add unit tests for command line processor and QuantizationDataSet
Change-Id: Iaf0a747b5f25a59a766ac04f7158e8cb7909d179
Signed-off-by: Nina Drozd <nina.drozd@arm.com>
Diffstat (limited to 'src/armnnQuantizer/QuantizationInput.cpp')
-rw-r--r-- | src/armnnQuantizer/QuantizationInput.cpp | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/src/armnnQuantizer/QuantizationInput.cpp b/src/armnnQuantizer/QuantizationInput.cpp new file mode 100644 index 0000000000..bb7aff1c2c --- /dev/null +++ b/src/armnnQuantizer/QuantizationInput.cpp @@ -0,0 +1,103 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "QuantizationInput.hpp" + +#include <iostream> +#include <fstream> +#include <cstring> +#include "armnn/Exceptions.hpp" + +namespace armnnQuantizer +{ + +QuantizationInput::QuantizationInput(const unsigned int passId, + const armnn::LayerBindingId bindingId, + const std::string fileName): + m_PassId(passId) +{ + m_LayerBindingIdToFileName.emplace(bindingId, fileName); +} + +QuantizationInput::QuantizationInput(const QuantizationInput& other) +{ + m_PassId = other.GetPassId(); + m_LayerBindingIdToFileName.clear(); + for (armnn::LayerBindingId bindingId : other.GetLayerBindingIds()) + { + std::string filename = other.GetFileName(bindingId); + AddEntry(bindingId, filename); + } +} + +void QuantizationInput::AddEntry(const armnn::LayerBindingId bindingId, const std::string fileName) +{ + m_LayerBindingIdToFileName.emplace(bindingId, fileName); +} + +std::vector<float> QuantizationInput::GetDataForEntry(const armnn::LayerBindingId bindingId) const +{ + if (m_LayerBindingIdToFileName.at(bindingId).empty()) + { + throw armnn::Exception("Layer binding ID not found"); + } + + std::string fileName = m_LayerBindingIdToFileName.at(bindingId); + std::ifstream in(fileName.c_str(), std::ifstream::binary); + if (!in.is_open()) + { + throw armnn::Exception("Failed to open input tensor file " + fileName); + } + + std::string line; + std::vector<float> values; + char* pEnd; + + while (std::getline(in, line, ' ')) + { + values.emplace_back(std::strtof(line.c_str(), &pEnd)); + } + return values; +} + +std::vector<armnn::LayerBindingId> QuantizationInput::GetLayerBindingIds() const +{ + std::vector<armnn::LayerBindingId> layerBindingIDs; + + for (auto iterator = m_LayerBindingIdToFileName.begin(); iterator != m_LayerBindingIdToFileName.end(); ++iterator) + { + layerBindingIDs.emplace_back(iterator->first); + } + return layerBindingIDs; +} + +unsigned long QuantizationInput::GetNumberOfInputs() const +{ + return m_LayerBindingIdToFileName.size(); +} + +unsigned int QuantizationInput::GetPassId() const +{ + return m_PassId; +} + +std::string QuantizationInput::GetFileName(const armnn::LayerBindingId bindingId) const +{ + auto iterator = m_LayerBindingIdToFileName.find(bindingId); + if (iterator != m_LayerBindingIdToFileName.end()) + { + return m_LayerBindingIdToFileName.at(bindingId); + } + else + { + throw armnn::Exception("Could not retrieve filename for binding ID " + std::to_string(bindingId)); + } +} + +QuantizationInput::~QuantizationInput() noexcept +{ +} + +}
\ No newline at end of file |