23 #include <boost/numeric/conversion/cast.hpp> 32 static std::vector<float> Bias2({0, 2});
34 static std::vector<float> Bias4({1, 2, 3, 4});
36 static std::vector<float> Bias8({1, 2, 3, 4, 1, 2, 3, 4});
39 static std::vector<float> ConvInput3x8x16({
40 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f,
41 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
42 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f,
43 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f,
44 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f,
45 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f,
46 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f,
47 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f,
48 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
49 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
50 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
51 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
52 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
53 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
54 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
55 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
56 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
57 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
58 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
59 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
60 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
61 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
62 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
63 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
73 template<armnn::DataType ArmnnType,
typename T = armnn::ResolveType<ArmnnType>>
74 boost::multi_array<T, 1>
GetBias2(
bool biasEnabled,
float qScale)
79 boost::multi_array<T, 1> bias = MakeTensor<T, 1>(biasDesc, QuantizedVector<T>(Bias2, qScale, 0.0f));
84 return boost::multi_array<T, 1>();
89 template<armnn::DataType ArmnnType,
typename T = armnn::ResolveType<ArmnnType>>
90 boost::multi_array<T, 1>
GetBias4(
bool biasEnabled,
float qScale)
95 boost::multi_array<T, 1> bias = MakeTensor<T, 1>(biasDesc, QuantizedVector<T>(Bias4, qScale, 0.0f));
100 return boost::multi_array<T, 1>();
105 template<armnn::DataType ArmnnType,
typename T = armnn::ResolveType<ArmnnType>>
106 boost::multi_array<T, 1>
GetBias8(
bool biasEnabled,
float qScale)
110 armnn::TensorInfo biasDesc({
static_cast<unsigned int>(Bias4.size())}, ArmnnType);
111 boost::multi_array<T, 1> bias = MakeTensor<T, 1>(biasDesc, QuantizedVector<T>(Bias8, qScale, 0.0f));
116 return boost::multi_array<T, 1>();
121 template<armnn::DataType ArmnnType,
typename T = armnn::ResolveType<ArmnnType>>
126 const unsigned int outputChannels = outputInfo.
GetShape()[channelsIndex];
128 switch (outputChannels)
133 return GetBias2<ArmnnType>(biasEnabled, qScale);
137 return GetBias4<ArmnnType>(biasEnabled, qScale);
141 return GetBias8<ArmnnType>(biasEnabled, qScale);
153 struct FullyConnectedBiasTypeForInputType;
156 struct FullyConnectedBiasTypeForInputType<float>
162 struct FullyConnectedBiasTypeForInputType<uint8_t>
164 using Type = int32_t;
168 template<
typename T,
typename B>
169 void ApplyBias(std::vector<T>& v,
float vScale, int32_t vOffset,
170 const std::vector<B>& bias,
float bScale, int32_t bOffset, uint32_t w, uint32_t h)
172 ARMNN_ASSERT_MSG((armnn::IsQuantizedType<T>() && vScale != 0.0f) || (!armnn::IsQuantizedType<T>()),
173 "Invalid type and parameter combination.");
174 ARMNN_ASSERT_MSG((armnn::IsQuantizedType<B>() && bScale != 0.0f) || (!armnn::IsQuantizedType<B>()),
175 "Invalid type and parameter combination.");
178 for (uint32_t i = 0; i < bias.size(); ++i)
181 for (uint32_t y = 0; y < h; ++y)
183 for (uint32_t x = 0; x < w; ++x)
185 uint32_t offset = (i * h + y) * w + x;
187 T& outRef = v[offset];
189 outRef = SelectiveQuantize<T>(dOutput + dBias, vScale, vOffset);
204 const boost::multi_array<T, 4>& originalInput,
205 const boost::multi_array<T, 4>& originalKernel,
206 const boost::multi_array<B, 1>& bias,
207 const boost::multi_array<T, 4>& originalOutputExpected,
211 uint32_t padLeft = 0,
213 uint32_t padRight = 0,
214 uint32_t padBottom = 0,
215 uint32_t strideX = 1,
216 uint32_t strideY = 1,
217 uint32_t dilationX = 1,
218 uint32_t dilationY = 1)
226 unsigned int outputHeight =
boost::numeric_cast<
unsigned int>(originalOutputExpected.shape()[2]);
227 unsigned int outputWidth =
boost::numeric_cast<
unsigned int>(originalOutputExpected.shape()[3]);
228 unsigned int outputChannels =
boost::numeric_cast<
unsigned int>(originalOutputExpected.shape()[1]);
229 unsigned int outputNum =
boost::numeric_cast<
unsigned int>(originalOutputExpected.shape()[0]);
233 unsigned int kernelChannels =
boost::numeric_cast<
unsigned int>(originalKernel.shape()[1]);
234 unsigned int kernelDepthMul =
boost::numeric_cast<
unsigned int>(originalKernel.shape()[0]);
236 bool biasEnabled = bias.size() > 0;
243 ARMNN_ASSERT(!biasEnabled || bias.size() == outputChannels);
253 armnn::TensorInfo biasDesc({
static_cast<unsigned int>(bias.size())}, ArmnnBType);
256 if(armnn::IsQuantizedType<T>())
258 inputTensorInfo.SetQuantizationScale(qScale);
259 inputTensorInfo.SetQuantizationOffset(qOffset);
271 std::vector<T> inputImage;
272 inputImage.assign(originalInput.data(), originalInput.data() + 1*inputChannels*inputHeight*inputWidth);
273 std::vector<T> inputData;
274 inputData.insert(inputData.end(), inputImage.begin(), inputImage.end());
275 inputData.insert(inputData.end(), inputImage.begin(), inputImage.end());
281 std::vector<T> tmp(inputData.size());
282 armnnUtils::Permute(inputTensorInfo.GetShape(), NCHWToNHWC, inputData.data(), tmp.data(),
sizeof(T));
286 auto batchedInput = MakeTensor<T, 4>(inputTensorInfo, inputData);
288 std::vector<T> outputImage;
289 outputImage.assign(originalOutputExpected.data(),
290 originalOutputExpected.data() + outputChannels*outputHeight*outputWidth);
295 std::vector<T> biasV;
296 biasV.assign(bias.data(), bias.data() + outputChannels);
299 outputWidth, outputHeight);
303 std::vector<T> outputData;
304 outputData.insert(outputData.end(), outputImage.begin(), outputImage.end());
305 outputData.insert(outputData.end(), outputImage.begin(), outputImage.end());
310 std::vector<T> tmp(outputData.size());
314 ret.
outputExpected = MakeTensor<T, 4>(outputTensorInfo, outputData);
316 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.
CreateTensorHandle(inputTensorInfo);
317 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.
CreateTensorHandle(outputTensorInfo);
324 boost::multi_array<T, 4> kernel = boost::multi_array<T, 4>(originalKernel);
336 AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
337 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
340 data.
m_Bias = &biasTensor;
352 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.
CreateConvolution2d(data, info);
353 inputHandle->Allocate();
354 outputHandle->Allocate();
358 ExecuteWorkload(*workload, memoryManager);
371 const boost::multi_array<T, 4>& input,
372 const boost::multi_array<T, 4>& kernel,
373 const boost::multi_array<B, 1>& bias,
374 const boost::multi_array<O, 4>& outputExpected,
378 uint32_t padLeft = 1,
380 uint32_t padRight = 1,
381 uint32_t padBottom = 1,
382 uint32_t strideX = 1,
383 uint32_t strideY = 1)
397 unsigned int outputChannels =
boost::numeric_cast<
unsigned int>(outputExpected.shape()[3]);
401 bool biasEnabled = bias.size() > 0;
404 armnn::TensorInfo inputTensorInfo({inputNum, inputHeight, inputWidth, inputChannels}, ArmnnType);
405 armnn::TensorInfo outputTensorInfo({outputNum, outputHeight, outputWidth, outputChannels},
407 armnn::TensorInfo kernelDesc({kernelChanMul, kernelHeight, kernelWidth, kernelChannels}, ArmnnType);
408 armnn::TensorInfo biasDesc({
static_cast<unsigned int>(bias.size())}, ArmnnBType);
411 std::vector<T> inputData;
412 inputData.assign(input.data(), input.data() + inputHeight*inputWidth*inputChannels);
413 auto batchedInput = MakeTensor<T, 4>(inputTensorInfo, inputData);
416 std::vector<O> outputData;
417 outputData.assign(outputExpected.data(), outputExpected.data() + outputHeight*outputWidth*outputChannels);
420 ret.
outputExpected = MakeTensor<O, 4>(outputTensorInfo, outputData);
422 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.
CreateTensorHandle(inputTensorInfo);
423 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.
CreateTensorHandle(outputTensorInfo);
433 data.
m_Bias = &biasTensor;
444 AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
445 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
447 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.
CreateConvolution2d(data, info);
448 inputHandle->Allocate();
449 outputHandle->Allocate();
453 ExecuteWorkload(*workload, memoryManager);
460 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType,
typename T = armnn::ResolveType<ArmnnType>>
474 unsigned int batchSize = 1;
475 unsigned int inputChannels = 2;
476 unsigned int outputChannels = 3;
477 unsigned int inputSize = 5;
478 unsigned int kernelSize = 3;
479 unsigned int padSize = 2;
480 unsigned int stride = 1;
481 unsigned int outputSize = 7;
483 armnn::TensorInfo inputInfo({batchSize, inputChannels, inputSize, 1}, ArmnnType);
484 armnn::TensorInfo outputInfo({batchSize, outputChannels, outputSize, 1}, ArmnnType);
485 armnn::TensorInfo kernelInfo({outputChannels, inputChannels, kernelSize, 1}, ArmnnType);
489 if(armnn::IsQuantizedType<T>())
492 inputInfo.SetQuantizationOffset(qOffset);
493 outputInfo.SetQuantizationScale(qScale);
494 outputInfo.SetQuantizationOffset(qOffset);
495 kernelInfo.SetQuantizationScale(qScale);
496 kernelInfo.SetQuantizationOffset(qOffset);
497 biasInfo.SetQuantizationScale(inputInfo.GetQuantizationScale()*kernelInfo.GetQuantizationScale());
498 biasInfo.SetQuantizationOffset(0);
501 std::vector<T> inputData = QuantizedVector<T>(
503 5.0f, -2.0f, 2.5f, 0.0f, 1.0f,
504 -3.0f, 3.2f, 5.0f, 2.0f, 3.0f,
506 inputInfo.GetQuantizationScale(),
507 inputInfo.GetQuantizationOffset());
509 std::vector<T> kernelData = QuantizedVector<T>(
520 kernelInfo.GetQuantizationScale(),
521 kernelInfo.GetQuantizationOffset());
523 std::vector<B> biasData =
524 QuantizedVector<B>({ 1.0f, 0.0f, 0.0f }, biasInfo.GetQuantizationScale(), biasInfo.GetQuantizationOffset());
526 std::vector<T> outputData = QuantizedVector<T>(
528 4.5f, -10.8f, 5.0f + 6.4f - 7.5f, -2.0f + 10.0f -3.0f, 2.5f + 4.0f - 4.5f, 6.0f, 1.0f,
529 -0.6f, -0.6f + 0.64f, -0.6f + 0.64f + 1.0f, 0.64f + 1.0f + 0.4f, 1.0f + 0.4f + 0.6f, 0.4f + 0.6f, 0.6f,
530 2.5f, -1.0f + 3.0f, 1.25f - 3.2f + 2.5f, -1.0f - 5.0f, 1.25f + 0.5f - 2.0f, -3.0f, 0.5f
532 outputInfo.GetQuantizationScale(),
533 outputInfo.GetQuantizationOffset());
538 ApplyBias(outputData, outputInfo.GetQuantizationScale(), outputInfo.GetQuantizationOffset(),
539 biasData, biasInfo.GetQuantizationScale(), biasInfo.GetQuantizationOffset(),
543 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.
CreateTensorHandle(inputInfo);
544 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.
CreateTensorHandle(outputInfo);
554 AddInputToWorkload(data, info, inputInfo, inputHandle.get());
555 AddOutputToWorkload(data, info, outputInfo, outputHandle.get());
558 data.
m_Bias = &biasTensor;
567 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.
CreateConvolution2d(data, info);
568 inputHandle->Allocate();
569 outputHandle->Allocate();
573 ExecuteWorkload(*workload, memoryManager);
582 template<armnn::DataType ArmnnType,
typename T = armnn::ResolveType<ArmnnType>>
595 boost::multi_array<T, 4> input = MakeTensor<T, 4>(inputDesc,
605 boost::multi_array<T, 4> kernel = MakeTensor<T, 4>(kernelDesc, {
614 const std::vector<float> outputData =
621 boost::multi_array<T, 4> expectedOutput = MakeTensor<T, 4>(outputDesc, outputData);
623 return SimpleConvolution2dNhwcTestImpl<ArmnnType, ArmnnType>(
628 boost::multi_array<T, 1>(),
635 template<armnn::DataType ArmnnType,
typename T = armnn::ResolveType<ArmnnType>>
648 boost::multi_array<T, 4> input = MakeTensor<T, 4>(inputDesc,
659 boost::multi_array<T, 4> kernel = MakeTensor<T, 4>(kernelDesc,
669 const std::vector<T> outputData =
676 boost::multi_array<T, 4> expectedOutput = MakeTensor<T, 4>(outputDesc, outputData);
678 uint32_t padLeft = 1;
680 uint32_t padRight = 1;
681 uint32_t padBottom = 1;
682 uint32_t strideX = 2;
683 uint32_t strideY = 2;
685 return SimpleConvolution2dNhwcTestImpl<ArmnnType, ArmnnType>(
690 boost::multi_array<T, 1>(),
703 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType,
typename T = armnn::ResolveType<ArmnnType>>
714 boost::multi_array<T, 4> input = MakeTensor<T, 4>(inputDesc, QuantizedVector<T>(ConvInput3x8x16, qScale, qOffset));
718 boost::multi_array<T, 4> kernel = MakeTensor<T, 4>(kernelDesc, std::vector<T>(
761 boost::multi_array<T, 4> expectedOutput = MakeTensor<T, 4>(outputDesc, std::vector<T>(
763 -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -24,
764 -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25,
765 -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f,
766 -23.5f, -23.5f, -23.5f,
767 -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f,
768 -23.5f, -23.5f, -23.5f,
770 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
771 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
772 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
773 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
777 return SimpleConvolution2dTestImpl<ArmnnType, ArmnnBType>(
782 GetBias2<ArmnnBType>(biasEnabled, qScale * qScale),
803 boost::multi_array<T, 4> input = MakeTensor<T, 4>(inputDesc, QuantizedVector<T>(ConvInput3x8x16, qScale, qOffset));
807 boost::multi_array<T, 4> kernel = MakeTensor<T, 4>(kernelDesc, std::vector<T>(
838 boost::multi_array<T, 4> expectedOutput = MakeTensor<T, 4>(outputDesc, std::vector<T>(
840 -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15,
841 -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16,
842 -14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,
843 -14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,
844 -14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,
845 -14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,
847 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
848 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
849 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
850 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
851 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
852 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
856 return SimpleConvolution2dTestImpl<ArmnnType, ArmnnBType>(
861 GetBias2<ArmnnBType>(biasEnabled, qScale * qScale),
879 boost::multi_array<T, 4> input = MakeTensor<T, 4>(inputDesc, std::vector<T>(
889 boost::multi_array<T, 4> kernel = MakeTensor<T, 4>(kernelDesc, std::vector<T>(
906 boost::multi_array<T, 4> expectedOutput = MakeTensor<T, 4>(outputDesc, std::vector<T>(
909 -242, -594, -934, -372, 0, 0,
910 -495, -1190, -1850, -725, 0, 0,
911 -538, -1256, -1916, -748, 0, 0,
912 -273, -626, -946, -363, 0, 0,
919 return SimpleConvolution2dTestImpl<ArmnnType, ArmnnBType>(
924 GetBias2<ArmnnBType>(
false, qScale * qScale),
946 boost::multi_array<T, 4> input = MakeTensor<T, 4>(inputDesc, std::vector<T>(
953 }, qScale, qOffset)));
957 boost::multi_array<T, 4> kernel = MakeTensor<T, 4>(kernelDesc, std::vector<T>(
968 std::vector<T> myVec(outputDesc.GetNumElements(), 0);
969 boost::multi_array<T, 4> expectedOutput = MakeTensor<T, 4>(outputDesc, std::vector<T>(
971 -7140, -10580, -13940, -9300, -5230,
972 -9590, -14120, -18520, -12290, -6860,
973 -9980, -14560, -18960, -12560, -7000,
974 -7518, -10904, -14144, -9318, -5152,
975 -5032, -7256, -9376, -6142, -3368,
979 return SimpleConvolution2dTestImpl<ArmnnType, ArmnnBType>(
984 GetBias2<ArmnnBType>(
false, qScale * qScale),
995 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType,
typename T = armnn::ResolveType<ArmnnType>>
999 const std::vector<float>& inputNoQuantizedValues,
1001 const std::vector<float>& kernelNoQuantizedValues,
1003 const std::vector<float>& outputExpectedNoQuantizedValues,
1008 uint32_t padLeft = 0,
1009 uint32_t padTop = 0,
1010 uint32_t padRight = 0,
1011 uint32_t padBottom = 0,
1012 uint32_t strideX = 1,
1013 uint32_t strideY = 1,
1014 bool biasEnabled =
false 1050 auto input = MakeTensor<T, 4>(inputTensorInfo,
1051 std::vector<T>(QuantizedVector<T>(inputNoQuantizedValues,
1052 inputTensorInfo.GetQuantizationScale(),
1053 inputTensorInfo.GetQuantizationOffset())));
1054 auto kernel = MakeTensor<T, 4>(kernelTensorInfo,
1055 std::vector<T>(QuantizedVector<T>(kernelNoQuantizedValues,
1056 kernelTensorInfo.GetQuantizationScale(),
1057 kernelTensorInfo.GetQuantizationOffset())));
1058 auto expectedOutput =
1059 MakeTensor<T, 4>(outputTensorInfo,
1060 std::vector<T>(QuantizedVector<T>(outputExpectedNoQuantizedValues,
1061 outputTensorInfo.GetQuantizationScale(),
1062 outputTensorInfo.GetQuantizationOffset())));
1064 return SimpleConvolution2dTestImpl<ArmnnType, ArmnnBType>(
1069 GetBias2<ArmnnBType>(biasEnabled, qScale * qScale),
1084 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType,
typename T>
1092 std::vector<float> inputNoQuantizedValues =
1094 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1095 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1096 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1097 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
1098 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
1099 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
1100 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1101 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1102 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1103 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
1107 std::vector<float> kernelNoQuantizedValues =
1117 std::vector<float> outputExpectedNoQuantizedValues =
1125 return Convolution2d3x3DilationTestCommon<ArmnnType, ArmnnBType>(
1128 inputNoQuantizedValues,
1130 kernelNoQuantizedValues,
1132 outputExpectedNoQuantizedValues,
1140 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType,
typename T>
1148 std::vector<float> inputNoQuantizedValues =
1150 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1151 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1152 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1153 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
1154 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
1155 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
1156 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1157 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1158 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1159 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1161 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1162 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1163 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1164 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
1165 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
1166 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
1167 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1168 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1169 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1170 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
1174 std::vector<float> kernelNoQuantizedValues =
1188 std::vector<float> outputExpectedNoQuantizedValues =
1196 return Convolution2d3x3DilationTestCommon<ArmnnType, ArmnnBType>(
1199 inputNoQuantizedValues,
1201 kernelNoQuantizedValues,
1203 outputExpectedNoQuantizedValues,
1211 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType,
typename T>
1219 std::vector<float> inputNoQuantizedValues =
1221 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1222 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1223 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1224 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1225 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1226 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1227 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1228 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1229 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1230 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
1234 std::vector<float> kernelNoQuantizedValues =
1244 std::vector<float> outputExpectedNoQuantizedValues =
1251 uint32_t padLeft = 1;
1252 uint32_t padTop = 1;
1253 uint32_t padRight = 1;
1254 uint32_t padBottom = 1;
1256 return Convolution2d3x3DilationTestCommon<ArmnnType, ArmnnBType>(
1259 inputNoQuantizedValues,
1261 kernelNoQuantizedValues,
1263 outputExpectedNoQuantizedValues,
1278 template<armnn::DataType ArmnnType,
typename T = armnn::ResolveType<ArmnnType>>
1284 unsigned int inputHeight = 8;
1285 unsigned int inputWidth = 16;
1286 unsigned int inputChannels = 3;
1287 unsigned int inputNum = 5;
1289 unsigned int kernelHeight = 3;
1290 unsigned int kernelWidth = 3;
1292 unsigned int strideX = 2;
1293 unsigned int strideY = 3;
1294 unsigned int padX = 1;
1295 unsigned int padY = 1;
1297 unsigned int outputNum = inputNum;
1298 unsigned int outputChannels = 2;
1299 unsigned int outputHeight = (inputHeight + 2 * padY - kernelHeight + strideY) / strideY;
1300 unsigned int outputWidth = (inputWidth + 2 * padX - kernelWidth + strideX) / strideX;
1307 unsigned int inputShape[] = {inputNum, inputChannels, inputHeight, inputWidth};
1308 unsigned int outputShape[] = {outputNum, outputChannels, outputHeight, outputWidth};
1309 unsigned int kernelShape[] = {outputChannels, inputChannels, kernelHeight, kernelWidth};
1310 unsigned int biasShape[] = {outputChannels};
1319 auto input = MakeRandomTensor<T, 4>(inputTensorInfo, 124908);
1320 auto kernel = MakeRandomTensor<T, 4>(kernelDesc, 891234);
1321 auto bias = MakeRandomTensor<T, 1>(biasDesc, 1028);
1323 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.
CreateTensorHandle(inputTensorInfo);
1324 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.
CreateTensorHandle(outputTensorInfo);
1334 AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
1335 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
1337 data.
m_Bias = &biasTensor;
1346 std::unique_ptr<armnn::ITensorHandle> outputHandleRef = refWorkloadFactory.
CreateTensorHandle(outputTensorInfo);
1347 std::unique_ptr<armnn::ITensorHandle> inputHandleRef = refWorkloadFactory.
CreateTensorHandle(inputTensorInfo);
1351 SetWorkloadInput(refData, refInfo, 0, inputTensorInfo, inputHandleRef.get());
1352 SetWorkloadOutput(refData, refInfo, 0, outputTensorInfo, outputHandleRef.get());
1354 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.
CreateConvolution2d(data, info);
1355 std::unique_ptr<armnn::IWorkload> workloadRef = refWorkloadFactory.
CreateConvolution2d(refData, refInfo);
1357 outputHandleRef->Allocate();
1358 inputHandleRef->Allocate();
1360 inputHandle->Allocate();
1361 outputHandle->Allocate();
1366 ExecuteWorkload(*workload, memoryManager);
1368 workloadRef->PostAllocationConfigure();
1369 workloadRef->Execute();
1389 std::vector<armnn::BFloat16> inputValues = armnnUtils::QuantizedVector<armnn::BFloat16>(
1419 auto input = MakeTensor<armnn::BFloat16, 4>(inputDesc, inputValues);
1424 std::vector<armnn::BFloat16> kernelValues = armnnUtils::QuantizedVector<armnn::BFloat16>(
1438 auto kernel = MakeTensor<armnn::BFloat16, 4>(kernelDesc, kernelValues);
1444 const std::vector<float> outputData =
1457 boost::multi_array<float, 4> expectedOutput = MakeTensor<float, 4>(outputDesc, outputData);
1459 uint32_t padLeft = 1;
1460 uint32_t padTop = 1;
1461 uint32_t padRight = 1;
1462 uint32_t padBottom = 1;
1463 uint32_t strideX = 2;
1464 uint32_t strideY = 2;
1472 boost::multi_array<float, 1>(),
1497 std::vector<armnn::BFloat16> inputValues = armnnUtils::QuantizedVector<armnn::BFloat16>(
1527 auto input = MakeTensor<armnn::BFloat16, 4>(inputDesc, inputValues);
1532 std::vector<armnn::BFloat16> kernelValues = armnnUtils::QuantizedVector<armnn::BFloat16>(
1546 auto kernel = MakeTensor<armnn::BFloat16, 4>(kernelDesc, kernelValues);
1552 const std::vector<float> outputData =
1565 boost::multi_array<float, 4> expectedOutput = MakeTensor<float, 4>(outputDesc, outputData);
1567 uint32_t padLeft = 1;
1568 uint32_t padTop = 1;
1569 uint32_t padRight = 1;
1570 uint32_t padBottom = 1;
1571 uint32_t strideX = 2;
1572 uint32_t strideY = 2;
1580 boost::multi_array<float, 1>(),
1602 const boost::multi_array<T, 4>& input,
1603 const boost::multi_array<T, 4>& kernel,
1604 const boost::multi_array<B, 1>& bias,
1605 const boost::multi_array<T, 4>& outputExpected,
1609 uint32_t padLeft = 0,
1610 uint32_t padTop = 0,
1611 uint32_t padRight = 0,
1612 uint32_t padBottom = 0,
1613 uint32_t strideX = 1,
1614 uint32_t strideY = 1)
1625 unsigned int outputChannels =
boost::numeric_cast<
unsigned int>(outputExpected.shape()[1]);
1630 bool biasEnabled = bias.size() > 0;
1631 ARMNN_ASSERT(!biasEnabled || bias.size() == outputChannels);
1638 armnn::TensorInfo kernelDesc({kernelChanMul, kernelChannels, kernelHeight, kernelWidth}, ArmnnType);
1639 armnn::TensorInfo biasDesc({
static_cast<unsigned int>(bias.size())}, ArmnnBType);
1642 if (armnn::IsQuantizedType<T>())
1644 inputTensorInfo.SetQuantizationScale(qScale);
1645 inputTensorInfo.SetQuantizationOffset(qOffset);
1648 kernelDesc.SetQuantizationScale(qScale);
1649 kernelDesc.SetQuantizationOffset(qOffset);
1650 biasDesc.SetQuantizationScale(qScale*qScale);
1651 biasDesc.SetQuantizationOffset(0);
1655 std::vector<T> inputData;
1656 inputData.assign(input.data(), input.data() + inputChannels*inputHeight*inputWidth);
1662 std::vector<T> tmp(inputData.size());
1663 armnnUtils::Permute(inputTensorInfo.GetShape(), NCHWToNHWC, inputData.data(), tmp.data(),
sizeof(T));
1667 auto batchedInput = MakeTensor<T, 4>(inputTensorInfo, inputData);
1670 std::vector<T> outputData;
1671 outputData.assign(outputExpected.data(), outputExpected.data() + outputChannels*outputHeight*outputWidth);
1674 std::vector<T> biasV;
1675 biasV.assign(bias.data(), bias.data() + outputChannels);
1677 biasV, biasDesc.GetQuantizationScale(), biasDesc.GetQuantizationOffset(),
1678 outputWidth, outputHeight);
1686 std::vector<T> tmp(outputData.size());
1691 ret.outputExpected = MakeTensor<T, 4>(outputTensorInfo, outputData);
1693 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.
CreateTensorHandle(inputTensorInfo);
1694 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.
CreateTensorHandle(outputTensorInfo);
1708 data.
m_Bias = &biasTensor;
1719 AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
1720 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
1723 inputHandle->Allocate();
1724 outputHandle->Allocate();
1728 ExecuteWorkload(*workload, memoryManager);
1735 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType,
typename T = armnn::ResolveType<ArmnnType>>
1746 unsigned int inputHeight = 3;
1747 unsigned int inputWidth = 3;
1748 unsigned int inputChannels = 2;
1749 unsigned int inputNum = 1;
1751 unsigned int kernelHeight = 3;
1752 unsigned int kernelWidth = 3;
1753 unsigned int kernelChannels = inputChannels;
1754 unsigned int kernelDepthMultiplier = 1;
1756 unsigned int outputHeight = 1;
1757 unsigned int outputWidth = 1;
1758 unsigned int outputChannels = kernelChannels;
1759 unsigned int outputNum = inputNum;
1765 armnn::TensorInfo kernelDesc({kernelDepthMultiplier, kernelChannels, kernelHeight, kernelWidth},
1770 if(armnn::IsQuantizedType<T>())
1776 kernelDesc.SetQuantizationScale(qScale);
1777 kernelDesc.SetQuantizationOffset(qOffset);
1778 biasDesc.SetQuantizationScale(qScale*qScale);
1779 biasDesc.SetQuantizationOffset(0);
1781 std::vector<T> inputData = std::vector<T>(
1782 QuantizedVector<T>({
1798 std::vector<T> tmp(inputData.size());
1802 auto input = MakeTensor<T, 4>(inputTensorInfo, inputData);
1804 std::vector<B> biasV(QuantizedVector<B>({ 0, 2 },
1805 biasDesc.GetQuantizationScale(),
1806 biasDesc.GetQuantizationOffset()));
1808 auto bias = MakeTensor<B, 1>(biasDesc, biasV);
1810 std::vector<T> kernelData = std::vector<T>(
1811 QuantizedVector<T>({
1820 kernelDesc.GetQuantizationScale(),
1821 kernelDesc.GetQuantizationOffset()));
1823 auto kernel = MakeTensor<T, 4>(kernelDesc, kernelData);
1826 std::vector<T> outputImage(
1827 QuantizedVector<T>({ 0.f, 0.f },
1836 biasV, biasDesc.GetQuantizationScale(), biasDesc.GetQuantizationOffset(),
1837 outputWidth, outputHeight);
1843 std::vector<T> tmp(outputImage.size());
1848 ret.outputExpected = MakeTensor<T, 4>(outputTensorInfo, outputImage);
1850 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.
CreateTensorHandle(inputTensorInfo);
1851 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.
CreateTensorHandle(outputTensorInfo);
1861 AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
1862 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
1865 data.
m_Bias = &biasTensor;
1876 inputHandle->Allocate();
1877 outputHandle->Allocate();
1881 ExecuteWorkload(*workload, memoryManager);
1888 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType,
typename T = armnn::ResolveType<ArmnnType>>
1899 unsigned int depthMultiplier = 2;
1901 unsigned int inputHeight = 8;
1902 unsigned int inputWidth = 16;
1903 unsigned int inputChannels = 2;
1904 unsigned int inputBatchSize = 1;
1906 unsigned int kernelHeight = 5;
1907 unsigned int kernelWidth = 3;
1909 unsigned int outputHeight = inputHeight - kernelHeight + 1 + 2;
1910 unsigned int outputWidth = (inputWidth - kernelWidth + 1)/2;
1911 unsigned int outputChannels = inputChannels * depthMultiplier;
1912 unsigned int outputBatchSize = inputBatchSize;
1915 inputBatchSize, inputChannels, inputHeight, inputWidth, layout, ArmnnType);
1917 outputBatchSize, outputChannels, outputHeight, outputWidth, layout, ArmnnType);
1918 armnn::TensorInfo kernelDesc({depthMultiplier, inputChannels, kernelHeight, kernelWidth},
1923 if(armnn::IsQuantizedType<T>())
1929 kernelDesc.SetQuantizationScale(qScale);
1930 kernelDesc.SetQuantizationOffset(qOffset);
1931 biasDesc.SetQuantizationScale(qScale*qScale);
1932 biasDesc.SetQuantizationOffset(0);
1936 std::vector<T> originalInputData = std::vector<T>(
1937 QuantizedVector<T>({
1938 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f,
1939 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
1940 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f,
1941 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f,
1942 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f,
1943 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f,
1944 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f,
1945 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f,
1946 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
1947 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
1948 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
1949 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
1950 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
1951 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
1952 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
1953 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f
1958 std::vector<T> inputData = originalInputData;
1964 originalInputData.data(), inputData.data(),
sizeof(T));
1966 auto input = MakeTensor<T, 4>(inputTensorInfo, inputData);
1968 std::vector<B> biasV = QuantizedVector<B>({ 0, 2, 1, -1 },
1969 biasDesc.GetQuantizationScale(),
1970 biasDesc.GetQuantizationOffset());
1972 auto bias = MakeTensor<B, 1>(biasDesc, biasV);
1974 std::vector<T> kernelData = std::vector<T>(
1975 QuantizedVector<T>({
2000 kernelDesc.GetQuantizationScale(),
2001 kernelDesc.GetQuantizationOffset()));
2003 auto kernel = MakeTensor<T, 4>(kernelDesc, kernelData);
2006 std::vector<T> originalOutputImage = std::vector<T>(
2007 QuantizedVector<T>({
2008 3.5f, 3.5f, 3.5f, 3.5f, 3.5f, 3.5f, 3.5f,
2009 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f,
2010 5.0f, 5.0f, 5.0f, 5.0f, 5.0f, 5.0f, 5.0f,
2011 6.5f, 6.5f, 6.5f, 6.5f, 6.5f, 6.5f, 6.5f,
2012 6.5f, 6.5f, 6.5f, 6.5f, 6.5f, 6.5f, 6.5f,
2013 5.0f, 5.0f, 5.0f, 5.0f, 5.0f, 5.0f, 5.0f,
2015 -0.5f, -0.5f, -0.5f, -0.5f, -0.5f, -0.5f, -0.5f,
2016 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
2017 -0.5f, -0.5f, -0.5f, -0.5f, -0.5f, -0.5f, -0.5f,
2018 -0.5f, -0.5f, -0.5f, -0.5f, -0.5f, -0.5f, -0.5f,
2019 -0.5f, -0.5f, -0.5f, -0.5f, -0.5f, -0.5f, -0.5f,
2020 -0.5f, -0.5f, -0.5f, -0.5f, -0.5f, -0.5f, -0.5f,
2022 8.0f, 8.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
2023 10.0f, 10.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
2024 10.0f, 10.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
2025 10.0f, 10.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
2026 10.0f, 10.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
2027 8.0f, 8.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
2029 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
2030 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
2031 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
2032 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
2033 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
2034 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f
2046 biasDesc.GetQuantizationScale(),
2047 biasDesc.GetQuantizationOffset(),
2053 std::vector<T> outputImage = originalOutputImage;
2057 originalOutputImage.data(), outputImage.data(),
sizeof(T));
2060 ret.outputExpected = MakeTensor<T, 4>(outputTensorInfo, outputImage);
2062 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.
CreateTensorHandle(inputTensorInfo);
2063 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.
CreateTensorHandle(outputTensorInfo);
2073 AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
2074 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
2077 data.
m_Bias = &biasTensor;
2088 inputHandle->Allocate();
2089 outputHandle->Allocate();
2093 ExecuteWorkload(*workload, memoryManager);
2105 const boost::multi_array<T, 4>& originalInput,
2106 const boost::multi_array<T, 4>& originalKernel,
2107 const boost::multi_array<B, 1>& bias,
2108 const boost::multi_array<T, 4>& originalOutputExpected,
2112 uint32_t padLeft = 0,
2113 uint32_t padTop = 0,
2114 uint32_t padRight = 0,
2115 uint32_t padBottom = 0,
2116 uint32_t strideX = 1,
2117 uint32_t strideY = 1,
2118 uint32_t dilationX = 1,
2119 uint32_t dilationY = 1)
2126 unsigned int outputHeight =
boost::numeric_cast<
unsigned int>(originalOutputExpected.shape()[2]);
2127 unsigned int outputWidth =
boost::numeric_cast<
unsigned int>(originalOutputExpected.shape()[3]);
2128 unsigned int outputChannels =
boost::numeric_cast<
unsigned int>(originalOutputExpected.shape()[1]);
2129 unsigned int outputNum =
boost::numeric_cast<
unsigned int>(originalOutputExpected.shape()[0]);
2133 unsigned int kernelChannels =
boost::numeric_cast<
unsigned int>(originalKernel.shape()[1]);
2134 unsigned int kernelDepthMul =
boost::numeric_cast<
unsigned int>(originalKernel.shape()[0]);
2136 bool biasEnabled = bias.size() > 0;
2143 ARMNN_ASSERT(!biasEnabled || bias.size() == outputChannels);
2153 armnn::TensorInfo kernelDesc({kernelDepthMul, kernelChannels, kernelHeight, kernelWidth}, ArmnnType);
2155 armnn::TensorInfo biasDesc({
static_cast<unsigned int>(bias.size())}, ArmnnBType);
2158 if(armnn::IsQuantizedType<T>())
2160 inputTensorInfo.SetQuantizationScale(qScale);
2161 inputTensorInfo.SetQuantizationOffset(qOffset);
2164 kernelDesc.SetQuantizationScale(qScale);
2165 kernelDesc.SetQuantizationOffset(qOffset);
2166 biasDesc.SetQuantizationScale(qScale*qScale);
2167 biasDesc.SetQuantizationOffset(0);
2173 std::vector<T> input;
2174 input.assign(originalInput.data(), originalInput.data() + 1*inputChannels*inputHeight*inputWidth);
2175 std::vector<T> inputData;
2176 inputData.insert(inputData.end(), input.begin(), input.end());
2177 inputData.insert(inputData.end(), input.begin(), input.end());
2183 std::vector<T> tmp(inputData.size());
2184 armnnUtils::Permute(inputTensorInfo.GetShape(), NCHWToNHWC, inputData.data(), tmp.data(),
sizeof(T));
2188 auto batchedInput = MakeTensor<T, 4>(inputTensorInfo, inputData);
2190 std::vector<T> output;
2191 output.assign(originalOutputExpected.data(),
2192 originalOutputExpected.data() + outputChannels*outputHeight*outputWidth);
2197 std::vector<T> biasV;
2198 biasV.assign(bias.data(), bias.data() + outputChannels);
2200 biasV, biasDesc.GetQuantizationScale(), biasDesc.GetQuantizationOffset(),
2201 outputWidth, outputHeight);
2205 std::vector<T> outputData;
2206 outputData.insert(outputData.end(), output.begin(), output.end());
2207 outputData.insert(outputData.end(), output.begin(), output.end());
2212 std::vector<T> tmp(outputData.size());
2216 ret.
outputExpected = MakeTensor<T, 4>(outputTensorInfo, outputData);
2218 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.
CreateTensorHandle(inputTensorInfo);
2219 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.
CreateTensorHandle(outputTensorInfo);
2226 boost::multi_array<T, 4> kernel = boost::multi_array<T, 4>(originalKernel);
2234 AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
2235 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
2238 data.
m_Bias = &biasTensor;
2251 inputHandle->Allocate();
2252 outputHandle->Allocate();
2256 ExecuteWorkload(*workload, memoryManager);
2275 auto input = MakeTensor<T, 4>(inputTensorInfo, std::vector<T>(
2276 QuantizedVector<T>({
2289 inputTensorInfo.GetQuantizationScale(),
2290 inputTensorInfo.GetQuantizationOffset())));
2294 auto kernel = MakeTensor<T, 4>(kernelTensorInfo, std::vector<T>(
2295 QuantizedVector<T>({
2306 kernelTensorInfo.GetQuantizationScale(),
2307 kernelTensorInfo.GetQuantizationOffset())));
2312 boost::multi_array<T, 4> expectedOutput = MakeTensor<T, 4>(outputTensorInfo, std::vector<T>(
2313 QuantizedVector<T>({
2314 1062, 1580, 1850, 1530, 1117,
2315 2140, 3108, 3500, 2842, 2042,
2316 3580, 5068, 5460, 4342, 3062,
2317 3618, 5072, 5390, 4248, 2971,
2318 3074, 4282, 4510, 3533, 2457,
2320 1550, 2284, 2362, 1955, 1428,
2321 2910, 4206, 4342, 3528, 2536,
2322 3390, 4886, 5022, 4068, 2916,
2323 3566, 5056, 5182, 4133, 2922,
2324 3100, 4352, 4452, 3517, 2465
2326 outputTensorInfo.GetQuantizationScale(),
2327 outputTensorInfo.GetQuantizationOffset())));
2329 return DepthwiseConvolution2dAsymmetricTestImpl<ArmnnType, ArmnnBType>(
2334 GetBias2<ArmnnBType>(biasEnabled, qScale * qScale),
2359 auto input = MakeTensor<T, 4>(inputTensorInfo, std::vector<T>(
2360 QuantizedVector<T>({
2373 inputTensorInfo.GetQuantizationScale(),
2374 inputTensorInfo.GetQuantizationOffset())));
2377 auto kernel = MakeTensor<T, 4>(kernelTensorInfo, std::vector<T>(
2378 QuantizedVector<T>({
2389 kernelTensorInfo.GetQuantizationScale(),
2390 kernelTensorInfo.GetQuantizationOffset())));
2393 boost::multi_array<T, 4> expectedOutput = MakeTensor<T, 4>(outputTensorInfo, std::vector<T>(
2394 QuantizedVector<T>({
2395 1062, 1580, 1850, 1530, 1117,
2396 2140, 3108, 3500, 2842, 2042,
2397 3580, 5068, 5460, 4342, 3062,
2398 3618, 5072, 5390, 4248, 2971,
2399 3074, 4282, 4510, 3533, 2457,
2401 1550, 2284, 2362, 1955, 1428,
2402 2910, 4206, 4342, 3528, 2536,
2403 3390, 4886, 5022, 4068, 2916,
2404 3566, 5056, 5182, 4133, 2922,
2405 3100, 4352, 4452, 3517, 2465
2407 outputTensorInfo.GetQuantizationScale(),
2408 outputTensorInfo.GetQuantizationOffset())));
2410 return DepthwiseConvolution2dTestImpl<ArmnnType, ArmnnBType>(
2415 GetBias2<ArmnnBType>(biasEnabled, qScale * qScale),
2440 auto input = MakeTensor<T, 4>(inputTensorInfo, std::vector<T>(
2441 QuantizedVector<T>({
2442 0, 0, 0, 0, 0, 0, 0, 0, 0,
2443 0, 0, 0, 0, 0, 0, 0, 0, 0,
2444 0, 0, 0, 0, 0, 0, 0, 0, 0,
2445 0, 0, 0, 1, 1, 1, 0, 0, 0,
2446 0, 0, 0, 1, 1, 1, 0, 0, 0,
2447 0, 0, 0, 1, 1, 1, 0, 0, 0,
2448 0, 0, 0, 0, 0, 0, 0, 0, 0,
2449 0, 0, 0, 0, 0, 0, 0, 0, 0,
2450 0, 0, 0, 0, 0, 0, 0, 0, 0
2452 inputTensorInfo.GetQuantizationScale(),
2453 inputTensorInfo.GetQuantizationOffset())));
2456 auto kernel = MakeTensor<T, 4>(kernelTensorInfo, std::vector<T>(
2457 QuantizedVector<T>({
2462 kernelTensorInfo.GetQuantizationScale(),
2463 kernelTensorInfo.GetQuantizationOffset())));
2465 uint32_t padLeft = 0;
2466 uint32_t padTop = 0;
2467 uint32_t padRight = 0;
2468 uint32_t padBottom = 0;
2469 uint32_t strideX = 1;
2470 uint32_t strideY = 1;
2471 uint32_t dilationX = 3;
2472 uint32_t dilationY = 3;
2476 boost::multi_array<T, 4> expectedOutput = MakeTensor<T, 4>(outputTensorInfo, std::vector<T>(
2477 QuantizedVector<T>({
2482 outputTensorInfo.GetQuantizationScale(),
2483 outputTensorInfo.GetQuantizationOffset())));
2485 return DepthwiseConvolution2dTestImpl<ArmnnType, ArmnnBType>(
2490 GetBias2<ArmnnBType>(biasEnabled, qScale * qScale),
2505 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType,
typename T = armnn::ResolveType<ArmnnType>>
2509 const std::vector<float>& inputNoQuantizedValues,
2511 const std::vector<float>& kernelNoQuantizedValues,
2513 const std::vector<float>& outputExpectedNoQuantizedValues,
2518 bool biasEnabled =
false)
2553 auto input = MakeTensor<T, 4>(inputTensorInfo,
2554 std::vector<T>(QuantizedVector<T>(inputNoQuantizedValues,
2555 inputTensorInfo.GetQuantizationScale(),
2556 inputTensorInfo.GetQuantizationOffset())));
2557 auto kernel = MakeTensor<T, 4>(kernelTensorInfo,
2558 std::vector<T>(QuantizedVector<T>(kernelNoQuantizedValues,
2559 kernelTensorInfo.GetQuantizationScale(),
2560 kernelTensorInfo.GetQuantizationOffset())));
2561 auto expectedOutput =
2562 MakeTensor<T, 4>(outputTensorInfo,
2563 std::vector<T>(QuantizedVector<T>(outputExpectedNoQuantizedValues,
2564 outputTensorInfo.GetQuantizationScale(),
2565 outputTensorInfo.GetQuantizationOffset())));
2567 uint32_t padLeft = 0;
2568 uint32_t padTop = 0;
2569 uint32_t padRight = 0;
2570 uint32_t padBottom = 0;
2571 uint32_t strideX = 1;
2572 uint32_t strideY = 1;
2574 return DepthwiseConvolution2dTestImpl<ArmnnType, ArmnnBType>(
2579 GetBias<ArmnnBType>(biasEnabled, qScale * qScale, outputTensorInfo, layout),
2594 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType,
typename T>
2602 std::vector<float> inputNoQuantizedValues =
2604 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2605 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2606 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2607 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
2608 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
2609 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
2610 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2611 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2612 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2613 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
2617 std::vector<float> kernelNoQuantizedValues =
2627 std::vector<float> outputExpectedNoQuantizedValues =
2635 return DepthwiseConvolution2d3x3DilationTestCommon<ArmnnType, ArmnnBType>(
2638 inputNoQuantizedValues,
2640 kernelNoQuantizedValues,
2642 outputExpectedNoQuantizedValues,
2650 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType,
typename T>
2658 std::vector<float> inputNoQuantizedValues =
2660 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2661 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2662 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2663 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
2664 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
2665 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
2666 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2667 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2668 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2669 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2671 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2672 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2673 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2674 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
2675 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
2676 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
2677 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2678 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2679 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2680 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
2684 std::vector<float> kernelNoQuantizedValues =
2698 std::vector<float> outputExpectedNoQuantizedValues =
2711 return DepthwiseConvolution2d3x3DilationTestCommon<ArmnnType, ArmnnBType>(
2714 inputNoQuantizedValues,
2716 kernelNoQuantizedValues,
2718 outputExpectedNoQuantizedValues,
2726 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType,
typename T>
2734 std::vector<float> inputNoQuantizedValues =
2747 std::vector<float> kernelNoQuantizedValues =
2775 std::vector<float> outputExpectedNoQuantizedValues =
2803 return DepthwiseConvolution2d3x3DilationTestCommon<ArmnnType, ArmnnBType>(
2806 inputNoQuantizedValues,
2808 kernelNoQuantizedValues,
2810 outputExpectedNoQuantizedValues,
2818 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType,
typename T>
2826 std::vector<float> inputNoQuantizedValues =
2839 std::vector<float> kernelNoQuantizedValues =
2856 std::vector<float> outputExpectedNoQuantizedValues =
2872 return DepthwiseConvolution2d3x3DilationTestCommon<ArmnnType, ArmnnBType>(
2875 inputNoQuantizedValues,
2877 kernelNoQuantizedValues,
2879 outputExpectedNoQuantizedValues,
2887 template<armnn::DataType ArmnnType,
typename T = armnn::ResolveType<ArmnnType>>
2894 unsigned int inputHeight = 8;
2895 unsigned int inputWidth = 16;
2896 unsigned int inputChannels = 3;
2897 unsigned int inputNum = 5;
2899 unsigned int kernelHeight = 3;
2900 unsigned int kernelWidth = 3;
2901 unsigned int channelMultiplier = 1;
2903 unsigned int strideX = 2;
2904 unsigned int strideY = 3;
2905 unsigned int padX = 1;
2906 unsigned int padY = 1;
2908 unsigned int outputNum = inputNum;
2909 unsigned int outputChannels = inputChannels * channelMultiplier;
2910 unsigned int outputHeight = (inputHeight + 2 * padY - kernelHeight + strideY) / strideY;
2911 unsigned int outputWidth = (inputWidth + 2 * padX - kernelWidth + strideX) / strideX;
2919 std::vector<unsigned int> inputShape;
2920 std::vector<unsigned int> outputShape;
2921 std::vector<unsigned int> kernelShape{ channelMultiplier, inputChannels, kernelHeight, kernelWidth };
2922 std::vector<unsigned int> biasShape{ outputChannels };
2926 inputShape = { inputNum, inputChannels, inputHeight, inputWidth };
2927 outputShape = { outputNum, outputChannels, outputHeight, outputWidth };
2930 inputShape = { inputNum, inputHeight, inputWidth, inputChannels };
2931 outputShape = { outputNum, outputHeight, outputWidth, outputChannels };
2935 + std::to_string(static_cast<int>(layout.
GetDataLayout())) +
"]");
2938 float inputsQScale = armnn::IsQuantizedType<T>() ? 1.0f : 0;
2939 float outputQScale = armnn::IsQuantizedType<T>() ? 2.0f : 0;
2940 int32_t qOffset = 0;
2942 inputTensorInfo =
armnn::TensorInfo(4, inputShape.data(), ArmnnType, inputsQScale, qOffset);
2943 outputTensorInfo =
armnn::TensorInfo(4, outputShape.data(), ArmnnType, outputQScale, qOffset);
2944 kernelDesc =
armnn::TensorInfo(4, kernelShape.data(), ArmnnType, inputsQScale, qOffset);
2950 auto input = MakeRandomTensor<T, 4>(inputTensorInfo, 124908, 0.0f, 255.0f);
2951 auto kernel = MakeRandomTensor<T, 4>(kernelDesc, 891234, 0.0f, 255.0f);
2952 auto bias = MakeRandomTensor<typename FullyConnectedBiasTypeForInputType<T>::Type, 1>(
2953 biasDesc, 1028, 0.0f, 255.0f);
2955 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.
CreateTensorHandle(inputTensorInfo);
2956 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.
CreateTensorHandle(outputTensorInfo);
2966 AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
2967 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
2969 data.
m_Bias = &biasTensor;
2979 std::unique_ptr<armnn::ITensorHandle> outputHandleRef = refWorkloadFactory.
CreateTensorHandle(outputTensorInfo);
2980 std::unique_ptr<armnn::ITensorHandle> inputHandleRef = refWorkloadFactory.
CreateTensorHandle(inputTensorInfo);
2984 SetWorkloadInput(refData, refInfo, 0, inputTensorInfo, inputHandleRef.get());
2985 SetWorkloadOutput(refData, refInfo, 0, outputTensorInfo, outputHandleRef.get());
2990 outputHandleRef->Allocate();
2991 inputHandleRef->Allocate();
2993 inputHandle->Allocate();
2994 outputHandle->Allocate();
2999 ExecuteWorkload(*workload, memoryManager);
3001 workloadRef->PostAllocationConfigure();
3002 workloadRef->Execute();
3014 Convolution2d3x3Dilation3x3Test<armnn::DataType::BFloat16, armnn::DataType::BFloat16>(
3021 Convolution2d3x3Dilation3x3Test<armnn::DataType::Float32, armnn::DataType::Float32>(
3022 armnn::IWorkloadFactory&,
3023 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
3028 Convolution2d3x3Dilation3x3Test<armnn::DataType::QAsymmS8, armnn::DataType::Signed32>(
3029 armnn::IWorkloadFactory&,
3030 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
3035 Convolution2d3x3Dilation3x3Test<armnn::DataType::QAsymmU8, armnn::DataType::Signed32>(
3036 armnn::IWorkloadFactory&,
3037 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
3042 Convolution2d3x3Dilation3x3Test<armnn::DataType::QSymmS16, armnn::DataType::Signed32>(
3043 armnn::IWorkloadFactory&,
3044 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
3048 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
3049 Convolution2d2x3x3Dilation3x3Test<armnn::DataType::Float32, armnn::DataType::Float32>(
3050 armnn::IWorkloadFactory&,
3051 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
3056 Convolution2d2x3x3Dilation3x3Test<armnn::DataType::BFloat16, armnn::DataType::BFloat16>(
3057 armnn::IWorkloadFactory&,
3058 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
3062 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 4>
3063 Convolution2d2x3x3Dilation3x3Test<armnn::DataType::QAsymmS8, armnn::DataType::Signed32>(
3064 armnn::IWorkloadFactory&,
3065 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
3069 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 4>
3070 Convolution2d2x3x3Dilation3x3Test<armnn::DataType::QAsymmU8, armnn::DataType::Signed32>(
3071 armnn::IWorkloadFactory&,
3072 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
3076 template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 4>
3077 Convolution2d2x3x3Dilation3x3Test<armnn::DataType::QSymmS16, armnn::DataType::Signed32>(
3078 armnn::IWorkloadFactory&,
3079 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
3083 template LayerTestResult<armnn::ResolveType<armnn::DataType::BFloat16>, 4>
3084 Convolution2d2x2Dilation2x2Padding2x2Stride3x3Test<armnn::DataType::BFloat16, armnn::DataType::BFloat16>(
3085 armnn::IWorkloadFactory &workloadFactory,
3086 const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager,
3090 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
3091 Convolution2d2x2Dilation2x2Padding2x2Stride3x3Test<armnn::DataType::Float32, armnn::DataType::Float32>(
3092 armnn::IWorkloadFactory &workloadFactory,
3093 const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager,
3097 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 4>
3098 Convolution2d2x2Dilation2x2Padding2x2Stride3x3Test<armnn::DataType::QAsymmS8, armnn::DataType::Signed32>(
3099 armnn::IWorkloadFactory &workloadFactory,
3100 const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager,
3104 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 4>
3105 Convolution2d2x2Dilation2x2Padding2x2Stride3x3Test<armnn::DataType::QAsymmU8, armnn::DataType::Signed32>(
3106 armnn::IWorkloadFactory &workloadFactory,
3107 const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager,
3111 template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 4>
3112 Convolution2d2x2Dilation2x2Padding2x2Stride3x3Test<armnn::DataType::QSymmS16, armnn::DataType::Signed32>(
3113 armnn::IWorkloadFactory &workloadFactory,
3114 const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager,
3118 template LayerTestResult<armnn::ResolveType<armnn::DataType::BFloat16>, 4>
3119 DepthwiseConvolution2d3x3Dilation3x3Test<armnn::DataType::BFloat16, armnn::DataType::BFloat16>(
3120 armnn::IWorkloadFactory&,
3121 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
3125 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
3126 DepthwiseConvolution2d3x3Dilation3x3Test<armnn::DataType::Float32, armnn::DataType::Float32>(
3127 armnn::IWorkloadFactory&,
3128 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
3132 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 4>
3133 DepthwiseConvolution2d3x3Dilation3x3Test<armnn::DataType::QAsymmS8, armnn::DataType::Signed32>(
3134 armnn::IWorkloadFactory&,
3135 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
3139 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 4>
3140 DepthwiseConvolution2d3x3Dilation3x3Test<armnn::DataType::QAsymmU8, armnn::DataType::Signed32>(
3141 armnn::IWorkloadFactory&,
3142 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
3146 template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 4>
3147 DepthwiseConvolution2d3x3Dilation3x3Test<armnn::DataType::QSymmS16, armnn::DataType::Signed32>(
3148 armnn::IWorkloadFactory&,
3149 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
3153 template LayerTestResult<armnn::ResolveType<armnn::DataType::BFloat16>, 4>
3154 DepthwiseConvolution2d2x3x3Dilation3x3Test<armnn::DataType::BFloat16, armnn::DataType::BFloat16>(
3155 armnn::IWorkloadFactory&,
3156 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
3160 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
3161 DepthwiseConvolution2d2x3x3Dilation3x3Test<armnn::DataType::Float32, armnn::DataType::Float32>(
3162 armnn::IWorkloadFactory&,
3163 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
3167 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 4>
3168 DepthwiseConvolution2d2x3x3Dilation3x3Test<armnn::DataType::QAsymmS8, armnn::DataType::Signed32>(
3169 armnn::IWorkloadFactory&,
3170 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
3174 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 4>
3175 DepthwiseConvolution2d2x3x3Dilation3x3Test<armnn::DataType::QAsymmU8, armnn::DataType::Signed32>(
3176 armnn::IWorkloadFactory&,
3177 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
3181 template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 4>
3182 DepthwiseConvolution2d2x3x3Dilation3x3Test<armnn::DataType::QSymmS16, armnn::DataType::Signed32>(
3183 armnn::IWorkloadFactory&,
3184 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
3188 template LayerTestResult<armnn::ResolveType<armnn::DataType::BFloat16>, 4>
3189 DepthwiseConvolution2dMult4Test<armnn::DataType::BFloat16, armnn::DataType::BFloat16>(
3190 armnn::IWorkloadFactory &workloadFactory,
3191 const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager,
3195 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
3196 DepthwiseConvolution2dMult4Test<armnn::DataType::Float32, armnn::DataType::Float32>(
3197 armnn::IWorkloadFactory &workloadFactory,
3198 const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager,
3202 template LayerTestResult<armnn::ResolveType<armnn::DataType::BFloat16>, 4>
3203 DepthwiseConvolution2dMult2Test<armnn::DataType::BFloat16, armnn::DataType::BFloat16>(
3204 armnn::IWorkloadFactory &workloadFactory,
3205 const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager,
3209 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
3210 DepthwiseConvolution2dMult2Test<armnn::DataType::Float32, armnn::DataType::Float32>(
3211 armnn::IWorkloadFactory &workloadFactory,
3212 const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager,
3221 armnn::IWorkloadFactory& workloadFactory,
3222 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
3226 return SimpleConvolution2d3x5TestCommon<armnn::DataType::Float32, armnn::DataType::Float32>(
3227 workloadFactory, memoryManager, 0.f, 0, biasEnabled, layout);
3231 armnn::IWorkloadFactory& workloadFactory,
3232 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
3236 return SimpleConvolution2d3x5TestCommon<armnn::DataType::QAsymmU8, armnn::DataType::Signed32>(
3237 workloadFactory, memoryManager, 0.5f, 50, biasEnabled, layout);
3241 armnn::IWorkloadFactory& workloadFactory,
3242 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
3246 return SimpleConvolution2d3x3TestCommon<armnn::DataType::Float32, armnn::DataType::Float32>(
3247 workloadFactory, memoryManager, 0.f, 0, biasEnabled, layout);
3251 armnn::IWorkloadFactory& workloadFactory,
3252 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
3255 return SimpleConvolution2d3x3NhwcTestCommon<armnn::DataType::Float32>(
3265 armnn::IWorkloadFactory& workloadFactory,
3266 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
3270 return SimpleConvolution2d3x3Stride2x2TestCommon<armnn::DataType::Float32>(
3280 armnn::IWorkloadFactory& workloadFactory,
3281 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
3285 return SimpleConvolution2d3x3TestCommon<armnn::DataType::QAsymmU8, armnn::DataType::Signed32>(
3286 workloadFactory, memoryManager, 0.5f, 50, biasEnabled, layout);
3290 armnn::IWorkloadFactory& workloadFactory,
3291 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
3295 return SimpleConvolution2d3x5TestCommon<armnn::DataType::QSymmS16, armnn::DataType::Signed32>(
3296 workloadFactory, memoryManager, 0.5f, 50, biasEnabled, layout);
3300 armnn::IWorkloadFactory& workloadFactory,
3301 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
3305 return SimpleConvolution2d3x3TestCommon<armnn::DataType::QSymmS16, armnn::DataType::Signed32>(
3306 workloadFactory, memoryManager, 0.5f, 50, biasEnabled, layout);
3310 armnn::IWorkloadFactory& workloadFactory,
3311 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
3314 return SimpleConvolution2dAsymmetricPaddingTestCommon<armnn::DataType::Float32, armnn::DataType::Float32>(
3315 workloadFactory, memoryManager, layout, 0.0f, 0);
3319 armnn::IWorkloadFactory& workloadFactory,
3320 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
3325 workloadFactory, memoryManager, layout, 0.0f, 0);
3329 armnn::IWorkloadFactory& workloadFactory,
3330 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
3333 return Convolution1dTestImpl<armnn::DataType::Float32, armnn::DataType::Float32>(
3334 workloadFactory, memoryManager, 0.0f, 0, biasEnabled);
3338 armnn::IWorkloadFactory& workloadFactory,
3339 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
3342 return Convolution1dTestImpl<armnn::DataType::QAsymmU8, armnn::DataType::Signed32>(
3343 workloadFactory, memoryManager, 0.1f, 128, biasEnabled);
3347 armnn::IWorkloadFactory& workloadFactory,
3348 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
3351 using namespace armnn;
3353 const DataType inputType = DataType::QAsymmU8;
3354 const DataType kernelType = DataType::QSymmS8;
3355 const DataType biasType = DataType::Signed32;
3357 TensorInfo inputInfo ({ 1, 3, 1, 2 }, inputType, 0.5f, 128);
3358 TensorInfo outputInfo({ 1, 3, 1, 3 }, inputType, 1.0f, 128);
3360 const std::vector<float> quantScales{ 0.5f, 0.75f, 1.0f };
3361 constexpr
unsigned int quantDimension = 0;
3363 TensorInfo kernelInfo({ 3, 1, 1, 2 }, kernelType, quantScales, quantDimension);
3365 const std::vector<float> biasQuantScales{ 0.25f, 0.375f, 0.5f };
3366 TensorInfo biasInfo({ 3 }, biasType, biasQuantScales, quantDimension);
3368 std::vector<uint8_t> inputData =
3370 138, 108, 138, 108, 138, 108
3373 std::vector<int8_t> kernelData =
3378 std::vector<int32_t> biasData =
3383 std::vector<uint8_t> expectedOutputData =
3385 121, 118, 115, 121, 118, 115, 121, 118, 115
3405 std::unique_ptr<ITensorHandle> inputHandle = workloadFactory.
CreateTensorHandle(inputInfo);
3406 std::unique_ptr<ITensorHandle> outputHandle = workloadFactory.
CreateTensorHandle(outputInfo);
3417 queueDescriptor.m_Weight = &weightTensor;
3418 queueDescriptor.m_Bias = &biasTensor;
3420 AddInputToWorkload(queueDescriptor, workloadInfo, inputInfo, inputHandle.get());
3421 AddOutputToWorkload(queueDescriptor, workloadInfo, outputInfo, outputHandle.get());
3423 std::unique_ptr<IWorkload> workload = workloadFactory.
CreateConvolution2d(queueDescriptor, workloadInfo);
3424 inputHandle->Allocate();
3425 outputHandle->Allocate();
3429 ExecuteWorkload(*workload, memoryManager);
3433 ret.
outputExpected = MakeTensor<uint8_t, 4>(outputInfo, expectedOutputData);
3439 armnn::IWorkloadFactory& workloadFactory,
3440 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
3441 armnn::IWorkloadFactory& refWorkloadFactory)
3443 return CompareConvolution2dTestImpl<armnn::DataType::Float32>(
3444 workloadFactory, memoryManager, refWorkloadFactory);
3448 armnn::IWorkloadFactory& workloadFactory,
3449 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
3453 return DepthwiseConvolution2dTestImpl<armnn::DataType::Float32, armnn::DataType::Float32>(
3454 workloadFactory, memoryManager, 0.0f, 0, biasEnabled, layout);
3458 armnn::IWorkloadFactory& workloadFactory,
3459 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
3462 return DepthwiseConvolution2dNhwcTestCommon<armnn::DataType::Float32, armnn::DataType::Float32>(
3463 workloadFactory, memoryManager, 0.0f, 0, biasEnabled);
3467 armnn::IWorkloadFactory& workloadFactory,
3468 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
3472 return DepthwiseConvolution2dDepthMul1TestImpl<armnn::DataType::Float32, armnn::DataType::Float32>(
3473 workloadFactory, memoryManager, 0.0f, 0, biasEnabled, layout);
3477 armnn::IWorkloadFactory& workloadFactory,
3478 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3481 auto input = MakeTensor<float, 4>(inputTensorInfo, { 1.f, 2.f, 3.f, 4.f });
3483 std::vector<float> kernelData;
3484 std::vector<float> singleDepthKernel{ 1.f, -1.f, -1.f, 1.f };
3485 for (
unsigned int i = 0; i < 64; ++i)
3487 kernelData.insert(kernelData.end(), singleDepthKernel.begin(), singleDepthKernel.end());
3490 auto kernel = MakeTensor<float, 4>(kernelTensorInfo, kernelData);
3492 std::vector<float> expectedOutputData(64, 0.f);
3494 auto expectedOutput = MakeTensor<float, 4>(outputTensorInfo, expectedOutputData);
3496 return DepthwiseConvolution2dTestImpl<armnn::DataType::Float32, armnn::DataType::Float32>(
3501 boost::multi_array<float, 1>(),
3509 armnn::IWorkloadFactory& workloadFactory,
3510 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
3514 return DepthwiseConvolution2dAsymmetricTestCommon<armnn::DataType::Float32, armnn::DataType::Float32>(
3515 workloadFactory, memoryManager, 0.0f, 0, biasEnabled, layout);
3519 armnn::IWorkloadFactory& workloadFactory,
3520 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
3524 return DepthwiseConvolution2dTestImpl<armnn::DataType::QAsymmU8, armnn::DataType::Signed32>(
3525 workloadFactory, memoryManager, 0.5f, 50, biasEnabled, layout);
3529 armnn::IWorkloadFactory& workloadFactory,
3530 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
3534 return DepthwiseConvolution2dDepthMul1TestImpl<armnn::DataType::QAsymmU8, armnn::DataType::Signed32>(
3535 workloadFactory, memoryManager, 0.5f, 50, biasEnabled, layout);
3539 armnn::IWorkloadFactory& workloadFactory,
3540 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3542 return SimpleDepthwiseConvolution2d3x3Dilation3x3NhwcTestCommon<armnn::DataType::Float32, armnn::DataType::Float32>(
3551 armnn::IWorkloadFactory& workloadFactory,
3552 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
3556 return DepthwiseConvolution2dTestImpl<armnn::DataType::QSymmS16, armnn::DataType::Signed32>(
3557 workloadFactory, memoryManager, 0.5f, 50, biasEnabled, layout);
3561 armnn::IWorkloadFactory& workloadFactory,
3562 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
3566 return DepthwiseConvolution2dDepthMul1TestImpl<armnn::DataType::QSymmS16, armnn::DataType::Signed32>(
3567 workloadFactory, memoryManager, 0.5f, 50, biasEnabled, layout);
3571 armnn::IWorkloadFactory& workloadFactory,
3572 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
3575 using namespace armnn;
3577 const DataType inputType = DataType::QAsymmU8;
3578 const DataType kernelType = DataType::QSymmS8;
3579 const DataType biasType = DataType::Signed32;
3581 TensorInfo inputInfo ({ 1, 3, 3, 2 }, inputType, 0.5f, 128);
3582 TensorInfo outputInfo({ 1, 2, 2, 4 }, inputType, 1.0f, 128);
3584 const std::vector<float> quantScales{ 1.0f, 0.5f, 1.0f, 0.5f };
3585 const unsigned int quantDimension = 0;
3586 TensorInfo kernelInfo({ 2, 2, 2, 2 }, kernelType, quantScales, quantDimension);
3588 const std::vector<float> biasQuantScales{ 0.5f, 0.25f, 0.5f, 0.25f };
3589 constexpr
unsigned int biasQuantDimension = 0;
3590 TensorInfo biasInfo({ 4 }, biasType, biasQuantScales, biasQuantDimension);
3592 std::vector<uint8_t> inputData =
3605 std::vector<int8_t> kernelData =
3613 std::vector<int32_t> biasData =
3618 std::vector<uint8_t> expectedOutputData =
3644 std::unique_ptr<ITensorHandle> inputHandle = workloadFactory.
CreateTensorHandle(inputInfo);
3645 std::unique_ptr<ITensorHandle> outputHandle = workloadFactory.
CreateTensorHandle(outputInfo);
3656 queueDescriptor.m_Weight = &weightTensor;
3657 queueDescriptor.m_Bias = &biasTensor;
3659 AddInputToWorkload(queueDescriptor, workloadInfo, inputInfo, inputHandle.get());
3660 AddOutputToWorkload(queueDescriptor, workloadInfo, outputInfo, outputHandle.get());
3663 inputHandle->Allocate();
3664 outputHandle->Allocate();
3668 ExecuteWorkload(*workload, memoryManager);
3673 ret.
outputExpected = MakeTensor<uint8_t, 4>(outputInfo, expectedOutputData);
3679 armnn::IWorkloadFactory& workloadFactory,
3680 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
3681 armnn::IWorkloadFactory& refWorkloadFactory,
3684 return CompareDepthwiseConvolution2dTestImpl<armnn::DataType::Float32>(
3685 workloadFactory, memoryManager, refWorkloadFactory, layout);
3689 armnn::IWorkloadFactory& workloadFactory,
3690 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
3691 armnn::IWorkloadFactory& refWorkloadFactory,
3694 return CompareDepthwiseConvolution2dTestImpl<armnn::DataType::QAsymmU8>(
3695 workloadFactory, memoryManager, refWorkloadFactory, layout);
LayerTestResult< float, 4 > DepthwiseConvolution2dDepthMul64Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager)
uint32_t m_PadBottom
Padding bottom value in the height dimension.
bool m_BiasEnabled
Enable/disable bias.
LayerTestResult< T, 4 > SimpleConvolution2d3x3TestCommon(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, float qScale, int32_t qOffset, bool biasEnabled, const armnn::DataLayout layout)
LayerTestResult< float, 4 > CompareDepthwiseConvolution2dFloatTest(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, armnn::IWorkloadFactory &refWorkloadFactory, const armnn::DataLayout layout)
const ConstCpuTensorHandle * m_Bias
DataLayout m_DataLayout
The data layout to be used (NCHW, NHWC).
LayerTestResult< uint8_t, 4 > DepthwiseConvolution2dDepthMul1Uint8Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, bool biasEnabled, const armnn::DataLayout layout)
LayerTestResult< T, 4 > SimpleConvolution2dAsymmetricPaddingTestCommon(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::DataLayout layout, float qScale, int32_t qOffset)
LayerTestResult< O, 4 > SimpleConvolution2dNhwcTestImpl(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const boost::multi_array< T, 4 > &input, const boost::multi_array< T, 4 > &kernel, const boost::multi_array< B, 1 > &bias, const boost::multi_array< O, 4 > &outputExpected, const armnn::DataLayout dataLayout, float qScale, int32_t qOffset, uint32_t padLeft=1, uint32_t padTop=1, uint32_t padRight=1, uint32_t padBottom=1, uint32_t strideX=1, uint32_t strideY=1)
bool m_BiasEnabled
Enable/disable bias.
LayerTestResult< float, 4 > SimpleConvolution2d3x5Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, bool biasEnabled, const armnn::DataLayout layout)
const TensorShape & GetShape() const
uint32_t m_PadBottom
Padding bottom value in the height dimension.
LayerTestResult< uint8_t, 4 > DepthwiseConvolution2dPerAxisQuantTest(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::DataLayout layout)
void ApplyBias(std::vector< T > &v, float vScale, int32_t vOffset, const std::vector< B > &bias, float bScale, int32_t bOffset, uint32_t w, uint32_t h)
LayerTestResult< float, 4 > Convolution1dTest(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, bool biasEnabled)
DataLayout m_DataLayout
The data layout to be used (NCHW, NHWC).
LayerTestResult< float, 4 > Convolution2dAsymmetricPaddingTest(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, armnn::DataLayout layout)
LayerTestResult< uint8_t, 4 > DepthwiseConvolution2dUint8Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, bool biasEnabled, const armnn::DataLayout layout)
const ConstCpuTensorHandle * m_Bias
A Convolution2dDescriptor for the Convolution2dLayer.
uint32_t m_PadLeft
Padding left value in the width dimension.
LayerTestResult< T, 4 > DepthwiseConvolution2dTestImpl(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, float qScale, int32_t qOffset, bool biasEnabled, const armnn::DataLayout layout)
LayerTestResult< T, 4 > DepthwiseConvolution2dDepthMul1TestImpl(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, float qScale, int32_t qOffset, bool biasEnabled, const armnn::DataLayout layout)
boost::multi_array< T, n > outputExpected
LayerTestResult< T, 4 > CompareDepthwiseConvolution2dTestImpl(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, armnn::IWorkloadFactory &refWorkloadFactory, const armnnUtils::DataLayoutIndexed &layout)
LayerTestResult< uint8_t, 4 > SimpleConvolution2d3x3Uint8Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, bool biasEnabled, const armnn::DataLayout layout)
LayerTestResult< T, 4 > DepthwiseConvolution2d3x3DilationTestCommon(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const std::vector< float > &inputNoQuantizedValues, armnn::TensorInfo &inputTensorInfo, const std::vector< float > &kernelNoQuantizedValues, armnn::TensorInfo &kernelTensorInfo, const std::vector< float > &outputExpectedNoQuantizedValues, armnn::TensorInfo &outputTensorInfo, uint32_t dilationX, uint32_t dilationY, armnn::DataLayout layout=armnn::DataLayout::NCHW, bool biasEnabled=false)
LayerTestResult< T, 4 > SimpleConvolution2dTestImpl(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const boost::multi_array< T, 4 > &originalInput, const boost::multi_array< T, 4 > &originalKernel, const boost::multi_array< B, 1 > &bias, const boost::multi_array< T, 4 > &originalOutputExpected, float qScale, int32_t qOffset, const armnn::DataLayout layout=armnn::DataLayout::NCHW, uint32_t padLeft=0, uint32_t padTop=0, uint32_t padRight=0, uint32_t padBottom=0, uint32_t strideX=1, uint32_t strideY=1, uint32_t dilationX=1, uint32_t dilationY=1)
typename ResolveTypeImpl< DT >::Type ResolveType
uint32_t m_PadRight
Padding right value in the width dimension.
LayerTestResult< int16_t, 4 > SimpleConvolution2d3x3QSymm16Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, bool biasEnabled, const armnn::DataLayout layout)
Copyright (c) 2020 ARM Limited.
LayerTestResult< T, 4 > Convolution1dTestImpl(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, float qScale, int32_t qOffset, bool biasEnabled)
void IgnoreUnused(Ts &&...)
uint32_t m_DilationY
Dilation along y axis.
LayerDescriptor m_Parameters
uint32_t m_DilationY
Dilation factor value for height dimension.
const ConstCpuTensorHandle * m_Weight
LayerTestResult< float, 4 > SimpleDepthwiseConvolution2d3x3Dilation3x3NhwcTest(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager)
LayerTestResult< float, 4 > Convolution2d3x3Stride2x2BFloat16Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, bool biasEnabled, const armnn::DataLayout &dataLayout)
LayerTestResult< float, 4 > DepthwiseConvolution2dDepthNhwcTest(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, bool biasEnabled)
LayerTestResult< T, 4 > Convolution2d3x3Dilation3x3Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, bool biasEnabled, const armnn::DataLayout layout)
uint32_t m_PadTop
Padding top value in the height dimension.
LayerTestResult< uint8_t, 4 > Convolution2dPerAxisQuantTest(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::DataLayout layout)
void Permute(const armnn::TensorShape &dstShape, const armnn::PermutationVector &mappings, const void *src, void *dst, size_t dataTypeSize)
LayerTestResult< T, 4 > Convolution2d2x2Dilation2x2Padding2x2Stride3x3Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, bool biasEnabled, const armnn::DataLayout layout)
uint32_t m_StrideX
Stride value when proceeding through input for the width dimension.
LayerTestResult< T, 4 > CompareConvolution2dTestImpl(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, armnn::IWorkloadFactory &refWorkloadFactory)
uint32_t m_StrideX
Stride value when proceeding through input for the width dimension.
uint32_t m_DilationX
Dilation factor value for width dimension.
uint32_t m_PadTop
Padding top value in the height dimension.
LayerTestResult< int16_t, 4 > SimpleConvolution2d3x5QSymm16Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, bool biasEnabled, const armnn::DataLayout layout)
#define ARMNN_ASSERT_MSG(COND, MSG)
std::shared_ptr< IMemoryManager > IMemoryManagerSharedPtr
int32_t GetQuantizationOffset() const
float GetQuantizationScale() const
Provides access to the appropriate indexes for Channels, Height and Width based on DataLayout...
const ConstCpuTensorHandle * m_Weight
LayerTestResult< T, 4 > DepthwiseConvolution2dAsymmetricTestImpl(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const boost::multi_array< T, 4 > &input, const boost::multi_array< T, 4 > &kernel, const boost::multi_array< B, 1 > &bias, const boost::multi_array< T, 4 > &outputExpected, float qScale, int32_t qOffset, const armnn::DataLayout layout, uint32_t padLeft=0, uint32_t padTop=0, uint32_t padRight=0, uint32_t padBottom=0, uint32_t strideX=1, uint32_t strideY=1)
LayerTestResult< T, 4 > DepthwiseConvolution2d2x3x3Dilation3x3Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, bool biasEnabled, const armnn::DataLayout layout)
LayerTestResult< T, 4 > DepthwiseConvolution2dMult2Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, bool biasEnabled, const armnn::DataLayout layout)
boost::multi_array< T, 1 > GetBias2(bool biasEnabled, float qScale)
void SetQuantizationScale(float scale)
#define ARMNN_ASSERT(COND)
LayerTestResult< int16_t, 4 > DepthwiseConvolution2dDepthMul1Int16Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, bool biasEnabled, const armnn::DataLayout layout)
LayerTestResult< T, 4 > SimpleDepthwiseConvolution2d3x3Dilation3x3NhwcTestCommon(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, float qScale, int32_t qOffset, bool biasEnabled)
std::enable_if_t< std::is_unsigned< Source >::value &&std::is_unsigned< Dest >::value, Dest > numeric_cast(Source source)
LayerTestResult< float, 4 > SimpleConvolution2d3x3Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, bool biasEnabled, const armnn::DataLayout layout)
void AllocateAndCopyDataToITensorHandle(armnn::ITensorHandle *tensorHandle, const void *memory)
armnn::DataLayout GetDataLayout() const
LayerTestResult< T, 4 > DepthwiseConvolution2dNhwcTestCommon(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, float qScale, int32_t qOffset, bool biasEnabled)
void CopyDataFromITensorHandle(void *memory, const armnn::ITensorHandle *tensorHandle)
boost::multi_array< T, 1 > GetBias4(bool biasEnabled, float qScale)
LayerTestResult< T, 4 > Convolution2d2x3x3Dilation3x3Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, bool biasEnabled, const armnn::DataLayout layout)
LayerTestResult< float, 4 > CompareConvolution2dTest(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, armnn::IWorkloadFactory &refWorkloadFactory)
uint32_t m_StrideY
Stride value when proceeding through input for the height dimension.
virtual std::unique_ptr< ITensorHandle > CreateTensorHandle(const TensorInfo &tensorInfo, const bool IsMemoryManaged=true) const =0
DataType GetBiasDataType(DataType inputDataType)
LayerTestResult< float, 4 > DepthwiseConvolution2dAsymmetricTest(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, bool biasEnabled, const armnn::DataLayout layout)
boost::multi_array< T, n > output
LayerTestResult< float, 4 > Convolution2dAsymmetricPaddingLargerThanHalfKernelSizeTest(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, armnn::DataLayout layout)
LayerTestResult< T, 4 > Convolution2d3x3DilationTestCommon(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const std::vector< float > &inputNoQuantizedValues, armnn::TensorInfo &inputTensorInfo, const std::vector< float > &kernelNoQuantizedValues, armnn::TensorInfo &kernelTensorInfo, const std::vector< float > &outputExpectedNoQuantizedValues, armnn::TensorInfo &outputTensorInfo, uint32_t dilationX, uint32_t dilationY, armnn::DataLayout layout=armnn::DataLayout::NCHW, uint32_t padLeft=0, uint32_t padTop=0, uint32_t padRight=0, uint32_t padBottom=0, uint32_t strideX=1, uint32_t strideY=1, bool biasEnabled=false)
uint32_t m_DilationX
Dilation along x axis.
boost::multi_array< T, 1 > GetBias8(bool biasEnabled, float qScale)
LayerTestResult< float, 4 > SimpleConvolution2d3x3NhwcTest(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, bool biasEnabled)
uint32_t m_StrideY
Stride value when proceeding through input for the height dimension.
LayerTestResult< T, 4 > Convolution2dAsymmetricPaddingLargerThanHalfKernelSizeTestCommon(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::DataLayout layout, float qScale, int32_t qOffset)
LayerTestResult< T, 4 > SimpleConvolution2d3x3Stride2x2TestCommon(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, float qScale, int32_t qOffset, bool biasEnabled, const armnn::DataLayout &dataLayout)
boost::multi_array< T, 1 > GetBias(bool biasEnabled, float qScale, armnn::TensorInfo outputInfo, armnn::DataLayout layout)
armnn::TensorInfo GetTensorInfo(unsigned int numberOfBatches, unsigned int numberOfChannels, unsigned int height, unsigned int width, const armnn::DataLayout dataLayout, const armnn::DataType dataType)
Contains information about inputs and outputs to a layer.
LayerTestResult< float, 4 > DepthwiseConvolution2dTest(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, bool biasEnabled, const armnn::DataLayout layout)
LayerTestResult< T, 4 > SimpleConvolution2d3x5TestCommon(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, float qScale, int32_t qOffset, bool biasEnabled, const armnn::DataLayout layout)
float SelectiveDequantize(T value, float scale, int32_t offset)
void SetQuantizationOffset(int32_t offset)
LayerTestResult< T, 4 > DepthwiseConvolution2d3x3Dilation3x3Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, bool biasEnabled, const armnn::DataLayout layout)
LayerTestResult< uint8_t, 4 > Convolution1dUint8Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, bool biasEnabled)
LayerTestResult< T, 4 > DepthwiseConvolution2dAsymmetricTestCommon(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, float qScale, int32_t qOffset, bool biasEnabled, const armnn::DataLayout layout)
LayerTestResult< uint8_t, 4 > CompareDepthwiseConvolution2dUint8Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, armnn::IWorkloadFactory &refWorkloadFactory, const armnn::DataLayout layout)
LayerTestResult< uint8_t, 4 > SimpleConvolution2d3x5Uint8Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, bool biasEnabled, const armnn::DataLayout layout)
LayerTestResult< T, 4 > SimpleConvolution2d3x3NhwcTestCommon(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, float qScale, int32_t qOffset, bool biasEnabled, armnn::DataLayout dataLayout)
LayerTestResult< int16_t, 4 > DepthwiseConvolution2dInt16Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, bool biasEnabled, const armnn::DataLayout layout)
LayerTestResult< float, 4 > Convolution2d3x3Stride2x2BFloat16SmallValueTest(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, bool biasEnabled, const armnn::DataLayout &dataLayout)
virtual std::unique_ptr< IWorkload > CreateDepthwiseConvolution2d(const DepthwiseConvolution2dQueueDescriptor &descriptor, const WorkloadInfo &info) const
unsigned int GetChannelsIndex() const
LayerTestResult< float, 4 > DepthwiseConvolution2dDepthMul1Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, bool biasEnabled, const armnn::DataLayout layout)
LayerTestResult< T, 4 > DepthwiseConvolution2dMult4Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, bool biasEnabled, const armnn::DataLayout layout)
LayerTestResult< float, 4 > SimpleConvolution2d3x3Stride2x2Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, bool biasEnabled, const armnn::DataLayout layout)
A DepthwiseConvolution2dDescriptor for the DepthwiseConvolution2dLayer.
uint32_t m_PadLeft
Padding left value in the width dimension.
virtual std::unique_ptr< IWorkload > CreateConvolution2d(const Convolution2dQueueDescriptor &descriptor, const WorkloadInfo &info) const
void CopyDataToITensorHandle(armnn::ITensorHandle *tensorHandle, const void *memory)
uint32_t m_PadRight
Padding right value in the width dimension.
void PermuteTensorNhwcToNchw(armnn::TensorInfo &tensorInfo, std::vector< T > &tensorData)