From 56770f2233814db64e8b79bc37a7c356e980073c Mon Sep 17 00:00:00 2001 From: Debottam Bakshi Gupta <debottam.bakshi.gupta@cern.ch> Date: Thu, 8 Jul 2021 18:11:41 +0000 Subject: [PATCH] improving Flattening algorithm from 2Dto1D to multiDto1D --- .../AthOnnxruntimeUtils/FlattenInput.h | 24 ++++++++++++------- .../AthExOnnxRuntime/src/EvaluateModel.cxx | 4 ++-- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/Control/AthOnnxruntimeUtils/AthOnnxruntimeUtils/FlattenInput.h b/Control/AthOnnxruntimeUtils/AthOnnxruntimeUtils/FlattenInput.h index 0a4abfaf7970..3d472dc3a6c4 100644 --- a/Control/AthOnnxruntimeUtils/AthOnnxruntimeUtils/FlattenInput.h +++ b/Control/AthOnnxruntimeUtils/AthOnnxruntimeUtils/FlattenInput.h @@ -13,15 +13,21 @@ namespace AthONNX { template<typename T> - inline std::vector<T> FlattenInput2D_1D( std::vector<std::vector<T>> features, int size){ - std::vector<float> Flatten1D(size); - for(std::size_t r=0;r<features.size();++r){ - int n_cols = features[r].size(); - for(int c=0;c<n_cols;++c){ - float a = float(features[r][c]); - Flatten1D[r*n_cols+c] = a; - } - } + + inline std::vector<T> FlattenInput_multiD_1D( std::vector<std::vector<T>> features){ + // 1. Compute the total size required. + int total_size = 0; + for (auto& feature : features) total_size += feature.size(); + + // 2. Create a vector to hold the data. + std::vector<T> Flatten1D; + Flatten1D.reserve(total_size); + + // 3. Fill it + for (auto& feature : features) + for (auto& elem : feature) + Flatten1D.push_back(elem); + return Flatten1D; } diff --git a/Control/AthenaExamples/AthExOnnxRuntime/src/EvaluateModel.cxx b/Control/AthenaExamples/AthExOnnxRuntime/src/EvaluateModel.cxx index 98edd86c7d19..45200d5e44da 100644 --- a/Control/AthenaExamples/AthExOnnxRuntime/src/EvaluateModel.cxx +++ b/Control/AthenaExamples/AthExOnnxRuntime/src/EvaluateModel.cxx @@ -167,7 +167,7 @@ namespace AthONNX { /***************** Choose an example sample randomly ****************************/ std::vector<std::vector<float>> input_tensor_values = m_input_tensor_values_notFlat[m_testSample]; - std::vector<float> flatten = AthONNX::FlattenInput2D_1D(input_tensor_values, 784); + std::vector<float> flatten = AthONNX::FlattenInput_multiD_1D(input_tensor_values); // Output label of corresponding m_input_tensor_values[m_testSample]; e.g 0, 1, 2, 3 etc int output_tensor_values = m_output_tensor_values[m_testSample]; @@ -235,7 +235,7 @@ namespace AthONNX { std::vector<float> batch_input_tensor_values; for (int j = l; j < l+m_sizeOfBatch; j++) { - std::vector<float> flattened_input = AthONNX::FlattenInput2D_1D(m_input_tensor_values_notFlat[j],784); + std::vector<float> flattened_input = AthONNX::FlattenInput_multiD_1D(m_input_tensor_values_notFlat[j]); /******************For each batch we need a flattened (5 x 28 x 28 = 3920) 1D array******************************/ batch_input_tensor_values.insert(batch_input_tensor_values.end(), flattened_input.begin(), flattened_input.end()); } -- GitLab