2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
6 #include "TensorUtils.hpp"
7 #include <backendsCommon/ITensorHandle.hpp>
12 armnn::TensorShape GetTensorShape(unsigned int numberOfBatches,
13 unsigned int numberOfChannels,
16 const armnn::DataLayout dataLayout)
20 case armnn::DataLayout::NCHW:
21 return armnn::TensorShape({numberOfBatches, numberOfChannels, height, width});
22 case armnn::DataLayout::NHWC:
23 return armnn::TensorShape({numberOfBatches, height, width, numberOfChannels});
25 throw armnn::InvalidArgumentException("Unknown data layout ["
26 + std::to_string(static_cast<int>(dataLayout)) +
27 "]", CHECK_LOCATION());
31 armnn::TensorInfo GetTensorInfo(unsigned int numberOfBatches,
32 unsigned int numberOfChannels,
35 const armnn::DataLayout dataLayout,
36 const armnn::DataType dataType)
40 case armnn::DataLayout::NCHW:
41 return armnn::TensorInfo({numberOfBatches, numberOfChannels, height, width}, dataType);
42 case armnn::DataLayout::NHWC:
43 return armnn::TensorInfo({numberOfBatches, height, width, numberOfChannels}, dataType);
45 throw armnn::InvalidArgumentException("Unknown data layout ["
46 + std::to_string(static_cast<int>(dataLayout)) +
47 "]", CHECK_LOCATION());
51 std::pair<float, float> FindMinMax(armnn::ITensorHandle* tensorHandle)
53 auto tensor_data = static_cast<const float *>(tensorHandle->Map(true));
54 auto tensor_size = tensorHandle->GetShape().GetNumElements();
56 // Set min/max initially to first value in tensor
57 float min = tensor_data[0];
58 float max = tensor_data[0];
60 // Loop over rest of tensor and update min/max if necessary
61 for (unsigned int val = 1; val < tensor_size; val++)
63 if (tensor_data[val] < min)
65 min = tensor_data[val];
67 else if (tensor_data[val] > max)
69 max = tensor_data[val];
73 tensorHandle->Unmap();
75 return std::make_pair(min, max);