13 namespace armcomputetensorutils
21 return arm_compute::DataType::BFLOAT16;
23 return arm_compute::DataType::U8;
25 return arm_compute::DataType::F16;
27 return arm_compute::DataType::F32;
29 return arm_compute::DataType::QASYMM8_SIGNED;
31 return arm_compute::DataType::QASYMM8;
33 return arm_compute::DataType::QSYMM16;
35 return arm_compute::DataType::S64;
38 return multiScales ? arm_compute::DataType::QSYMM8_PER_CHANNEL : arm_compute::DataType::QSYMM8;
42 return arm_compute::DataType::QSYMM8_PER_CHANNEL;
45 return arm_compute::DataType::S32;
48 return arm_compute::DataType::UNKNOWN;
53 unsigned int originalInputRank,
54 const std::vector<unsigned int>& armnnAxes)
58 if (armnnAxes.empty())
66 outAclCoords.set_num_dimensions(inputDimensions);
67 std::generate(outAclCoords.begin(), outAclCoords.end(), [d = inputDimensions - 1] ()
mutable {
return d--; });
85 outAclCoords.set_num_dimensions(armnnAxes.size());
86 std::transform(armnnAxes.begin(), armnnAxes.end(),
88 [originalInputRank](
unsigned int i){
return originalInputRank - i - 1; });
94 arm_compute::TensorShape BuildArmComputeTensorShape(
const armnn::TensorShape& tensorShape)
96 arm_compute::TensorShape shape;
110 if (shape.num_dimensions() == 0)
112 shape.set_num_dimensions(1);
120 arm_compute::TensorInfo BuildArmComputeTensorInfo(
const armnn::TensorInfo& tensorInfo)
123 const arm_compute::TensorShape aclTensorShape = BuildArmComputeTensorShape(tensorInfo.
GetShape());
126 const arm_compute::QuantizationInfo aclQuantizationInfo = multiScales ?
130 return arm_compute::TensorInfo(aclTensorShape, 1, aclDataType, aclQuantizationInfo);
133 arm_compute::TensorInfo BuildArmComputeTensorInfo(
const armnn::TensorInfo& tensorInfo,
136 arm_compute::TensorInfo aclTensorInfo = BuildArmComputeTensorInfo(tensorInfo);
137 aclTensorInfo.set_data_layout(ConvertDataLayout(dataLayout));
139 return aclTensorInfo;
150 default:
throw InvalidArgumentException(
"Unknown armnn::DataLayout: [" +
151 std::to_string(static_cast<int>(dataLayout)) +
"]");
155 arm_compute::PoolingLayerInfo BuildArmComputePoolingLayerInfo(
const Pooling2dDescriptor& descriptor,
156 bool fpMixedPrecision)
158 using arm_compute::PoolingType;
159 using arm_compute::DimensionRoundingType;
160 using arm_compute::PadStrideInfo;
161 using arm_compute::PoolingLayerInfo;
162 using arm_compute::Size2D;
168 const DataLayout dataLayout = ConvertDataLayout(descriptor.m_DataLayout);
170 bool isGlobalPooling = (descriptor.m_StrideX==0 && descriptor.m_StrideY==0);
174 return arm_compute::PoolingLayerInfo(poolingType, dataLayout);
178 descriptor.m_OutputShapeRounding);
179 const PadStrideInfo padStrideInfo(descriptor.m_StrideX,
180 descriptor.m_StrideY,
181 descriptor.m_PadLeft,
182 descriptor.m_PadRight,
184 descriptor.m_PadBottom,
189 const Size2D poolSize(descriptor.m_PoolWidth, descriptor.m_PoolHeight);
191 return arm_compute::PoolingLayerInfo(poolingType, poolSize, dataLayout, padStrideInfo, excludePadding,
195 arm_compute::NormalizationLayerInfo BuildArmComputeNormalizationLayerInfo(
const NormalizationDescriptor& descriptor)
197 const arm_compute::NormType normType =
199 return arm_compute::NormalizationLayerInfo(normType,
200 descriptor.m_NormSize,
209 arm_compute::PermutationVector aclPerm;
211 unsigned int start = 0;
212 while ((start < perm.
GetSize()) && (start == perm[start]))
217 for (
unsigned int i = start; i < perm.
GetSize(); ++i)
219 aclPerm.set(i - start, perm[i] - start);
226 arm_compute::PermutationVector aclPerm;
227 std::map<unsigned int, unsigned int> permuteMappings;
228 for (
unsigned int i = 0; i < perm.
GetSize(); ++i)
230 permuteMappings[perm[i]] = i;
233 std::vector<unsigned int> permuteVector;
234 for (
unsigned int i = 0; i < perm.
GetSize(); ++i)
236 permuteVector.push_back(permuteMappings.at(i));
239 unsigned int start = 0;
240 while ((start < perm.
GetSize()) && (start == permuteVector[start]))
245 for (
unsigned int i = start; i < perm.
GetSize(); ++i)
247 aclPerm.set(i - start, permuteVector[i] - start);
252 arm_compute::Size2D BuildArmComputeSize2D(
const unsigned int width,
const unsigned int height)
254 return arm_compute::Size2D(width, height);
257 arm_compute::PixelValue GetPixelValue(arm_compute::ITensor& input,
float pixelValue)
259 switch (input.info()->data_type())
261 case arm_compute::DataType::F16:
262 return arm_compute::PixelValue(static_cast<Half>(pixelValue));
263 case arm_compute::DataType::F32:
264 return arm_compute::PixelValue(pixelValue);
265 case arm_compute::DataType::QASYMM8:
266 return arm_compute::PixelValue(static_cast<uint8_t>(pixelValue));
267 case arm_compute::DataType::QSYMM16:
268 return arm_compute::PixelValue(static_cast<int16_t>(pixelValue));
269 case arm_compute::DataType::QASYMM8_SIGNED:
270 case arm_compute::DataType::QSYMM8_PER_CHANNEL:
271 return arm_compute::PixelValue(static_cast<int8_t>(pixelValue));
272 case arm_compute::DataType::S32:
273 return arm_compute::PixelValue(static_cast<int32_t>(pixelValue));
275 throw InvalidArgumentException(
"Unsupported DataType: [" +
276 std::to_string(static_cast<int>(input.info()->data_type())) +
"]");
const TensorShape & GetShape() const
arm_compute::PoolingType ConvertPoolingAlgorithmToAclPoolingType(PoolingAlgorithm poolingAlgorithm)
#define ARMNN_NO_DEPRECATE_WARN_BEGIN
std::array< unsigned int, MaxNumOfTensorDimensions > Coordinates
The padding fields don't count and are ignored.
arm_compute::NormType ConvertNormalizationAlgorithmChannelToAclNormType(NormalizationAlgorithmChannel channelType)
Copyright (c) 2021 ARM Limited and Contributors.
std::vector< float > GetQuantizationScales() const
bool HasMultipleQuantizationScales() const
#define ARMNN_NO_DEPRECATE_WARN_END
#define ARMNN_ASSERT_MSG(COND, MSG)
arm_compute::DimensionRoundingType ConvertOutputShapeRoundingToAclDimensionRoundingType(OutputShapeRounding rounding)
int32_t GetQuantizationOffset() const
float GetQuantizationScale() const
DataType GetDataType() const
unsigned int GetNumDimensions() const
Function that returns the tensor rank.