ArmNN
 24.08
DepthwiseConvolution2dQueueDescriptor Struct Reference

Depthwise Convolution 2D layer workload data. More...

#include <WorkloadData.hpp>

Inheritance diagram for DepthwiseConvolution2dQueueDescriptor:
[legend]
Collaboration diagram for DepthwiseConvolution2dQueueDescriptor:
[legend]

Public Member Functions

void Validate (const WorkloadInfo &workloadInfo) const
 
- Public Member Functions inherited from QueueDescriptorWithParameters< DepthwiseConvolution2dDescriptor >
virtual ~QueueDescriptorWithParameters ()=default
 
- Public Member Functions inherited from QueueDescriptor
virtual ~QueueDescriptor ()=default
 
void ValidateTensorNumDimensions (const TensorInfo &tensor, std::string const &descName, unsigned int numDimensions, std::string const &tensorName) const
 
void ValidateTensorNumDimNumElem (const TensorInfo &tensorInfo, unsigned int numDimension, unsigned int numElements, std::string const &tensorName) const
 
void ValidateInputsOutputs (const std::string &descName, unsigned int numExpectedIn, unsigned int numExpectedOut) const
 
template<typename T >
const T * GetAdditionalInformation () const
 

Additional Inherited Members

- Public Attributes inherited from QueueDescriptorWithParameters< DepthwiseConvolution2dDescriptor >
DepthwiseConvolution2dDescriptor m_Parameters
 
- Public Attributes inherited from QueueDescriptor
std::vector< ITensorHandle * > m_Inputs
 
std::vector< ITensorHandle * > m_Outputs
 
void * m_AdditionalInfoObject
 
bool m_AllowExpandedDims = false
 
- Protected Member Functions inherited from QueueDescriptorWithParameters< DepthwiseConvolution2dDescriptor >
 QueueDescriptorWithParameters ()=default
 
 QueueDescriptorWithParameters (QueueDescriptorWithParameters const &)=default
 
QueueDescriptorWithParametersoperator= (QueueDescriptorWithParameters const &)=default
 
- Protected Member Functions inherited from QueueDescriptor
 QueueDescriptor ()
 
 QueueDescriptor (QueueDescriptor const &)=default
 
QueueDescriptoroperator= (QueueDescriptor const &)=default
 

Detailed Description

Depthwise Convolution 2D layer workload data.

Note
The weights are in the format [1, H, W, I*M]. Where I is the input channel size, M the depthwise mutliplier and H, W is the height and width of the filter kernel. If per channel quantization is applied the weights will be quantized along the last dimension/axis (I*M) which corresponds to the output channel size. If per channel quantization is applied the weights tensor will have I*M scales, one for each dimension of the quantization axis. You have to be aware of this when reshaping the weights tensor. Splitting the I*M axis, e.g. [1, H, W, I*M] --> [H, W, I, M], won't work without taking care of the corresponding quantization scales. If there is no per channel quantization applied reshaping the weights tensor won't cause any issues. There are preconfigured permutation functions available here.

Definition at line 234 of file WorkloadData.hpp.

Member Function Documentation

◆ Validate()

void Validate ( const WorkloadInfo workloadInfo) const

Definition at line 1391 of file WorkloadData.cpp.

