23 #include <boost/test/unit_test.hpp> 33 using TensorData = std::pair<armnn::TensorInfo, std::vector<T>>;
36 void VerifyInputTensorData(
const TensorData<T>& data,
const std::string& tensorName)
38 if (data.first.GetNumElements() > data.second.size())
41 std::to_string(data.first.GetNumElements()) +
"but got " + std::to_string(data.second.size()));
45 template<
typename T,
typename BT>
49 const TensorData<T>& input,
50 TensorData<T>& output,
51 const TensorData<T>& weights,
55 using namespace armnn;
57 VerifyInputTensorData(input,
"input");
58 VerifyInputTensorData(weights,
"biases");
62 if (!biases.has_value())
66 VerifyInputTensorData(biases.value(),
"biases");
74 queueDescriptor.
m_Weight = &weightsTensor;
78 std::unique_ptr<ScopedCpuTensorHandle> biasesTensor;
82 biasesTensor = std::make_unique<ScopedCpuTensorHandle>(biases.value().first);
83 queueDescriptor.
m_Bias = biasesTensor.get();
90 std::unique_ptr<ITensorHandle> inputHandle = workloadFactory.
CreateTensorHandle(input.first);
91 std::unique_ptr<ITensorHandle> outputHandle = workloadFactory.
CreateTensorHandle(output.first);
96 AddInputToWorkload(queueDescriptor, workloadInfo, input.first, inputHandle.get());
97 AddOutputToWorkload(queueDescriptor, workloadInfo, output.first, outputHandle.get());
99 std::unique_ptr<armnn::IWorkload> workload =
102 inputHandle->Allocate();
103 outputHandle->Allocate();
107 ExecuteWorkload(*workload, memoryManager);
110 output.second = std::vector<T>(output.first.GetNumElements(), T());
114 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType,
typename T = armnn::ResolveType<ArmnnType>>
120 const std::vector<float>& inputData,
122 const std::vector<float>& expectedOutputData,
124 const std::vector<float>& weightsData,
126 const std::vector<float>& biasesData)
128 using namespace armnn;
131 if (armnn::IsQuantizedType<T>())
133 constexpr
float qScale = 0.50f;
134 constexpr int32_t qOffset = 10;
150 TensorData<T> input =
157 TensorData<T> weights =
160 armnnUtils::QuantizedVector<T>(weightsData,
170 TensorData<BT> biases =
173 armnnUtils::QuantizedVector<BT>(biasesData,
182 TensorData<T> output = { outputInfo, {} };
185 TransposeConvolution2dTestImpl(workloadFactory,
195 testResult.output = MakeTensor<T, 4>(outputInfo, output.second);
196 testResult.outputExpected = MakeTensor<T, 4>(outputInfo,
197 armnnUtils::QuantizedVector<T>(expectedOutputData,
198 outputInfo.GetQuantizationScale(),
199 outputInfo.GetQuantizationOffset()));
206 std::vector<T>& inputData,
208 std::vector<T>& outputData,
210 std::vector<T>& weightsData)
212 PermuteTensorNchwToNhwc<T>(inputInfo, inputData);
213 PermuteTensorNchwToNhwc<T>(outputInfo, outputData);
214 PermuteTensorNchwToNhwc<T>(weightsInfo, weightsData);
219 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType,
typename T>
226 using namespace armnn;
228 constexpr
unsigned int batches = 1u;
229 constexpr
unsigned int channels = 1u;
231 constexpr
unsigned int wInput = 3u;
232 constexpr
unsigned int hInput = wInput;
234 constexpr
unsigned int wOutput = 5u;
235 constexpr
unsigned int hOutput = wOutput;
237 constexpr
unsigned int wWeights = 3u;
238 constexpr
unsigned int hWeights = wWeights;
240 TensorShape inputShape = { batches, channels, hInput, wInput };
241 TensorShape outputShape = { batches, channels, hOutput, wOutput };
242 TensorShape weightsShape = { batches, channels, hWeights, wWeights };
245 TensorInfo outputInfo(outputShape, ArmnnType);
246 TensorInfo weightsInfo(weightsShape, ArmnnType);
247 TensorInfo biasesInfo({ channels }, ArmnnBType);
249 std::vector<float> inputData =
256 std::vector<float> weightsData =
263 std::vector<float> biasesData = { 1.f };
265 std::vector<float> expectedOutputData =
267 1.f, 3.f, 6.f, 5.f, 3.f,
268 5.f, 12.f, 21.f, 16.f, 9.f,
269 12.f, 27.f, 45.f, 33.f, 18.f,
270 11.f, 24.f, 39.f, 28.f, 15.f,
271 7.f, 15.f, 24.f, 17.f, 9.f
277 std::transform(expectedOutputData.begin(), expectedOutputData.end(), expectedOutputData.begin(),
278 [&](
float f) ->
float {
return f + biasesData[0]; });
283 descriptor.m_StrideY = 1;
284 descriptor.m_BiasEnabled = biasEnabled;
285 descriptor.m_DataLayout = layout;
290 SwizzleData(inputInfo, inputData, outputInfo, expectedOutputData, weightsInfo, weightsData);
293 return TransposeConvolution2dTest<ArmnnType, ArmnnBType>(workloadFactory,
306 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType,
typename T>
313 using namespace armnn;
315 constexpr
unsigned int batches = 1u;
316 constexpr
unsigned int channels = 1u;
318 constexpr
unsigned int wInput = 4u;
319 constexpr
unsigned int hInput = wInput;
321 constexpr
unsigned int wOutput = 2u;
322 constexpr
unsigned int hOutput = wOutput;
324 constexpr
unsigned int wWeights = 3u;
325 constexpr
unsigned int hWeights = wWeights;
327 TensorShape inputShape = { batches, channels, hInput, wInput };
328 TensorShape outputShape = { batches, channels, hOutput, wOutput };
329 TensorShape weightsShape = { batches, channels, hWeights, wWeights };
332 TensorInfo outputInfo(outputShape, ArmnnType);
333 TensorInfo weightsInfo(weightsShape, ArmnnType);
334 TensorInfo biasesInfo({ channels }, ArmnnBType);
336 std::vector<float> inputData =
344 std::vector<float> weightsData =
351 std::vector<float> biasesData = { 1.f };
353 std::vector<float> expectedOutputData =
362 std::transform(expectedOutputData.begin(), expectedOutputData.end(), expectedOutputData.begin(),
363 [&](
float f) ->
float {
return f + biasesData[0]; });
368 descriptor.m_PadRight = 2;
369 descriptor.m_PadTop = 2;
370 descriptor.m_PadBottom = 2;
371 descriptor.m_StrideX = 1;
372 descriptor.m_StrideY = 1;
373 descriptor.m_BiasEnabled = biasEnabled;
374 descriptor.m_DataLayout = layout;
379 SwizzleData(inputInfo, inputData, outputInfo, expectedOutputData, weightsInfo, weightsData);
382 return TransposeConvolution2dTest<ArmnnType, ArmnnBType>(workloadFactory,
395 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType,
typename T>
402 using namespace armnn;
404 constexpr
unsigned int batches = 1u;
405 constexpr
unsigned int channels = 1u;
407 constexpr
unsigned int wInput = 3u;
408 constexpr
unsigned int hInput = wInput;
410 constexpr
unsigned int wOutput = 7u;
411 constexpr
unsigned int hOutput = wOutput;
413 constexpr
unsigned int wWeights = 3u;
414 constexpr
unsigned int hWeights = wWeights;
416 TensorShape inputShape = { batches, channels, hInput, wInput };
417 TensorShape outputShape = { batches, channels, hOutput, wOutput };
418 TensorShape weightsShape = { batches, channels, hWeights, wWeights };
421 TensorInfo outputInfo(outputShape, ArmnnType);
422 TensorInfo weightsInfo(weightsShape, ArmnnType);
423 TensorInfo biasesInfo({ channels }, ArmnnBType);
425 std::vector<float> inputData =
432 std::vector<float> weightsData =
439 std::vector<float> biasesData = { 1.f };
441 std::vector<float> expectedOutputData =
443 1.f, 2.f, 4.f, 2.f, 4.f, 2.f, 3.f,
444 4.f, 5.f, 10.f, 5.f, 10.f, 5.f, 6.f,
445 8.f, 10.f, 20.f, 10.f, 20.f, 10.f, 12.f,
446 4.f, 5.f, 10.f, 5.f, 10.f, 5.f, 6.f,
447 8.f, 10.f, 20.f, 10.f, 20.f, 10.f, 12.f,
448 4.f, 5.f, 10.f, 5.f, 10.f, 5.f, 6.f,
449 7.f, 8.f, 16.f, 8.f, 16.f, 8.f, 9.f
455 std::transform(expectedOutputData.begin(), expectedOutputData.end(), expectedOutputData.begin(),
456 [&](
float f) ->
float {
return f + biasesData[0]; });
461 descriptor.m_StrideY = 2;
462 descriptor.m_BiasEnabled = biasEnabled;
463 descriptor.m_DataLayout = layout;
468 SwizzleData(inputInfo, inputData, outputInfo, expectedOutputData, weightsInfo, weightsData);
471 return TransposeConvolution2dTest<ArmnnType, ArmnnBType>(workloadFactory,
484 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType,
typename T>
490 using namespace armnn;
500 TensorInfo outputInfo(outputShape, ArmnnType);
501 TensorInfo weightsInfo(weightsShape, ArmnnType);
502 TensorInfo biasesInfo(biasesShape, ArmnnBType);
504 std::vector<float> inputData =
510 std::vector<float> weightsData =
521 std::vector<float> biasesData = { -1.5f, -2.0f };
523 std::vector<float> expectedOutputData =
525 -0.5f, 1.5f, 5.5f, 4.5f, 8.5f,
526 5.5f, 7.5f, 23.5f, 16.5f, 20.5f,
527 14.5f, 22.5f, 60.5f, 40.5f, 52.5f,
528 19.5f, 25.5f, 59.5f, 34.5f, 42.5f,
529 37.5f, 43.5f, 101.5f, 58.5f, 66.5f,
531 0.0f, 2.0f, 8.0f, 6.0f, 10.0f,
532 6.0f, 8.0f, 26.0f, 18.0f, 22.0f,
533 18.0f, 26.0f, 70.0f, 46.0f, 58.0f,
534 22.0f, 28.0f, 66.0f, 38.0f, 46.0f,
535 40.0f, 46.0f, 108.0f, 62.0f, 70.0f
547 SwizzleData(inputInfo, inputData, outputInfo, expectedOutputData, weightsInfo, weightsData);
550 return TransposeConvolution2dTest<ArmnnType, ArmnnBType>(workloadFactory,
568 using namespace armnn;
574 TensorInfo inputInfo ({ 1, 1, 2, 2 }, inputType, 0.50f, 10);
575 TensorInfo outputInfo({ 1, 2, 5, 5 }, inputType, 0.50f, 10);
577 const std::vector<float> quantScales{ 0.25f, 0.5f };
578 constexpr
unsigned int quantDimension = 0;
580 TensorInfo kernelInfo({ 2, 1, 3, 3 }, kernelType, quantScales, quantDimension);
582 const std::vector<float> biasQuantScales{ 0.125f, 0.25f };
583 TensorInfo biasInfo({ 2 }, biasType, biasQuantScales, quantDimension);
585 std::vector<uint8_t> inputData =
591 std::vector<int8_t> kernelData =
602 std::vector<int32_t> biasData = { -12, -8 };
604 std::vector<uint8_t> expectedOutputData =
608 39, 55, 131, 91, 115,
610 85, 97, 213, 127, 143,
614 46, 62, 150, 102, 126,
615 54, 66, 142, 86, 102,
616 90, 102, 226, 134, 150
633 std::unique_ptr<ITensorHandle> inputHandle = workloadFactory.
CreateTensorHandle(inputInfo);
634 std::unique_ptr<ITensorHandle> outputHandle = workloadFactory.
CreateTensorHandle(outputInfo);
646 queueDescriptor.m_Weight = &weightTensor;
647 queueDescriptor.m_Bias = &biasTensor;
649 AddInputToWorkload(queueDescriptor, workloadInfo, inputInfo, inputHandle.get());
650 AddOutputToWorkload(queueDescriptor, workloadInfo, outputInfo, outputHandle.get());
653 inputHandle->Allocate();
654 outputHandle->Allocate();
658 ExecuteWorkload(*workload, memoryManager);
662 ret.
outputExpected = MakeTensor<uint8_t, 4>(outputInfo, expectedOutputData);
672 SimpleTransposeConvolution2dTest<armnn::DataType::Float32, armnn::DataType::Float32>(
679 SimpleTransposeConvolution2dTest<armnn::DataType::QAsymmS8, armnn::DataType::Signed32>(
686 SimpleTransposeConvolution2dTest<armnn::DataType::QAsymmU8, armnn::DataType::Signed32>(
693 SimpleTransposeConvolution2dTest<armnn::DataType::QSymmS16, armnn::DataType::Signed32>(
700 PaddedTransposeConvolution2dTest<armnn::DataType::Float32, armnn::DataType::Float32>(
706 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 4>
707 PaddedTransposeConvolution2dTest<armnn::DataType::QAsymmS8, armnn::DataType::Signed32>(
713 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 4>
714 PaddedTransposeConvolution2dTest<armnn::DataType::QAsymmU8, armnn::DataType::Signed32>(
720 template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 4>
721 PaddedTransposeConvolution2dTest<armnn::DataType::QSymmS16, armnn::DataType::Signed32>(
727 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
728 StridedTransposeConvolution2dTest<armnn::DataType::Float32, armnn::DataType::Float32>(
734 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 4>
735 StridedTransposeConvolution2dTest<armnn::DataType::QAsymmS8, armnn::DataType::Signed32>(
741 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 4>
742 StridedTransposeConvolution2dTest<armnn::DataType::QAsymmU8, armnn::DataType::Signed32>(
748 template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 4>
749 StridedTransposeConvolution2dTest<armnn::DataType::QSymmS16, armnn::DataType::Signed32>(
755 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
756 MultiChannelTransposeConvolution2dTest<armnn::DataType::Float32, armnn::DataType::Float32>(
761 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 4>
762 MultiChannelTransposeConvolution2dTest<armnn::DataType::QAsymmS8, armnn::DataType::Signed32>(
767 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 4>
768 MultiChannelTransposeConvolution2dTest<armnn::DataType::QAsymmU8, armnn::DataType::Signed32>(
773 template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 4>
774 MultiChannelTransposeConvolution2dTest<armnn::DataType::QSymmS16, armnn::DataType::Signed32>(
A TransposeConvolution2dDescriptor for the TransposeConvolution2dLayer.
LayerTestResult< T, 4 > PaddedTransposeConvolution2dTest(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, bool biasEnabled, const armnn::DataLayout layout)
#define ARMNN_NO_DEPRECATE_WARN_BEGIN
LayerTestResult< T, 4 > MultiChannelTransposeConvolution2dTest(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::DataLayout layout)
bool m_BiasEnabled
Enable/disable bias.
boost::multi_array< T, n > outputExpected
typename ResolveTypeImpl< DT >::Type ResolveType
Copyright (c) 2020 ARM Limited.
void IgnoreUnused(Ts &&...)
const ConstCpuTensorHandle * m_Weight
LayerDescriptor m_Parameters
void PermuteTensorNchwToNhwc(armnn::TensorInfo &tensorInfo, std::vector< T > &tensorData)
const ConstCpuTensorHandle * m_Bias
#define ARMNN_NO_DEPRECATE_WARN_END
std::shared_ptr< IMemoryManager > IMemoryManagerSharedPtr
int32_t GetQuantizationOffset() const
float GetQuantizationScale() const
void SetQuantizationScale(float scale)
void AllocateAndCopyDataToITensorHandle(armnn::ITensorHandle *tensorHandle, const void *memory)
DataLayout m_DataLayout
The data layout to be used (NCHW, NHWC).
void CopyDataFromITensorHandle(void *memory, const armnn::ITensorHandle *tensorHandle)
virtual std::unique_ptr< ITensorHandle > CreateTensorHandle(const TensorInfo &tensorInfo, const bool IsMemoryManaged=true) const =0
LayerTestResult< T, 4 > SimpleTransposeConvolution2dTest(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, bool biasEnabled, const armnn::DataLayout layout)
boost::multi_array< T, n > output
uint32_t m_PadLeft
Padding left value in the width dimension.
uint32_t m_StrideX
Stride value when proceeding through input for the width dimension.
LayerTestResult< uint8_t, 4 > TransposeConvolution2dPerAxisQuantTest(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::DataLayout layout)
uint32_t m_StrideY
Stride value when proceeding through input for the height dimension.
virtual std::unique_ptr< IWorkload > CreateTransposeConvolution2d(const TransposeConvolution2dQueueDescriptor &descriptor, const WorkloadInfo &info) const
LayerTestResult< T, 4 > StridedTransposeConvolution2dTest(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, bool biasEnabled, const armnn::DataLayout layout)
Contains information about inputs and outputs to a layer.
void SetQuantizationOffset(int32_t offset)
void CopyDataToITensorHandle(armnn::ITensorHandle *tensorHandle, const void *memory)