13 #include <DataTypeUtils.hpp> 23 template<
typename T,
typename B>
32 std::vector<T>& weights,
34 std::vector<T>& input,
36 bool transposeWeights,
39 std::unique_ptr<armnn::ITensorHandle> input0Handle = tensorHandleFactory.
CreateTensorHandle(inputTensorInfo);
40 std::unique_ptr<armnn::ITensorHandle> input1Handle = tensorHandleFactory.
CreateTensorHandle(weightsTensorInfo);
41 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.
CreateTensorHandle(outputTensorInfo);
53 AddInputToWorkload(data, info, inputTensorInfo, input0Handle.get());
54 AddInputToWorkload(data, info, weightsTensorInfo, input1Handle.get());
55 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
58 data.m_Weight = &weightsTensor;
59 data.m_Bias = &biasTensor;
61 data.m_Parameters.m_BiasEnabled = biasEnabled;
62 data.m_Parameters.m_TransposeWeightMatrix = transposeWeights;
63 data.m_Parameters.m_ConstantWeights = constantWeights;
65 std::unique_ptr<armnn::ITensorHandle> input2Handle =
nullptr;
69 AddInputToWorkload(data, info, biasesTensorInfo, input2Handle.get());
77 input0Handle->Allocate();
78 input1Handle->Allocate();
79 outputHandle->Allocate();
84 input2Handle->Allocate();
88 ExecuteWorkload(*workload, memoryManager);
96 template<armnn::DataType ArmnnType,
typename T>
102 bool constantWeights)
104 constexpr
static unsigned int inputWidth = 3u;
105 constexpr
static unsigned int inputHeight = 2u;
106 constexpr
static unsigned int inputChannels = 1u;
108 constexpr
static unsigned int inputSize = inputWidth * inputHeight * inputChannels;
110 constexpr
static unsigned int outputChannels = 2u;
112 armnn::TensorInfo inputTensorInfo({ 1, inputChannels, inputHeight, inputWidth }, ArmnnType);
114 inputTensorInfo.SetQuantizationOffset(63);
118 outputTensorInfo.SetQuantizationOffset(biasEnabled ? -50 : 10);
122 weightsDesc.SetQuantizationOffset(93);
125 biasesDesc.
SetQuantizationScale(inputTensorInfo.GetQuantizationScale() * weightsDesc.GetQuantizationScale());
126 biasesDesc.SetQuantizationOffset(0);
130 std::vector<T> input = ConvertToDataType<ArmnnType>(
137 std::vector<T> weights = ConvertToDataType<ArmnnType>(
139 -8.4f, 20.0f, -10.4f, -8, 16.4f, -11.8f,
140 23.4f, 10.4f, -14.0f, -3.8f, -11.8f, 11.4f
144 std::vector<int32_t> bias = {9250, 67500};
146 result = SimpleFullyConnectedTestImpl<T>(workloadFactory,
162 result.
m_ExpectedData = ConvertToDataType<ArmnnType>({80.f, 1460.f}, outputTensorInfo);
166 result.
m_ExpectedData = ConvertToDataType<ArmnnType>({-107.04f, 110.f}, outputTensorInfo);
178 template<armnn::DataType ArmnnType,
typename T = armnn::ResolveType<ArmnnType>>
183 bool transposeWeights,
187 unsigned int inputWidth = 1;
188 unsigned int inputHeight = 1;
189 unsigned int inputChannels = 5;
190 unsigned int inputNum = 1;
192 unsigned int outputChannels = 1;
193 unsigned int outputNum = 1;
201 unsigned int inputShape[] = { inputNum, inputChannels, inputHeight, inputWidth };
202 unsigned int outputShape[] = { outputNum, outputChannels };
203 unsigned int weightsShape[] = { inputChannels, outputChannels };
204 if (transposeWeights)
206 std::swap(weightsShape[0], weightsShape[1]);
209 unsigned int biasShape[] = { outputChannels };
217 if(armnn::IsQuantizedType<T>())
227 std::vector<T> input = armnnUtils::QuantizedVector<T>(
229 1.0f, 10.0f, 100.0f, 1000.0f, 10000.0f,
233 std::vector<T> weights = armnnUtils::QuantizedVector<T>(
235 2.0f, 3.0f, 4.0f, 5.0f, 6.0f
239 std::vector<T> biasValues({900000.f});
241 result = SimpleFullyConnectedTestImpl<T>(
245 inputTensorInfo, outputTensorInfo,
246 weightsDesc, biasesDesc,
247 weights, biasValues, input,
248 true, transposeWeights, true
251 result.
m_ExpectedData = armnnUtils::QuantizedVector<T>({ 965432.0f }, qScale, qOffset);
261 FullyConnectedTest<armnn::DataType::QAsymmU8>(
269 FullyConnectedTest<armnn::DataType::QSymmS16>(
285 bool transposeWeights)
287 unsigned int inputWidth = 1;
288 unsigned int inputHeight = 1;
289 unsigned int inputChannels = 5;
290 unsigned int inputNum = 2;
292 unsigned int outputChannels = 3;
293 unsigned int outputNum = 2;
301 unsigned int inputShape[] = { inputNum, inputChannels, inputHeight, inputWidth };
302 unsigned int outputShape[] = { outputNum, outputChannels };
303 unsigned int weightsShape[] = { inputChannels, outputChannels };
305 if (transposeWeights)
307 std::swap(weightsShape[0], weightsShape[1]);
310 unsigned int biasShape[] = { outputChannels };
319 std::vector<float> input =
321 1.0f, 2.0f, 3.0f, 4.0f, 5.0f,
322 5.0f, 4.0f, 3.0f, 2.0f, 1.0f
325 std::vector<float> weights =
334 if (transposeWeights)
338 .5f, .5f, .5f, .5f, .5f,
339 2.f, 2.f, 2.f, 2.f, 2.f,
340 .5f, 1.f, 2.f, 3.f, 4.f
344 std::vector<float> biasValues({0.f, 0.f, 0.f});
347 biasValues = std::vector<float>({10.f, 20.f, 30.f});
350 result = SimpleFullyConnectedTestImpl<float>(
354 inputTensorInfo, outputTensorInfo,
355 weightsDesc, biasesDesc,
356 weights, biasValues, input,
357 biasEnabled, transposeWeights, true
360 std::vector<float> expectedOutput =
362 0.5f + 1.0f + 1.5f + 2.0f + 2.5f + biasValues[0],
363 2.0f + 4.0f + 6.0f + 8.0f + 10.f + biasValues[1],
364 0.5f + 2.0f + 6.0f + 12.f + 20.f + biasValues[2],
366 2.5f + 2.0f + 1.5f + 1.0f + 0.5f + biasValues[0],
367 10.0f + 8.0f + 6.0f + 4.0f + 2.f + biasValues[1],
368 2.5f + 4.0f + 6.0f + 6.f + 4.f + biasValues[2]
379 bool transposeWeights)
381 return FullyConnectedLargeTestCommon<armnn::DataType::Float32>(workloadFactory,
LayerTestResult< float, 2 > FullyConnectedFloat32Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory, bool biasEnabled, bool transposeWeights)
void swap(OriginsDescriptor &first, OriginsDescriptor &second)
LayerTestResult< T, 2 > SimpleFullyConnectedTestImpl(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory, armnn::TensorInfo inputTensorInfo, armnn::TensorInfo outputTensorInfo, armnn::TensorInfo weightsTensorInfo, armnn::TensorInfo biasesTensorInfo, std::vector< T > &weights, std::vector< B > &bias, std::vector< T > &input, bool biasEnabled, bool transposeWeights, bool constantWeights)
void AllocateAndCopyDataToITensorHandle(armnn::ITensorHandle *tensorHandle, const void *memory)
LayerTestResult< T, 2 > FullyConnectedTest(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory, bool biasEnabled, bool constantWeights)
armnn::Optional< armnn::DataType > GetBiasTypeFromWeightsType(armnn::Optional< armnn::DataType > weightsType)
std::shared_ptr< IMemoryManager > IMemoryManagerSharedPtr
std::vector< T > m_ExpectedData
void CopyDataFromITensorHandle(void *mem, const armnn::ITensorHandle *tensorHandle)
void SetQuantizationScale(float scale)
std::vector< T > m_ActualData
void CopyDataToITensorHandle(armnn::ITensorHandle *tensorHandle, const void *memory)
LayerTestResult< float, 2 > FullyConnectedLargeTest(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory, bool transposeWeights)
LayerTestResult< T, 2 > FullyConnectedLargeTestCommon(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory, bool transposeWeights, float qScale=0.0f, int32_t qOffset=0)
Contains information about TensorInfos of a layer.
void SetQuantizationOffset(int32_t offset)
virtual std::unique_ptr< IWorkload > CreateWorkload(LayerType type, const QueueDescriptor &descriptor, const WorkloadInfo &info) const
virtual std::unique_ptr< ITensorHandle > CreateTensorHandle(const TensorInfo &tensorInfo) const =0
unsigned int GetNumElements() const