1392 {
1393  const std::string descriptorName{"DepthwiseConvolution2dQueueDescriptor"};
1394 
1395  uint32_t numInputs = 2;
1397  {
1398  numInputs = 3;
1399  }
1400 
1401  ValidateNumInputs(workloadInfo, descriptorName, numInputs);
1402  ValidateNumOutputs(workloadInfo, descriptorName, 1);
1403 
1404  const TensorInfo& inputTensorInfo = workloadInfo.m_InputTensorInfos[0];
1405  const TensorInfo& outputTensorInfo = workloadInfo.m_OutputTensorInfos[0];
1406 
1407  ValidateTensorNumDimensions(inputTensorInfo, descriptorName, 4, "input");
1408  ValidateTensorNumDimensions(outputTensorInfo, descriptorName, 4, "output");
1409 
1410  const TensorInfo& weightTensorInfo = workloadInfo.m_InputTensorInfos[1];
1411  ValidateTensorNumDimensions(weightTensorInfo, descriptorName, 4, "weight");
1412 
1414  {
1416  fmt::format("{}: dilationX (provided {}) and dilationY (provided {}) "
1417  "cannot be smaller than 1.",
1418  descriptorName, m_Parameters.m_DilationX, m_Parameters.m_DilationX));
1419  }
1420 
1421  if (m_Parameters.m_StrideX <= 0 || m_Parameters.m_StrideY <= 0 )
1422  {
1424  fmt::format("{}: strideX (provided {}) and strideY (provided {}) "
1425  "cannot be either negative or 0.",
1426  descriptorName, m_Parameters.m_StrideX, m_Parameters.m_StrideY));
1427  }
1428 
1429  if (weightTensorInfo.GetShape()[0] != 1)
1430  {
1431  throw InvalidArgumentException(fmt::format(
1432  "{0}: The weight format in armnn is expected to be [1, H, W, Cout]."
1433  "But first dimension is not equal to 1. Provided weight shape: [{1}, {2}, {3}, {4}]",
1434  descriptorName,
1435  weightTensorInfo.GetShape()[0],
1436  weightTensorInfo.GetShape()[1],
1437  weightTensorInfo.GetShape()[2],
1438  weightTensorInfo.GetShape()[3]));
1439  }
1440 
1441  const unsigned int channelIndex = (m_Parameters.m_DataLayout == DataLayout::NCHW) ? 1 : 3;
1442  const unsigned int numWeightOutputChannelsRefFormat = weightTensorInfo.GetShape()[3];
1443  const unsigned int numWeightOutputChannelsAclFormat = weightTensorInfo.GetShape()[1];
1444  const unsigned int numOutputChannels = outputTensorInfo.GetShape()[channelIndex];
1445 
1446  // Weights format has two valid options: [1, H, W, Cout] (CpuRef) or [1, Cout, H, W] (CpuAcc/GpuAcc).
1447  bool validRefFormat = (numWeightOutputChannelsRefFormat == numOutputChannels);
1448  bool validAclFormat = (numWeightOutputChannelsAclFormat == numOutputChannels);
1449 
1450  if (!(validRefFormat || validAclFormat))
1451  {
1452  throw InvalidArgumentException(fmt::format(
1453  "{0}: The weight format in armnn is expected to be [1, H, W, Cout] (CpuRef) or [1, Cout, H, W] "
1454  "(CpuAcc/GpuAcc). But neither the 4th (CpuRef) or 2nd (CpuAcc/GpuAcc) dimension is equal to Cout."
1455  "Cout = {1} Provided weight shape: [{2}, {3}, {4}, {5}]",
1456  descriptorName,
1457  numOutputChannels,
1458  weightTensorInfo.GetShape()[0],
1459  weightTensorInfo.GetShape()[1],
1460  weightTensorInfo.GetShape()[2],
1461  weightTensorInfo.GetShape()[3]));
1462  }
1463 
1464  ValidateWeightDataType(inputTensorInfo, weightTensorInfo, descriptorName);
1465 
1466  Optional<TensorInfo> optionalBiasTensorInfo;
1468  {
1469  optionalBiasTensorInfo = MakeOptional<TensorInfo>(workloadInfo.m_InputTensorInfos[2]);
1470  const TensorInfo& biasTensorInfo = optionalBiasTensorInfo.value();
1471 
1472  ValidateBiasTensorQuantization(biasTensorInfo, weightTensorInfo, descriptorName);
1473  ValidateTensorDataType(biasTensorInfo, GetBiasDataType(inputTensorInfo.GetDataType()), descriptorName, "bias");
1474  }
1475  ValidatePerAxisQuantization(inputTensorInfo,
1476  outputTensorInfo,
1477  weightTensorInfo,
1478  optionalBiasTensorInfo,
1479  descriptorName);
1480 
1481  std::vector<DataType> supportedTypes =
1482  {
1489  };
1490 
1491  ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName);
1492  ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName, "input", "output");
1493 }

