16 #include <boost/test/unit_test.hpp> 18 using namespace armnn;
23 void CreateLSTMLayerHelper(
Graph &graph,
bool CifgEnabled)
34 unsigned int batchSize = 3;
35 unsigned int inputSize = 2;
36 unsigned int numUnits = 4;
37 unsigned int outputSize = 4;
68 if (!layerDesc.m_CifgEnabled)
84 if (layerDesc.m_ProjectionEnabled)
94 if (layerDesc.m_PeepholeEnabled)
117 armnn::TensorInfo lstmTensorInfoScratchBuff({ batchSize, numUnits * (layerDesc.m_CifgEnabled ? 3 : 4) },
120 Connect(input, layer, lstmTensorInfo1, 0, 0);
121 Connect(cellStateIn, layer, lstmTensorInfo2, 0, 1);
122 Connect(outputStateIn, layer, lstmTensorInfo3, 0, 2);
123 Connect(layer, scratchBuffer, lstmTensorInfoScratchBuff, 0, 0);
124 Connect(layer, outputStateOut, lstmTensorInfo3, 1, 0);
125 Connect(layer, cellStateOut, lstmTensorInfo2, 2, 0);
126 Connect(layer, output, lstmTensorInfo3, 3, 0);
139 CreateLSTMLayerHelper(graph,
false);
150 CreateLSTMLayerHelper(graph,
true);
170 ->GetOutputHandler().SetTensorInfo(
info);
179 ->GetOutputHandler().SetTensorInfo(
info);
184 &IsLayerOfType<armnn::InputLayer>,
185 &IsLayerOfType<armnn::InputLayer>,
186 &IsLayerOfType<armnn::MemCopyLayer>,
187 &IsLayerOfType<armnn::FloorLayer>,
188 &IsLayerOfType<armnn::AdditionLayer>,
189 &IsLayerOfType<armnn::OutputLayer>));
192 for (
auto& layer : graph)
202 for (
auto& layer : graph)
212 for (
auto& layer : graph)
234 &IsLayerOfType<armnn::InputLayer>,
235 &IsLayerOfType<armnn::InputLayer>,
236 &IsLayerOfType<armnn::ConvertFp16ToFp32Layer>,
237 &IsLayerOfType<armnn::MemCopyLayer>,
238 &IsLayerOfType<armnn::ConvertFp16ToFp32Layer>,
239 &IsLayerOfType<armnn::FloorLayer>,
240 &IsLayerOfType<armnn::ConvertFp32ToFp16Layer>,
241 &IsLayerOfType<armnn::ConvertFp16ToFp32Layer>,
242 &IsLayerOfType<armnn::AdditionLayer>,
243 &IsLayerOfType<armnn::ConvertFp32ToFp16Layer>,
244 &IsLayerOfType<armnn::OutputLayer>));
250 const unsigned int* weightsShape,
const unsigned int* outputShape,
256 std::vector<float> weightsVector(90);
269 layer->
m_Weight = std::make_unique<armnn::ScopedCpuTensorHandle>(weights);
280 const unsigned int inputShape[] = { 1, 3, 8, 16 };
281 const unsigned int weightsShape[] = { 2, 3, 5, 3 };
282 const unsigned int outputShape[] = { 1, 2, 4, 14 };
291 const unsigned int inputShape[] = { 1, 8, 16, 3 };
292 const unsigned int weightsShape[] = { 2, 5, 3, 3 };
293 const unsigned int outputShape[] = { 1, 4, 14, 2 };
300 const unsigned int* weightsShape,
const unsigned int* outputShape,
306 std::vector<float> weightsVector(18);
319 layer->
m_Weight = std::make_unique<armnn::ScopedCpuTensorHandle>(weights);
330 const unsigned int inputShape[] = { 1, 2, 3, 3 };
331 const unsigned int weightsShape[] = { 1, 2, 3, 3 };
332 const unsigned int outputShape[] = { 1, 2, 1, 1 };
341 const unsigned int inputShape[] = { 1, 3, 3, 2 };
342 const unsigned int weightsShape[] = { 1, 2, 3, 3 };
343 const unsigned int outputShape[] = { 1, 1, 1, 2 };
380 const unsigned int inputShape[] = { 5, 3, 52, 60 };
381 const unsigned int outputShape[] = { 5, 3, 11, 13 };
390 const unsigned int inputShape[] = { 5, 52, 60, 3 };
391 const unsigned int outputShape[] = { 5, 11, 13, 3 };
423 const unsigned int inputShape[] = { 1, 2, 4, 5 };
424 const unsigned int outputShape[] = { 1, 2, 3, 4 };
433 const unsigned int inputShape[] = { 1, 4, 5, 2 };
434 const unsigned int outputShape[] = { 1, 3, 4, 2 };
500 std::vector<uint8_t> anchorsVector(40);
524 input0->GetOutputSlot().Connect(layer->
GetInputSlot(0));
533 const unsigned int inputShape[] = { 1, 2, 2, 3 };
534 const unsigned int paddedShape[] = { 1, 6, 6, 3 };
535 const unsigned int weightsShape[] = { 1, 2, 3, 3 };
536 const unsigned int outputShape[] = { 1, 2, 1, 1 };
546 PadDescriptor padDescriptor({{ 0, 0 }, { 2, 2 }, { 2, 2 }, { 0, 0 }});
557 std::vector<float> weightsVector(18);
561 conv2dLayer->
m_Weight = std::make_unique<armnn::ScopedCpuTensorHandle>(weights);
568 padLayer->GetOutputSlot().Connect(conv2dLayer->
GetInputSlot(0));
571 auto checkSimpleConv2d = [ ](
const armnn::Layer*
const layer) ->
bool 575 return IsLayerOfType<armnn::Convolution2dLayer>(layer) &&
577 (conv2dLayerParams.m_PadLeft == 0) &&
578 (conv2dLayerParams.m_PadRight == 0) &&
579 (conv2dLayerParams.m_PadTop == 0) &&
580 (conv2dLayerParams.m_PadBottom == 0) &&
581 (conv2dLayerParams.m_BiasEnabled ==
false) &&
582 (conv2dLayerParams.m_StrideX == 1) &&
583 (conv2dLayerParams.m_StrideY == 1) &&
589 &IsLayerOfType<armnn::InputLayer>,
590 &IsLayerOfType<armnn::PadLayer>,
592 &IsLayerOfType<armnn::OutputLayer>));
596 auto checkPadFoldedIntoConv2d = [ ](
const armnn::Layer*
const layer) ->
bool 600 return IsLayerOfType<armnn::Convolution2dLayer>(layer) &&
601 (layer->
GetNameStr() ==
"folded-pad-into-conv2d") &&
602 (conv2dLayerParams.m_PadLeft == 2) &&
603 (conv2dLayerParams.m_PadRight == 2) &&
604 (conv2dLayerParams.m_PadTop == 2) &&
605 (conv2dLayerParams.m_PadBottom == 2) &&
606 (conv2dLayerParams.m_BiasEnabled ==
false) &&
607 (conv2dLayerParams.m_StrideX == 1) &&
608 (conv2dLayerParams.m_StrideY == 1) &&
614 &IsLayerOfType<armnn::InputLayer>,
615 checkPadFoldedIntoConv2d,
616 &IsLayerOfType<armnn::OutputLayer>));
bool m_ProjectionEnabled
Enable/disable the projection layer.
const OutputHandler & GetOutputHandler(unsigned int i=0) const
LstmOptPeepholeParameters m_PeepholeParameters
This layer represents a pad operation.
uint32_t m_StrideX
Stride value when proceeding through input for the width dimension.
std::unique_ptr< ScopedCpuTensorHandle > m_Anchors
A unique pointer to store Anchor values.
DataLayout m_DataLayout
The data layout to be used (NCHW, NHWC).
LayerType GetType() const
std::unique_ptr< ScopedCpuTensorHandle > m_RecurrentToInputWeights
A unique pointer to represent 2D weights tensor with dimensions [input_size, num_units].
A tensor defined by a TensorInfo (shape and data type) and an immutable backing store.
void CreateDepthwiseConvolution2dGraph(Graph &graph, const unsigned int *inputShape, const unsigned int *weightsShape, const unsigned int *outputShape, DataLayout dataLayout=DataLayout::NCHW)
LstmOptProjectionParameters m_ProjectionParameters
float m_ClippingThresCell
Clipping threshold value for the cell state.
std::unique_ptr< ScopedCpuTensorHandle > m_InputToCellWeights
A unique pointer to represent 2D weights tensor with dimensions [input_size, num_units].
This layer represents a detection postprocess operator.
uint32_t m_PoolHeight
Pooling height value.
uint32_t m_TargetHeight
Target height value.
std::unique_ptr< ScopedCpuTensorHandle > m_InputGateBias
A unique pointer to represent 1D weights tensor with dimensions [num_units].
This layer represents a depthwise convolution 2d operation.
This layer represents a convolution 2d operation.
std::unique_ptr< ScopedCpuTensorHandle > m_InputToOutputWeights
A unique pointer to represent 2D weights tensor with dimensions [input_size, num_units].
std::unique_ptr< ScopedCpuTensorHandle > m_Weight
A unique pointer to store Weight values.
DataLayout m_DataLayout
The data layout to be used (NCHW, NHWC).
uint32_t m_PadTop
Padding top value in the height dimension.
bool m_CifgEnabled
Enable/disable cifg (coupled input & forget gate).
BOOST_AUTO_TEST_CASE(CheckConvolution2dLayer)
A PadDescriptor for the PadLayer.
This layer represents a memory copy operation.
uint32_t m_PadRight
Padding right value in the width dimension.
LayerT * AddLayer(Args &&... args)
Adds a new layer, of type LayerType, to the graph constructed with the arguments passed.
static void Pass(Graph &graph, const Optimizations &optimizations)
int Connect(InputSlot &destination)
This layer represents a pooling 2d operation.
This layer represents a floor operation.
DataLayout m_DataLayout
The data layout to be used (NCHW, NHWC).
const std::string & GetNameStr() const
std::unique_ptr< ScopedCpuTensorHandle > m_ProjectionWeights
A unique pointer to represent 2D weights tensor with dimensions [output_size, num_units].
uint32_t m_StrideY
Stride value when proceeding through input for the height dimension.
std::unique_ptr< ScopedCpuTensorHandle > m_Weight
A unique pointer to store Weight values.
OptimizeForConnection< PadLayer, Convolution2dLayer, FoldPadIntoConvolution2dImpl > FoldPadIntoConvolution2d
std::vector< ConvertFp32ToFp16Layer * > InsertConvertFp32ToFp16LayersAfter(Graph &graph, Layer &layer)
DataType GetDataType() const
bool CheckSequence(const armnn::Graph::ConstIterator first, const armnn::Graph::ConstIterator last)
std::unique_ptr< ScopedCpuTensorHandle > m_CellToInputWeights
A unique pointer to represent 1D weights tensor with dimensions [num_units].
LstmOptCifgParameters m_CifgParameters
std::unique_ptr< ScopedCpuTensorHandle > m_CellToForgetWeights
A unique pointer to represent 1D weights tensor with dimensions [num_units].
std::unique_ptr< ScopedCpuTensorHandle > m_ForgetGateBias
A unique pointer to represent 1D weights tensor with dimensions [num_units].
std::unique_ptr< ScopedCpuTensorHandle > m_RecurrentToCellWeights
A unique pointer to represent 2D weights tensor with dimensions [output_size, num_units].
uint32_t m_PoolWidth
Pooling width value.
bool m_PeepholeEnabled
Enable/disable peephole.
armnn::TensorInfo scoresInfo({ 1, 6, 3 }, armnn::DataType::Float32)
uint32_t m_StrideX
Stride value when proceeding through input for the width dimension.
std::unique_ptr< ScopedCpuTensorHandle > m_InputToForgetWeights
A unique pointer to represent 2D weights tensor with dimensions [input_size, num_units].
const Parameters & GetParameters() const
The padding fields don't count and are ignored.
LstmBasicParameters m_BasicParameters
void SetTensorInfo(const TensorInfo &tensorInfo) override
An LstmDescriptor for the LstmLayer.
uint32_t m_PadLeft
Padding left value in the width dimension.
A layer user-provided data can be bound to (e.g. inputs, outputs).
std::unique_ptr< ScopedCpuTensorHandle > m_ProjectionBias
A unique pointer to represent 1D weights tensor with dimensions [output_size].
PaddingMethod m_PaddingMethod
The padding method to be used. (Exclude, IgnoreValue).
This layer represents a Gather operator.
bool m_BiasEnabled
Enable/disable bias.
ConstIterator cbegin() const
Returns const iterator pointing to the beginning of the list. Lowercase for range-based for loops...
Optimizer::Optimizations MakeOptimizations(Args &&... args)
This layer represents a LSTM operation.
BOOST_AUTO_TEST_SUITE_END()
uint32_t m_TargetWidth
Target width value.
std::unique_ptr< ScopedCpuTensorHandle > m_RecurrentToForgetWeights
A unique pointer to represent 2D weights tensor with dimensions [output_size, num_units].
void CreateGatherGraph(Graph &graph, const armnn::TensorInfo ¶msInfo, const armnn::TensorInfo &indicesInfo, const armnn::TensorInfo &outputInfo)
std::unique_ptr< ScopedCpuTensorHandle > m_CellBias
A unique pointer to represent 1D weights tensor with dimensions [num_units].
uint32_t m_StrideY
Stride value when proceeding through input for the height dimension.
void Connect(armnn::IConnectableLayer *from, armnn::IConnectableLayer *to, const armnn::TensorInfo &tensorInfo, unsigned int fromIndex, unsigned int toIndex)
PoolingAlgorithm m_PoolType
The pooling algorithm to use (Max. Average, L2).
bool m_BiasEnabled
Enable/disable bias.
std::unique_ptr< ScopedCpuTensorHandle > m_InputToInputWeights
A unique pointer to represent 2D weights tensor with dimensions [input_size, num_units].
void SetTensorInfo(const TensorInfo &tensorInfo)
Sets the TensorInfo used by this output handler.
std::vector< float > anchors({ 0.5f, 0.5f, 1.0f, 1.0f, 0.5f, 0.5f, 1.0f, 1.0f, 0.5f, 0.5f, 1.0f, 1.0f, 0.5f, 10.5f, 1.0f, 1.0f, 0.5f, 10.5f, 1.0f, 1.0f, 0.5f, 100.5f, 1.0f, 1.0f })
This layer represents an addition operation.
void CreatePooling2dGraph(Graph &graph, const unsigned int *inputShape, const unsigned int *outputShape, DataLayout dataLayout=DataLayout::NCHW)
DataType GetDataType() const
BOOST_AUTO_TEST_SUITE(TensorflowLiteParser)
void CreateConvolution2dGraph(Graph &graph, const unsigned int *inputShape, const unsigned int *weightsShape, const unsigned int *outputShape, DataLayout dataLayout=DataLayout::NCHW)
std::vector< ConvertFp16ToFp32Layer * > InsertConvertFp16ToFp32LayersBefore(Graph &graph, Layer &layer, bool expectCorrectInputType)
A Pooling2dDescriptor for the Pooling2dLayer.
ConstIterator cend() const
Returns const iterator pointing to the end of the list. Lowercase for range-based for loops...
uint32_t m_ActivationFunc
The activation function to use. 0: None, 1: Relu, 3: Relu6, 4: Tanh, 6: Sigmoid.
void CreateResizeBilinearGraph(Graph &graph, const unsigned int *inputShape, const unsigned int *outputShape, DataLayout dataLayout=DataLayout::NCHW)
DataLayout m_DataLayout
The data layout to be used (NCHW, NHWC).
A DepthwiseConvolution2dDescriptor for the DepthwiseConvolution2dLayer.
A Convolution2dDescriptor for the Convolution2dLayer.
std::unique_ptr< ScopedCpuTensorHandle > m_OutputGateBias
A unique pointer to represent 1D weights tensor with dimensions [num_units].
uint32_t m_PadBottom
Padding bottom value in the height dimension.
const TensorInfo & GetTensorInfo() const override
float m_ClippingThresProj
Clipping threshold value for the projection.
uint32_t m_StrideY
Stride value when proceeding through input for the height dimension.
std::unique_ptr< ScopedCpuTensorHandle > m_CellToOutputWeights
A unique pointer to represent 1D weights tensor with dimensions [num_units].
uint32_t m_StrideX
Stride value when proceeding through input for the width dimension.
int LayerBindingId
Type of identifiers for bindable layers (inputs, outputs).
const OutputSlot & GetOutputSlot(unsigned int index=0) const override
A ResizeDescriptor for the ResizeLayer.
std::unique_ptr< ScopedCpuTensorHandle > m_RecurrentToOutputWeights
A unique pointer to represent 2D weights tensor with dimensions [output_size, num_units].
const InputSlot & GetInputSlot(unsigned int index) const override
uint32_t m_MaxDetections
Maximum numbers of detections.
This layer represents a resize operation.