16 #include <boost/test/unit_test.hpp> 18 using namespace armnn;
33 unsigned int sameShape[] = { 10 };
37 AddInputToWorkload(invalidData, invalidInfo, inputTensorInfo,
nullptr);
38 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo,
nullptr);
40 invalidData.
m_Mean = &sameTensor;
42 invalidData.
m_Beta= &sameTensor;
43 invalidData.
m_Gamma = &sameTensor;
61 unsigned int inputShape[] = {2, 3, 4};
62 unsigned int outputShape[] = {2, 3, 4, 5};
70 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo,
nullptr);
71 AddInputToWorkload(invalidData, invalidInfo, inputTensorInfo,
nullptr);
79 unsigned int inputHeight = 1;
80 unsigned int inputWidth = 1;
81 unsigned int inputChannels = 4;
82 unsigned int inputNum = 2;
84 unsigned int outputChannels = inputChannels;
85 unsigned int outputHeight = inputHeight + 1;
86 unsigned int outputWidth = inputWidth;
87 unsigned int outputNum = inputNum;
92 unsigned int inputShape[] = { inputNum, inputChannels, inputHeight, inputWidth };
93 unsigned int outputShape[] = { outputNum, outputChannels, outputHeight, outputWidth };
101 AddInputToWorkload(invalidData, invalidInfo, inputTensorInfo,
nullptr);
102 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo,
nullptr);
110 unsigned int inputWidth = 1;
111 unsigned int inputHeight = 1;
112 unsigned int inputChannels = 5;
113 unsigned int inputNum = 2;
115 unsigned int outputWidth = 1;
116 unsigned int outputHeight = 1;
117 unsigned int outputChannels = 3;
118 unsigned int outputNum = 2;
126 unsigned int inputShape[] = { inputNum, inputChannels, inputHeight, inputWidth };
127 unsigned int outputShape[] = { outputNum, outputChannels, outputHeight, outputWidth };
128 unsigned int weightsShape[] = { 1, 1, inputChannels, outputChannels };
129 unsigned int biasShape[] = { 1, outputChannels, outputHeight, outputWidth };
142 AddInputToWorkload(invalidData, invalidInfo, inputTensorInfo,
nullptr);
143 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo,
nullptr);
144 invalidData.
m_Weight = &weightTensor;
145 invalidData.
m_Bias = &biasTensor;
158 constexpr
unsigned int inputNum = 5;
159 constexpr
unsigned int inputHeight = 32;
160 constexpr
unsigned int inputWidth = 24;
161 constexpr
unsigned int inputChannels = 3;
163 constexpr
unsigned int outputNum = inputNum;
164 constexpr
unsigned int outputChannels = inputChannels;
165 constexpr
unsigned int outputHeight = inputHeight + 1;
167 constexpr
unsigned int outputWidth = inputWidth;
173 unsigned int inputShape[] = {inputNum, inputChannels, inputHeight, inputWidth};
174 unsigned int outputShape[] = {outputNum, outputChannels, outputHeight, outputWidth};
185 uint32_t normSize = 5;
190 AddInputToWorkload(invalidData, invalidInfo, inputTensorInfo,
nullptr);
191 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo,
nullptr);
205 constexpr
unsigned int inputNum = 1;
206 constexpr
unsigned int inputHeight = 32;
207 constexpr
unsigned int inputWidth = 24;
208 constexpr
unsigned int inputChannels = 3;
210 constexpr
unsigned int outputNum = inputNum;
211 constexpr
unsigned int outputChannels = inputChannels;
212 constexpr
unsigned int outputHeight = 18;
213 constexpr
unsigned int outputWidth = inputWidth;
219 unsigned int inputShape[] = {inputNum, inputChannels, inputHeight, inputWidth};
220 unsigned int outputShape[] = {outputNum, outputChannels, outputHeight, outputWidth};
228 AddInputToWorkload(invalidData, invalidInfo, inputTensorInfo,
nullptr);
229 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo,
nullptr);
232 std::vector<unsigned int> wOrigin = {0, 0, 0};
236 BOOST_TEST_INFO(
"Invalid argument exception is expected, because split window dimensionality does not " 241 std::vector<unsigned int> wOrigin3 = {0, 0, 15, 0};
244 BOOST_TEST_INFO(
"Invalid argument exception is expected (wOrigin3[2]+ outputHeight > inputHeight");
248 std::vector<unsigned int> wOrigin4 = {0, 0, 0, 0};
252 std::vector<unsigned int> wOrigin5 = {1, 16, 20, 2};
256 BOOST_TEST_INFO(
"Invalid exception due to number of split windows not matching number of outputs.");
263 constexpr
unsigned int inputNum = 1;
264 constexpr
unsigned int inputChannels = 3;
265 constexpr
unsigned int inputHeight = 32;
266 constexpr
unsigned int inputWidth = 24;
268 constexpr
unsigned int outputNum = 1;
269 constexpr
unsigned int outputChannels = 3;
270 constexpr
unsigned int outputHeight = 32;
271 constexpr
unsigned int outputWidth = 24;
277 unsigned int inputShape[] = {inputNum, inputChannels, inputHeight, inputWidth};
278 unsigned int outputShape[] = {outputNum, outputChannels, outputHeight, outputWidth};
286 AddInputToWorkload(invalidData, invalidInfo, inputTensorInfo,
nullptr);
287 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo,
nullptr);
290 std::vector<unsigned int> wOrigin = {0, 0, 0};
294 BOOST_TEST_INFO(
"Invalid argument exception is expected, because merge window dimensionality does not " 299 std::vector<unsigned int> wOrigin3 = {0, 0, 15, 0};
302 BOOST_TEST_INFO(
"Invalid argument exception is expected (wOrigin3[2]+ inputHeight > outputHeight");
306 std::vector<unsigned int> wOrigin4 = {0, 0, 0, 0};
310 std::vector<unsigned int> wOrigin5 = {1, 16, 20, 2};
314 BOOST_TEST_INFO(
"Invalid exception due to number of merge windows not matching number of inputs.");
325 unsigned int shape[] = {1, 1, 1, 1};
335 AddInputToWorkload(invalidData, invalidInfo, input1TensorInfo,
nullptr);
336 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo,
nullptr);
341 AddInputToWorkload(invalidData, invalidInfo, input2TensorInfo,
nullptr);
346 AddInputToWorkload(invalidData, invalidInfo, input3TensorInfo,
nullptr);
358 unsigned int shape1[] = {1, 1, 2, 1};
359 unsigned int shape2[] = {1, 1, 3, 2};
370 AddInputToWorkload(invalidData, invalidInfo, input1TensorInfo,
nullptr);
371 AddInputToWorkload(invalidData, invalidInfo, input2TensorInfo,
nullptr);
372 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo,
nullptr);
386 AddInputToWorkload(invalidData, invalidInfo, input1TensorInfo,
nullptr);
387 AddInputToWorkload(invalidData, invalidInfo, input2TensorInfo,
nullptr);
388 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo,
nullptr);
401 constexpr
unsigned int input0Shape[] = { 2, 2, 4, 4 };
402 constexpr std::size_t dimensionCount = std::extent<decltype(input0Shape)>::value;
405 for (
unsigned int dimIndex = 0; dimIndex < dimensionCount; ++dimIndex)
407 unsigned int input1Shape[dimensionCount];
408 for (
unsigned int i = 0; i < dimensionCount; ++i)
410 input1Shape[i] = input0Shape[i];
413 ++input1Shape[dimIndex];
422 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo,
nullptr);
423 AddInputToWorkload(invalidData, invalidInfo, input0TensorInfo,
nullptr);
424 AddInputToWorkload(invalidData, invalidInfo, input1TensorInfo,
nullptr);
430 for (
unsigned int dimIndex = 0; dimIndex < dimensionCount; ++dimIndex)
432 unsigned int outputShape[dimensionCount];
433 for (
unsigned int i = 0; i < dimensionCount; ++i)
435 outputShape[i] = input0Shape[i];
438 ++outputShape[dimIndex];
447 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo,
nullptr);
448 AddInputToWorkload(invalidData, invalidInfo, input0TensorInfo,
nullptr);
449 AddInputToWorkload(invalidData, invalidInfo, input1TensorInfo,
nullptr);
461 unsigned int inputShape[] = { 1, 1, 2, 3 };
462 unsigned int outputShape[] = { 1, 1, 1, 2 };
470 AddInputToWorkload(invalidData, invalidInfo, inputTensorInfo,
nullptr);
471 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo,
nullptr);
485 unsigned int batchSize = 2;
486 unsigned int outputSize = 3;
487 unsigned int inputSize = 5;
488 unsigned numUnits = 4;
490 armnn::TensorInfo inputTensorInfo({batchSize , inputSize}, dataType, qScale, qOffset );
491 armnn::TensorInfo outputStateInTensorInfo({batchSize , outputSize}, dataType, qScale, qOffset);
492 armnn::TensorInfo cellStateInTensorInfo({batchSize , numUnits}, dataType, qScale, qOffset);
495 armnn::TensorInfo scratchBufferTensorInfo({batchSize, numUnits * 4}, dataType, qScale, qOffset);
496 armnn::TensorInfo cellStateOutTensorInfo({batchSize, numUnits}, dataType, qScale, qOffset);
497 armnn::TensorInfo outputStateOutTensorInfo({batchSize, outputSize}, dataType, qScale, qOffset);
498 armnn::TensorInfo outputTensorInfo({batchSize, outputSize}, dataType, qScale, qOffset);
502 armnn::TensorInfo tensorInfo4x5({numUnits, inputSize}, dataType, qScale, qOffset);
503 armnn::TensorInfo tensorInfo4x3({numUnits, outputSize}, dataType, qScale, qOffset);
504 armnn::TensorInfo tensorInfo3x4({outputSize, numUnits}, dataType, qScale, qOffset);
509 AddInputToWorkload(data, info, inputTensorInfo,
nullptr);
510 AddInputToWorkload(data, info, outputStateInTensorInfo,
nullptr);
511 AddInputToWorkload(data, info, cellStateInTensorInfo,
nullptr);
513 AddOutputToWorkload(data, info, scratchBufferTensorInfo,
nullptr);
514 AddOutputToWorkload(data, info, outputStateOutTensorInfo,
nullptr);
515 AddOutputToWorkload(data, info, cellStateOutTensorInfo,
nullptr);
540 data.m_InputToInputWeights = &inputToInputWeightsTensor;
541 data.m_InputToForgetWeights = &inputToForgetWeightsTensor;
542 data.m_InputToCellWeights = &inputToCellWeightsTensor;
543 data.m_InputToOutputWeights = &inputToOutputWeightsTensor;
544 data.m_RecurrentToInputWeights = &recurrentToInputWeightsTensor;
545 data.m_RecurrentToForgetWeights = &recurrentToForgetWeightsTensor;
546 data.m_RecurrentToCellWeights = &recurrentToCellWeightsTensor;
547 data.m_RecurrentToOutputWeights = &recurrentToOutputWeightsTensor;
548 data.m_CellToInputWeights = &cellToInputWeightsTensor;
549 data.m_InputGateBias = &inputGateBiasTensor;
550 data.m_ForgetGateBias = &forgetGateBiasTensor;
551 data.m_CellBias = &cellBiasTensor;
552 data.m_OutputGateBias = &outputGateBiasTensor;
553 data.m_CellToForgetWeights = &cellToForgetWeightsTensor;
554 data.m_CellToOutputWeights = &cellToOutputWeightsTensor;
555 data.m_ProjectionWeights = &projectionWeightsTensor;
556 data.m_ProjectionBias = &projectionBiasTensor;
558 data.m_InputLayerNormWeights = &inputLayerNormWeightsTensor;
559 data.m_ForgetLayerNormWeights = &forgetLayerNormWeightsTensor;
560 data.m_CellLayerNormWeights = &cellLayerNormWeightsTensor;
561 data.m_OutputLayerNormWeights = &outputLayerNormWeightsTensor;
564 data.m_Parameters.m_ActivationFunc = 4;
565 data.m_Parameters.m_CifgEnabled =
false;
566 data.m_Parameters.m_PeepholeEnabled =
true;
567 data.m_Parameters.m_ProjectionEnabled =
true;
568 data.m_Parameters.m_LayerNormEnabled =
true;
572 AddOutputToWorkload(data, info, outputTensorInfo,
nullptr);
575 data.m_Parameters.m_CifgEnabled =
true;
576 armnn::TensorInfo scratchBufferTensorInfo2({batchSize, numUnits * 3}, dataType, qScale, qOffset);
577 SetWorkloadOutput(data, info, 0, scratchBufferTensorInfo2,
nullptr);
579 data.m_Parameters.m_CifgEnabled =
false;
580 SetWorkloadOutput(data, info, 0, scratchBufferTensorInfo,
nullptr);
583 data.m_InputGateBias =
nullptr;
585 data.m_InputGateBias = &inputGateBiasTensor;
588 data.m_Parameters.m_ProjectionEnabled =
false;
590 data.m_Parameters.m_ProjectionEnabled =
true;
591 data.m_ProjectionWeights =
nullptr;
593 data.m_ProjectionWeights = &projectionWeightsTensor;
596 data.m_InputLayerNormWeights =
nullptr;
598 data.m_InputLayerNormWeights = &inputLayerNormWeightsTensor;
601 data.m_Parameters.m_LayerNormEnabled =
false;
603 data.m_Parameters.m_LayerNormEnabled =
true;
606 armnn::TensorInfo incorrectOutputTensorInfo({batchSize, outputSize + 1}, dataType, qScale, qOffset);
607 SetWorkloadOutput(data, info, 3, incorrectOutputTensorInfo,
nullptr);
609 SetWorkloadOutput(data, info, 3, outputTensorInfo,
nullptr);
612 data.m_Parameters.m_ClippingThresCell = -1.0f;
614 data.m_Parameters.m_ClippingThresCell = 0.0f;
617 data.m_Parameters.m_ClippingThresProj = -1.0f;
619 data.m_Parameters.m_ClippingThresProj = 0.0f;
622 BOOST_CHECK_NO_THROW(data.Validate(info));
627 constexpr
unsigned int nInput = 1u;
628 constexpr
unsigned int cInput = 3u;
629 constexpr
unsigned int hInput = 3u;
630 constexpr
unsigned int wInput = 3u;
632 constexpr
unsigned int nOutput = nInput;
633 constexpr
unsigned int cOutput = cInput;
634 constexpr
unsigned int hOutput = 1u;
635 constexpr
unsigned int wOutput = 1u;
637 const TensorShape inputShape { nInput, cInput, hInput, wInput };
638 const TensorShape outputShape{ nOutput, cOutput, hOutput, wOutput };
639 const TensorShape weightShape{ cOutput, cInput, hInput, wInput };
646 constexpr
float perTensorScale = 1.5f;
647 const TensorInfo inputInfo (inputShape, inputType, perTensorScale);
648 const TensorInfo outputInfo(outputShape, inputType, perTensorScale);
650 const std::vector<float> weightPerAxisScales = { 2.50f, 3.50f };
651 const TensorInfo weightInfo(weightShape, weightType, weightPerAxisScales, 0);
657 AddInputToWorkload(queueDescriptor, workloadInfo, inputInfo,
nullptr);
658 AddOutputToWorkload(queueDescriptor, workloadInfo, outputInfo,
nullptr);
661 queueDescriptor.
m_Weight = &weightTensor;
664 const std::vector<float> biasPerAxisScales1 = { 3.75f, 5.25f };
665 const TensorInfo biasInfo1(biasShape, biasType, biasPerAxisScales1, 0);
668 queueDescriptor.
m_Bias = &biasHandle1;
670 BOOST_CHECK_NO_THROW(queueDescriptor.
Validate(workloadInfo));
673 const std::vector<float> biasPerAxisScales2 = { 4.00f, 5.00f };
674 const TensorInfo biasInfo2(biasShape, biasType, biasPerAxisScales2, 0);
677 queueDescriptor.
m_Bias = &biasHandle2;
682 const std::vector<float> biasPerAxisScales3 = { 3.75f, 5.25f, 5.25f };
683 const TensorInfo biasInfo3(biasShape, biasType, biasPerAxisScales3, 0);
686 queueDescriptor.
m_Bias = &biasHandle3;
BOOST_AUTO_TEST_SUITE(TensorflowLiteParser)
bool m_BiasEnabled
Enable/disable bias.
const ConstCpuTensorHandle * m_Bias
const ConstCpuTensorHandle * m_Gamma
const ConstCpuTensorHandle * m_Beta
float m_K
Kappa value used for the across channel normalization equation.
RefElementwiseWorkload< std::plus< float >, AdditionQueueDescriptor, StringMapping::RefAdditionWorkload_Execute > RefAdditionWorkload
const ConstCpuTensorHandle * m_Weight
RefElementwiseWorkload< std::multiplies< float >, MultiplicationQueueDescriptor, StringMapping::RefMultiplicationWorkload_Execute > RefMultiplicationWorkload
bool m_TransposeWeightMatrix
Enable/disable transpose weight matrix.
float m_Alpha
Alpha value for the normalization equation.
const ConstCpuTensorHandle * m_Mean
const ConstCpuTensorHandle * m_Variance
NormalizationAlgorithmChannel
Copyright (c) 2020 ARM Limited.
LayerDescriptor m_Parameters
NormalizationAlgorithmMethod m_NormMethodType
Normalization method algorithm to use (LocalBrightness, LocalContrast).
std::vector< ViewOrigin > m_ViewOrigins
const ConstCpuTensorHandle * m_Weight
bool m_BiasEnabled
Enable/disable bias.
void Validate(const WorkloadInfo &workloadInfo) const
BOOST_AUTO_TEST_CASE(CheckConvolution2dLayer)
std::vector< ViewOrigin > m_ViewOrigins
NormalizationAlgorithmChannel m_NormChannelType
Normalization channel algorithm to use (Across, Within).
BOOST_AUTO_TEST_SUITE_END()
Contains information about inputs and outputs to a layer.
const ConstCpuTensorHandle * m_Bias
Krichevsky 2012: Local Brightness Normalization.
NormalizationAlgorithmMethod
float m_Beta
Beta value for the normalization equation.
uint32_t m_NormSize
Depth radius value.