References armnn::BFloat16, armnn::Float16, armnn::Float32, armnn::GetBiasDataType(), TensorInfo::GetDataType(), TensorInfo::GetShape(), DepthwiseConvolution2dDescriptor::m_BiasEnabled, DepthwiseConvolution2dDescriptor::m_DataLayout, DepthwiseConvolution2dDescriptor::m_DilationX, DepthwiseConvolution2dDescriptor::m_DilationY, WorkloadInfo::m_InputTensorInfos, WorkloadInfo::m_OutputTensorInfos, QueueDescriptorWithParameters< DepthwiseConvolution2dDescriptor >::m_Parameters, DepthwiseConvolution2dDescriptor::m_StrideX, DepthwiseConvolution2dDescriptor::m_StrideY, armnn::NCHW, armnn::QAsymmS8, armnn::QAsymmU8, armnn::QSymmS16, QueueDescriptor::ValidateTensorNumDimensions(), and OptionalReferenceSwitch< std::is_reference< T >::value, T >::value().


The documentation for this struct was generated from the following files:
armnn::Optional
Definition: Optional.hpp:270
armnn::DepthwiseConvolution2dDescriptor::m_BiasEnabled
bool m_BiasEnabled
Enable/disable bias.
Definition: Descriptors.hpp:708
armnn::DepthwiseConvolution2dDescriptor::m_DataLayout
DataLayout m_DataLayout
The data layout to be used (NCHW, NHWC).
Definition: Descriptors.hpp:710
armnn::TensorInfo
Definition: Tensor.hpp:152
armnn::DataType::Float32
@ Float32
armnn::DataType::QAsymmU8
@ QAsymmU8
armnn::DepthwiseConvolution2dDescriptor::m_StrideY
uint32_t m_StrideY
Stride value when proceeding through input for the height dimension.
Definition: Descriptors.hpp:702
armnn::DataType::QSymmS16
@ QSymmS16
armnn::DataType::BFloat16
@ BFloat16
armnn::DataType::Float16
@ Float16
armnn::WorkloadInfo::m_OutputTensorInfos
std::vector< TensorInfo > m_OutputTensorInfos
Definition: WorkloadInfo.hpp:19
armnn::QueueDescriptorWithParameters< DepthwiseConvolution2dDescriptor >::m_Parameters
DepthwiseConvolution2dDescriptor m_Parameters
Definition: WorkloadData.hpp:66
armnn::DepthwiseConvolution2dDescriptor::m_DilationY
uint32_t m_DilationY
Dilation factor value for height dimension.
Definition: Descriptors.hpp:706
armnn::InvalidArgumentException
Definition: Exceptions.hpp:80
armnn::TensorInfo::GetDataType
DataType GetDataType() const
Definition: Tensor.hpp:200
armnn::DataType::QAsymmS8
@ QAsymmS8
armnn::TensorInfo::GetShape
const TensorShape & GetShape() const
Definition: Tensor.hpp:193
armnn::GetBiasDataType
DataType GetBiasDataType(DataType inputDataType)
Definition: WorkloadData.cpp:28
armnn::WorkloadInfo::m_InputTensorInfos
std::vector< TensorInfo > m_InputTensorInfos
Definition: WorkloadInfo.hpp:18
armnn::QueueDescriptor::ValidateTensorNumDimensions
void ValidateTensorNumDimensions(const TensorInfo &tensor, std::string const &descName, unsigned int numDimensions, std::string const &tensorName) const
Definition: WorkloadData.cpp:398
armnn::DepthwiseConvolution2dDescriptor::m_DilationX
uint32_t m_DilationX
Dilation factor value for width dimension.
Definition: Descriptors.hpp:704
armnn::OptionalReferenceSwitch< std::is_reference< T >::value, T >::value
const T & value() const
Definition: Optional.hpp:146
armnn::DataLayout::NCHW
@ NCHW
armnn::DepthwiseConvolution2dDescriptor::m_StrideX
uint32_t m_StrideX
Stride value when proceeding through input for the width dimension.
Definition: Descriptors.hpp:700