17 #include <arm_compute/runtime/NEON/functions/NEBatchNormalizationLayer.h>
21 using namespace armcomputetensorutils;
33 const arm_compute::TensorInfo aclInputInfo =
34 armcomputetensorutils::BuildArmComputeTensorInfo(input, descriptor.
m_DataLayout);
35 const arm_compute::TensorInfo aclOutputInfo =
36 armcomputetensorutils::BuildArmComputeTensorInfo(output, descriptor.
m_DataLayout);
37 const arm_compute::TensorInfo aclMeanInfo =
38 armcomputetensorutils::BuildArmComputeTensorInfo(mean, descriptor.
m_DataLayout);
39 const arm_compute::TensorInfo aclVarInfo =
40 armcomputetensorutils::BuildArmComputeTensorInfo(var, descriptor.
m_DataLayout);
41 const arm_compute::TensorInfo aclBetaInfo =
42 armcomputetensorutils::BuildArmComputeTensorInfo(beta, descriptor.
m_DataLayout);
43 const arm_compute::TensorInfo aclGammaInfo =
44 armcomputetensorutils::BuildArmComputeTensorInfo(gamma, descriptor.
m_DataLayout);
47 activationDescriptor);
49 return arm_compute::NEBatchNormalizationLayer::validate(&aclInputInfo,
71 arm_compute::ITensor& input = PolymorphicDowncast<IAclTensorHandle*>(
m_Data.
m_Inputs[0])->GetTensor();
72 arm_compute::ITensor& output = PolymorphicDowncast<IAclTensorHandle*>(
m_Data.
m_Outputs[0])->GetTensor();
75 input.info()->set_data_layout(aclDataLayout);
76 output.info()->set_data_layout(aclDataLayout);
78 m_Mean = std::make_unique<arm_compute::Tensor>();
79 BuildArmComputeTensor(*m_Mean,
m_Data.m_Mean->GetTensorInfo());
81 m_Variance = std::make_unique<arm_compute::Tensor>();
82 BuildArmComputeTensor(*m_Variance,
m_Data.m_Variance->GetTensorInfo());
84 m_Gamma = std::make_unique<arm_compute::Tensor>();
85 BuildArmComputeTensor(*m_Gamma,
m_Data.m_Gamma->GetTensorInfo());
87 m_Beta = std::make_unique<arm_compute::Tensor>();
88 BuildArmComputeTensor(*m_Beta,
m_Data.m_Beta->GetTensorInfo());
92 auto layer = std::make_unique<arm_compute::NEBatchNormalizationLayer>();
93 layer->configure(&input,
101 m_Layer.reset(layer.release());
120 void NeonBatchNormalizationWorkload::FreeUnusedTensors()
122 FreeTensorIfUnused(m_Mean);
123 FreeTensorIfUnused(m_Variance);
124 FreeTensorIfUnused(m_Gamma);
125 FreeTensorIfUnused(m_Beta);
#define ARMNN_SCOPED_PROFILING_EVENT_NEON_NAME_GUID(label)
Creates a profiling event that uses GetGuid() and GetName() from the calling class.
#define ARMNN_REPORT_PROFILING_WORKLOAD_DESC(name, desc, infos, guid)
NeonBatchNormalizationWorkload(const BatchNormalizationQueueDescriptor &descriptor, const WorkloadInfo &info)
virtual void Execute() const override
Copyright (c) 2021 ARM Limited and Contributors.
void InitializeArmComputeTensorData(arm_compute::Tensor &tensor, TensorInfo tensorInfo, const ITensorHandle *handle)
arm_compute::ActivationLayerInfo ConvertAdditionalInfoToAclActivationLayerInfo(const QueueDescriptor &queueDescriptor)
arm_compute::Status NeonBatchNormalizationValidate(const TensorInfo &input, const TensorInfo &output, const TensorInfo &mean, const TensorInfo &var, const TensorInfo &beta, const TensorInfo &gamma, const BatchNormalizationDescriptor &descriptor, const ActivationDescriptor *activationDescriptor)
arm_compute::ActivationLayerInfo ConvertActivationDescriptorToAclActivationLayerInfo(const ActivationDescriptor &actDesc)
An ActivationDescriptor for the ActivationLayer.
A BatchNormalizationDescriptor for the BatchNormalizationLayer.
float m_Eps
Value to add to the variance. Used to avoid dividing by zero.
DataLayout m_DataLayout
The data layout to be used (NCHW, NHWC).
std::vector< ITensorHandle * > m_Inputs
std::vector< ITensorHandle * > m_Outputs
void ValidateInputsOutputs(const std::string &descName, unsigned int numExpectedIn, unsigned int numExpectedOut) const
LayerDescriptor m_Parameters
Contains information about TensorInfos of a layer.