ArmNN
 20.08
QLstmLayer.cpp
Go to the documentation of this file.
1 //
2 // Copyright © 2020 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 #include "QLstmLayer.hpp"
6 
7 #include "LayerCloneBase.hpp"
8 
9 #include <armnn/LstmParams.hpp>
10 #include <armnn/TypesUtils.hpp>
13 
14 namespace armnn
15 {
16 
17 QLstmLayer::QLstmLayer(const QLstmDescriptor& param, const char* name)
18  : LayerWithParameters(3, 3, LayerType::QLstm, param, name)
19 {
20 }
21 
22 std::unique_ptr<IWorkload> QLstmLayer::CreateWorkload(const IWorkloadFactory& factory) const
23 {
24  QLstmQueueDescriptor descriptor;
25 
26  // Basic parameters
34  descriptor.m_CellBias = m_BasicParameters.m_CellBias.get();
36 
37  // CIFG parameters
39  {
43  }
44 
45  // Projection parameters
47  {
50  }
51 
52  // Peephole parameters
54  {
56  {
58  }
59 
62  }
63 
64  // Layer normalisation parameters
66  {
68  {
70  }
74  }
75 
76  return factory.CreateQLstm(descriptor, PrepInfoAndDesc(descriptor));
77 }
78 
80 {
81  auto layer = CloneBase<QLstmLayer>(graph, m_Param, GetName());
82 
84  std::make_unique<ScopedCpuTensorHandle>(*m_BasicParameters.m_InputToForgetWeights) : nullptr;
85  layer->m_BasicParameters.m_InputToCellWeights = m_BasicParameters.m_InputToCellWeights ?
86  std::make_unique<ScopedCpuTensorHandle>(*m_BasicParameters.m_InputToCellWeights) : nullptr;
87  layer->m_BasicParameters.m_InputToOutputWeights = m_BasicParameters.m_InputToOutputWeights ?
88  std::make_unique<ScopedCpuTensorHandle>(*m_BasicParameters.m_InputToOutputWeights) : nullptr;
89  layer->m_BasicParameters.m_RecurrentToForgetWeights = m_BasicParameters.m_RecurrentToForgetWeights ?
90  std::make_unique<ScopedCpuTensorHandle>(*m_BasicParameters.m_RecurrentToForgetWeights) : nullptr;
91  layer->m_BasicParameters.m_RecurrentToCellWeights = m_BasicParameters.m_RecurrentToCellWeights ?
92  std::make_unique<ScopedCpuTensorHandle>(*m_BasicParameters.m_RecurrentToCellWeights) : nullptr;
93  layer->m_BasicParameters.m_RecurrentToOutputWeights = m_BasicParameters.m_RecurrentToOutputWeights ?
94  std::make_unique<ScopedCpuTensorHandle>(*m_BasicParameters.m_RecurrentToOutputWeights) : nullptr;
95  layer->m_BasicParameters.m_ForgetGateBias = m_BasicParameters.m_ForgetGateBias ?
96  std::make_unique<ScopedCpuTensorHandle>(*m_BasicParameters.m_ForgetGateBias) : nullptr;
97  layer->m_BasicParameters.m_CellBias = m_BasicParameters.m_CellBias ?
98  std::make_unique<ScopedCpuTensorHandle>(*m_BasicParameters.m_CellBias) : nullptr;
99  layer->m_BasicParameters.m_OutputGateBias = m_BasicParameters.m_OutputGateBias ?
100  std::make_unique<ScopedCpuTensorHandle>(*m_BasicParameters.m_OutputGateBias) : nullptr;
101 
102  if (!m_Param.m_CifgEnabled)
103  {
104  layer->m_CifgParameters.m_InputToInputWeights = m_CifgParameters.m_InputToInputWeights ?
105  std::make_unique<ScopedCpuTensorHandle>(*m_CifgParameters.m_InputToInputWeights) : nullptr;
106  layer->m_CifgParameters.m_RecurrentToInputWeights = m_CifgParameters.m_RecurrentToInputWeights ?
107  std::make_unique<ScopedCpuTensorHandle>(*m_CifgParameters.m_RecurrentToInputWeights) : nullptr;
108  layer->m_CifgParameters.m_InputGateBias = m_CifgParameters.m_InputGateBias ?
109  std::make_unique<ScopedCpuTensorHandle>(*m_CifgParameters.m_InputGateBias) : nullptr;
110  }
111 
112  if (m_Param.m_ProjectionEnabled)
113  {
114  layer->m_ProjectionParameters.m_ProjectionWeights = m_ProjectionParameters.m_ProjectionWeights ?
115  std::make_unique<ScopedCpuTensorHandle>(*m_ProjectionParameters.m_ProjectionWeights) : nullptr;
116  layer->m_ProjectionParameters.m_ProjectionBias = m_ProjectionParameters.m_ProjectionBias ?
117  std::make_unique<ScopedCpuTensorHandle>(*m_ProjectionParameters.m_ProjectionBias) : nullptr;
118  }
119 
120  if (m_Param.m_PeepholeEnabled)
121  {
122  if (!m_Param.m_CifgEnabled) {
123  layer->m_PeepholeParameters.m_CellToInputWeights = m_PeepholeParameters.m_CellToInputWeights ?
124  std::make_unique<ScopedCpuTensorHandle>(*m_PeepholeParameters.m_CellToInputWeights) : nullptr;
125  }
126 
127  layer->m_PeepholeParameters.m_CellToForgetWeights = m_PeepholeParameters.m_CellToForgetWeights ?
128  std::make_unique<ScopedCpuTensorHandle>(*m_PeepholeParameters.m_CellToForgetWeights) : nullptr;
129  layer->m_PeepholeParameters.m_CellToOutputWeights = m_PeepholeParameters.m_CellToOutputWeights ?
130  std::make_unique<ScopedCpuTensorHandle>(*m_PeepholeParameters.m_CellToOutputWeights) : nullptr;
131  }
132 
133  if (m_Param.m_LayerNormEnabled)
134  {
135  if (!m_Param.m_CifgEnabled) {
136  layer->m_LayerNormParameters.m_InputLayerNormWeights = m_LayerNormParameters.m_InputLayerNormWeights ?
137  std::make_unique<ScopedCpuTensorHandle>(*m_LayerNormParameters.m_InputLayerNormWeights) : nullptr;
138  }
139 
140  layer->m_LayerNormParameters.m_ForgetLayerNormWeights = m_LayerNormParameters.m_ForgetLayerNormWeights ?
141  std::make_unique<ScopedCpuTensorHandle>(*m_LayerNormParameters.m_ForgetLayerNormWeights) : nullptr;
142  layer->m_LayerNormParameters.m_CellLayerNormWeights = m_LayerNormParameters.m_CellLayerNormWeights ?
143  std::make_unique<ScopedCpuTensorHandle>(*m_LayerNormParameters.m_CellLayerNormWeights) : nullptr;
144  layer->m_LayerNormParameters.m_OutputLayerNormWeights = m_LayerNormParameters.m_OutputLayerNormWeights ?
145  std::make_unique<ScopedCpuTensorHandle>(*m_LayerNormParameters.m_OutputLayerNormWeights) : nullptr;
146  }
147 
148  return std::move(layer);
149 }
150 
151 std::vector<TensorShape> QLstmLayer::InferOutputShapes(const std::vector<TensorShape>& inputShapes) const
152 {
153  ARMNN_ASSERT(inputShapes.size() == 3);
154 
155  // Get input values for validation
156  unsigned int batchSize = inputShapes[0][0];
157  unsigned int outputSize = inputShapes[1][1];
158  unsigned int numUnits = inputShapes[2][1];
159 
160  std::vector<TensorShape> outShapes;
161  outShapes.push_back(TensorShape({ batchSize, outputSize })); // outputStateOut
162  outShapes.push_back(TensorShape({ batchSize, numUnits })); // cellStateOut
163  outShapes.push_back(TensorShape({ batchSize, outputSize })); // output
164 
165  return outShapes;
166 }
167 
169 {
171 
172  const TensorShape& outputShape = GetOutputSlot(0).GetTensorInfo().GetShape();
173 
175 
176  auto inferredShapes = InferOutputShapes(
177  {
179  GetInputSlot(1).GetConnection()->GetTensorInfo().GetShape(), // previousOutputIn
180  GetInputSlot(2).GetConnection()->GetTensorInfo().GetShape() // previousCellStateIn
181  });
182 
183  ARMNN_ASSERT(inferredShapes.size() == 3);
184 
185  // Check if the weights are nullptr for basic params
187  "QLstmLayer: m_BasicParameters.m_InputToForgetWeights should not be null.");
189  "QLstmLayer: m_BasicParameters.m_InputToCellWeights should not be null.");
191  "QLstmLayer: m_BasicParameters.m_InputToOutputWeights should not be null.");
193  "QLstmLayer: m_BasicParameters.m_RecurrentToForgetWeights should not be null.");
195  "QLstmLayer: m_BasicParameters.m_RecurrentToCellWeights should not be null.");
197  "QLstmLayer: m_BasicParameters.m_RecurrentToOutputWeights should not be null.");
199  "QLstmLayer: m_BasicParameters.m_ForgetGateBias should not be null.");
201  "QLstmLayer: m_BasicParameters.m_CellBias should not be null.");
203  "QLstmLayer: m_BasicParameters.m_OutputGateBias should not be null.");
204 
205  if (!m_Param.m_CifgEnabled)
206  {
208  "QLstmLayer: m_CifgParameters.m_InputToInputWeights should not be null.");
210  "QLstmLayer: m_CifgParameters.m_RecurrentToInputWeights should not be null.");
212  "QLstmLayer: m_CifgParameters.m_InputGateBias should not be null.");
213 
214  ValidateAndCopyShape(outputShape, inferredShapes[0], m_ShapeInferenceMethod, "QLstmLayer");
215  }
216  else
217  {
219  "QLstmLayer: m_CifgParameters.m_InputToInputWeights should not have a value when CIFG is enabled.");
221  "QLstmLayer: m_CifgParameters.m_RecurrentToInputWeights should "
222  "not have a value when CIFG is enabled.");
224  "QLstmLayer: m_CifgParameters.m_InputGateBias should not have a value when CIFG is enabled.");
225 
226  ValidateAndCopyShape(outputShape, inferredShapes[0], m_ShapeInferenceMethod, "QLstmLayer");
227  }
228 
230  {
232  "QLstmLayer: m_ProjectionParameters.m_ProjectionWeights should not be null.");
233  }
234 
236  {
237  if (!m_Param.m_CifgEnabled) {
239  "QLstmLayer: m_PeepholeParameters.m_CellToInputWeights should not be null "
240  "when Peephole is enabled and CIFG is disabled.");
241  }
242 
244  "QLstmLayer: m_PeepholeParameters.m_CellToForgetWeights should not be null.");
246  "QLstmLayer: m_PeepholeParameters.m_CellToOutputWeights should not be null.");
247  }
248 
250  GetOutputSlot(1).GetTensorInfo().GetShape(), inferredShapes[1], m_ShapeInferenceMethod, "QLstmLayer", 1);
252  GetOutputSlot(2).GetTensorInfo().GetShape(), inferredShapes[2], m_ShapeInferenceMethod, "QLstmLayer", 2);
253 
255  {
257  {
259  "QLstmLayer: m_LayerNormParameters.m_InputLayerNormWeights should not be null.");
260  }
262  "QLstmLayer: m_LayerNormParameters.m_ForgetLayerNormWeights should not be null.");
264  "QLstmLayer: m_LayerNormParameters.m_CellLayerNormWeights should not be null.");
266  "QLstmLayer: m_LayerNormParameters.m_UutputLayerNormWeights should not be null.");
267  }
268 }
269 
271 {
281 
282  // Cifg parameters
286 
287  // Projection parameters
290 
291  // Peephole parameters
295 
296  // Layer normalisation parameters
301 }
302 
303 void QLstmLayer::Accept(ILayerVisitor& visitor) const
304 {
305  LstmInputParams inputParams;
306 
307  ConstTensor inputToInputWeightsTensor;
309  {
310  ConstTensor inputToInputWeightsTensorCopy(m_CifgParameters.m_InputToInputWeights->GetTensorInfo(),
312  inputToInputWeightsTensor = inputToInputWeightsTensorCopy;
313  inputParams.m_InputToInputWeights = &inputToInputWeightsTensor;
314  }
315 
316  ConstTensor inputToForgetWeightsTensor;
318  {
319  ConstTensor inputToForgetWeightsTensorCopy(m_BasicParameters.m_InputToForgetWeights->GetTensorInfo(),
321  inputToForgetWeightsTensor = inputToForgetWeightsTensorCopy;
322  inputParams.m_InputToForgetWeights = &inputToForgetWeightsTensor;
323  }
324 
325  ConstTensor inputToCellWeightsTensor;
327  {
328  ConstTensor inputToCellWeightsTensorCopy(m_BasicParameters.m_InputToCellWeights->GetTensorInfo(),
330  inputToCellWeightsTensor = inputToCellWeightsTensorCopy;
331  inputParams.m_InputToCellWeights = &inputToCellWeightsTensor;
332  }
333 
334  ConstTensor inputToOutputWeightsTensor;
336  {
337  ConstTensor inputToOutputWeightsTensorCopy(m_BasicParameters.m_InputToOutputWeights->GetTensorInfo(),
339  inputToOutputWeightsTensor = inputToOutputWeightsTensorCopy;
340  inputParams.m_InputToOutputWeights = &inputToOutputWeightsTensor;
341  }
342 
343  ConstTensor recurrentToInputWeightsTensor;
345  {
346  ConstTensor recurrentToInputWeightsTensorCopy(
349  recurrentToInputWeightsTensor = recurrentToInputWeightsTensorCopy;
350  inputParams.m_RecurrentToInputWeights = &recurrentToInputWeightsTensor;
351  }
352 
353  ConstTensor recurrentToForgetWeightsTensor;
355  {
356  ConstTensor recurrentToForgetWeightsTensorCopy(
359  recurrentToForgetWeightsTensor = recurrentToForgetWeightsTensorCopy;
360  inputParams.m_RecurrentToForgetWeights = &recurrentToForgetWeightsTensor;
361  }
362 
363  ConstTensor recurrentToCellWeightsTensor;
365  {
366  ConstTensor recurrentToCellWeightsTensorCopy(
369  recurrentToCellWeightsTensor = recurrentToCellWeightsTensorCopy;
370  inputParams.m_RecurrentToCellWeights = &recurrentToCellWeightsTensor;
371  }
372 
373  ConstTensor recurrentToOutputWeightsTensor;
375  {
376  ConstTensor recurrentToOutputWeightsTensorCopy(
379  recurrentToOutputWeightsTensor = recurrentToOutputWeightsTensorCopy;
380  inputParams.m_RecurrentToOutputWeights = &recurrentToOutputWeightsTensor;
381  }
382 
383  ConstTensor cellToInputWeightsTensor;
385  {
386  ConstTensor cellToInputWeightsTensorCopy(m_PeepholeParameters.m_CellToInputWeights->GetTensorInfo(),
388  cellToInputWeightsTensor = cellToInputWeightsTensorCopy;
389  inputParams.m_CellToInputWeights = &cellToInputWeightsTensor;
390  }
391 
392  ConstTensor cellToForgetWeightsTensor;
394  {
395  ConstTensor cellToForgetWeightsTensorCopy(m_PeepholeParameters.m_CellToForgetWeights->GetTensorInfo(),
397  cellToForgetWeightsTensor = cellToForgetWeightsTensorCopy;
398  inputParams.m_CellToForgetWeights = &cellToForgetWeightsTensor;
399  }
400 
401  ConstTensor cellToOutputWeightsTensor;
403  {
404  ConstTensor cellToOutputWeightsTensorCopy(m_PeepholeParameters.m_CellToOutputWeights->GetTensorInfo(),
406  cellToOutputWeightsTensor = cellToOutputWeightsTensorCopy;
407  inputParams.m_CellToOutputWeights = &cellToOutputWeightsTensor;
408  }
409 
410  ConstTensor inputGateBiasTensor;
411  if (m_CifgParameters.m_InputGateBias != nullptr)
412  {
413  ConstTensor inputGateBiasTensorCopy(m_CifgParameters.m_InputGateBias->GetTensorInfo(),
414  m_CifgParameters.m_InputGateBias->Map(true));
415  inputGateBiasTensor = inputGateBiasTensorCopy;
416  inputParams.m_InputGateBias = &inputGateBiasTensor;
417  }
418 
419  ConstTensor forgetGateBiasTensor;
420  if (m_BasicParameters.m_ForgetGateBias != nullptr)
421  {
422  ConstTensor forgetGateBiasTensorCopy(m_BasicParameters.m_ForgetGateBias->GetTensorInfo(),
424  forgetGateBiasTensor = forgetGateBiasTensorCopy;
425  inputParams.m_ForgetGateBias = &forgetGateBiasTensor;
426  }
427 
428  ConstTensor cellBiasTensor;
429  if (m_BasicParameters.m_CellBias != nullptr)
430  {
431  ConstTensor cellBiasTensorCopy(m_BasicParameters.m_CellBias->GetTensorInfo(),
432  m_BasicParameters.m_CellBias->Map(true));
433  cellBiasTensor = cellBiasTensorCopy;
434  inputParams.m_CellBias = &cellBiasTensor;
435  }
436 
437  ConstTensor outputGateBias;
438  if (m_BasicParameters.m_OutputGateBias != nullptr)
439  {
440  ConstTensor outputGateBiasCopy(m_BasicParameters.m_OutputGateBias->GetTensorInfo(),
442  outputGateBias = outputGateBiasCopy;
443  inputParams.m_OutputGateBias = &outputGateBias;
444  }
445 
446  ConstTensor projectionWeightsTensor;
448  {
449  ConstTensor projectionWeightsTensorCopy(m_ProjectionParameters.m_ProjectionWeights->GetTensorInfo(),
451  projectionWeightsTensor = projectionWeightsTensorCopy;
452  inputParams.m_ProjectionWeights = &projectionWeightsTensor;
453  }
454 
455  ConstTensor projectionBiasTensor;
457  {
458  ConstTensor projectionBiasTensorCopy(m_ProjectionParameters.m_ProjectionBias->GetTensorInfo(),
460  projectionBiasTensor = projectionBiasTensorCopy;
461  inputParams.m_ProjectionBias = &projectionBiasTensor;
462  }
463 
464  ConstTensor inputLayerNormTensor;
466  {
467  ConstTensor inputLayerNormTensorCopy(m_LayerNormParameters.m_InputLayerNormWeights->GetTensorInfo(),
469  inputLayerNormTensor = inputLayerNormTensorCopy;
470  inputParams.m_InputLayerNormWeights = &inputLayerNormTensor;
471  }
472 
473  ConstTensor forgetLayerNormTensor;
475  {
476  ConstTensor forgetLayerNormTensorCopy(m_LayerNormParameters.m_ForgetLayerNormWeights->GetTensorInfo(),
478  forgetLayerNormTensor = forgetLayerNormTensorCopy;
479  inputParams.m_ForgetLayerNormWeights = &forgetLayerNormTensor;
480  }
481 
482  ConstTensor cellLayerNormTensor;
484  {
485  ConstTensor cellLayerNormTensorCopy(m_LayerNormParameters.m_CellLayerNormWeights->GetTensorInfo(),
487  cellLayerNormTensor = cellLayerNormTensorCopy;
488  inputParams.m_CellLayerNormWeights = &cellLayerNormTensor;
489  }
490 
491  ConstTensor outputLayerNormTensor;
493  {
494  ConstTensor outputLayerNormTensorCopy(m_LayerNormParameters.m_OutputLayerNormWeights->GetTensorInfo(),
496  outputLayerNormTensor = outputLayerNormTensorCopy;
497  inputParams.m_OutputLayerNormWeights = &outputLayerNormTensor;
498  }
499 
500 
501  visitor.VisitQLstmLayer(this, GetParameters(), inputParams, GetName());
502 }
503 
504 } // namespace armnn
const ConstCpuTensorHandle * m_CellToForgetWeights
virtual void VisitQLstmLayer(const IConnectableLayer *layer, const QLstmDescriptor &descriptor, const LstmInputParams &params, const char *name=nullptr)=0
Function a QLstm layer should call back to when its Accept(ILayerVisitor&) function is invoked...
const ConstTensor * m_ProjectionWeights
Definition: LstmParams.hpp:55
const ConstTensor * m_CellBias
Definition: LstmParams.hpp:53
QLstmDescriptor m_Param
The parameters for the layer (not including tensor-valued weights etc.).
const TensorShape & GetShape() const
Definition: Tensor.hpp:187
const ConstCpuTensorHandle * m_ProjectionWeights
QLstmOptProjectionParameters m_ProjectionParameters
Definition: QLstmLayer.hpp:85
const ConstTensor * m_CellToOutputWeights
Definition: LstmParams.hpp:50
std::unique_ptr< ScopedCpuTensorHandle > m_OutputGateBias
A unique pointer to represent 1D bias tensor with dimensions [num_units] (int32). ...
Definition: QLstmLayer.hpp:35
std::unique_ptr< ScopedCpuTensorHandle > m_RecurrentToInputWeights
A unique pointer to represent 2D weights tensor with dimensions [input_size, num_units] (QSymmS8)...
Definition: QLstmLayer.hpp:61
std::unique_ptr< ScopedCpuTensorHandle > m_CellLayerNormWeights
A unique pointer to represent 1D weights tensor with dimensions [num_units] (QSymmS16).
Definition: QLstmLayer.hpp:73
bool m_PeepholeEnabled
Enable/disable peephole.
std::unique_ptr< ScopedCpuTensorHandle > m_InputLayerNormWeights
A unique pointer to represent 1D weights tensor with dimensions [num_units] (QSymmS16).
Definition: QLstmLayer.hpp:69
const ConstCpuTensorHandle * m_ProjectionBias
const ConstCpuTensorHandle * m_ForgetLayerNormWeights
const ConstTensor * m_CellToInputWeights
Definition: LstmParams.hpp:48
std::unique_ptr< ScopedCpuTensorHandle > m_InputToInputWeights
A unique pointer to represent 2D weights tensor with dimensions [input_size, num_units] (QSymmS8)...
Definition: QLstmLayer.hpp:59
const ConstCpuTensorHandle * m_CellLayerNormWeights
std::unique_ptr< ScopedCpuTensorHandle > m_CellToOutputWeights
A unique pointer to represent 1D weights tensor with dimensions [num_units] (QSymmS16).
Definition: QLstmLayer.hpp:53
const ConstTensor * m_InputGateBias
Definition: LstmParams.hpp:51
std::unique_ptr< ScopedCpuTensorHandle > m_ProjectionBias
A unique pointer to represent 1D weights tensor with dimensions [output_size] (int32).
Definition: QLstmLayer.hpp:43
std::unique_ptr< ScopedCpuTensorHandle > m_ProjectionWeights
A unique pointer to represent 2D weights tensor with dimensions [output_size, num_units] (QSymmS8)...
Definition: QLstmLayer.hpp:41
const ConstCpuTensorHandle * m_RecurrentToCellWeights
virtual std::unique_ptr< IWorkload > CreateQLstm(const QLstmQueueDescriptor &descriptor, const WorkloadInfo &info) const
const ConstCpuTensorHandle * m_RecurrentToInputWeights
std::unique_ptr< ScopedCpuTensorHandle > m_InputToForgetWeights
A unique pointer to represent 2D weights tensor with dimensions [num_units, inputSize] (QSymmS8)...
Definition: QLstmLayer.hpp:17
std::unique_ptr< ScopedCpuTensorHandle > m_CellBias
A unique pointer to represent 1D bias tensor with dimensions [num_units] (int32). ...
Definition: QLstmLayer.hpp:33
const ConstTensor * m_RecurrentToCellWeights
Definition: LstmParams.hpp:46
const ConstTensor * m_ForgetLayerNormWeights
Definition: LstmParams.hpp:58
void VerifyShapeInferenceType(const TensorShape &outputShape, ShapeInferenceMethod shapeInferenceMethod)
Definition: Layer.cpp:432
const ConstCpuTensorHandle * m_OutputGateBias
const ConstTensor * m_CellToForgetWeights
Definition: LstmParams.hpp:49
const ConstCpuTensorHandle * m_CellBias
Copyright (c) 2020 ARM Limited.
std::unique_ptr< ScopedCpuTensorHandle > m_InputToOutputWeights
A unique pointer to represent 2D weights tensor with dimensions [num_units, inputSize] (QSymmS8)...
Definition: QLstmLayer.hpp:21
const IOutputSlot * GetConnection() const override
Definition: Layer.hpp:199
std::unique_ptr< ScopedCpuTensorHandle > m_OutputLayerNormWeights
A unique pointer to represent 1D weights tensor with dimensions [num_units] (QSymmS16).
Definition: QLstmLayer.hpp:75
void ValidateAndCopyShape(const TensorShape &outputShape, const TensorShape &inferredShape, const ShapeInferenceMethod shapeInferenceMethod, const std::string &layerName, const unsigned int outputSlotIndex=0)
Definition: Layer.cpp:392
const ConstTensor * m_OutputGateBias
Definition: LstmParams.hpp:54
QLstmOptLayerNormParameters m_LayerNormParameters
Definition: QLstmLayer.hpp:87
QLstmLayer * Clone(Graph &graph) const override
Creates a dynamically-allocated copy of this layer.
Definition: QLstmLayer.cpp:79
const ConstCpuTensorHandle * m_CellToOutputWeights
std::unique_ptr< ScopedCpuTensorHandle > m_RecurrentToForgetWeights
A unique pointer to represent 2D weights tensor with dimensions [num_units, outputSize] (QSymmS8)...
Definition: QLstmLayer.hpp:24
const ConstCpuTensorHandle * m_OutputLayerNormWeights
void VerifyLayerConnections(unsigned int expectedConnections, const CheckLocation &location) const
Definition: Layer.cpp:344
std::unique_ptr< ScopedCpuTensorHandle > m_CellToInputWeights
A unique pointer to represent 1D weights tensor with dimensions [num_units] (QSymmS16).
Definition: QLstmLayer.hpp:49
const InputSlot & GetInputSlot(unsigned int index) const override
Get a const input slot handle by slot index.
Definition: Layer.hpp:312
const ConstTensor * m_InputLayerNormWeights
Definition: LstmParams.hpp:57
bool m_LayerNormEnabled
Enable/disable layer normalization.
const ConstTensor * m_RecurrentToOutputWeights
Definition: LstmParams.hpp:47
#define ARMNN_ASSERT_MSG(COND, MSG)
Definition: Assert.hpp:15
virtual std::unique_ptr< IWorkload > CreateWorkload(const IWorkloadFactory &factory) const override
Makes a workload for the QLstm type.
Definition: QLstmLayer.cpp:22
const ConstCpuTensorHandle * m_InputToForgetWeights
const ConstTensor * m_ProjectionBias
Definition: LstmParams.hpp:56
std::unique_ptr< ScopedCpuTensorHandle > m_CellToForgetWeights
A unique pointer to represent 1D weights tensor with dimensions [num_units] (QSymmS16).
Definition: QLstmLayer.hpp:51
A tensor defined by a TensorInfo (shape and data type) and an immutable backing store.
Definition: Tensor.hpp:298
std::unique_ptr< ScopedCpuTensorHandle > m_InputGateBias
A unique pointer to represent 1D weights tensor with dimensions [num_units] (int32).
Definition: QLstmLayer.hpp:63
#define ARMNN_ASSERT(COND)
Definition: Assert.hpp:14
A QLstmDescriptor for the QLstmLayer.
std::unique_ptr< ScopedCpuTensorHandle > m_ForgetLayerNormWeights
A unique pointer to represent 1D weights tensor with dimensions [num_units] (QSymmS16).
Definition: QLstmLayer.hpp:71
void ValidateTensorShapesFromInputs() override
Check if the input tensor shape(s) will lead to a valid configuration of QLstmLayer.
Definition: QLstmLayer.cpp:168
QLstmLayer(const QLstmDescriptor &param, const char *name)
Constructor to create a QLstmLayer.
Definition: QLstmLayer.cpp:17
Layer::ConstantTensors GetConstantTensorsByRef() override
Retrieve the handles to the constant values stored by the layer.
Definition: QLstmLayer.cpp:270
#define CHECK_LOCATION()
Definition: Exceptions.hpp:197
std::unique_ptr< ScopedCpuTensorHandle > m_InputToCellWeights
A unique pointer to represent 2D weights tensor with dimensions [num_units, inputSize] (QSymmS8)...
Definition: QLstmLayer.hpp:19
QLstmBasicParameters m_BasicParameters
Definition: QLstmLayer.hpp:83
const ConstCpuTensorHandle * m_CellToInputWeights
const ConstTensor * m_CellLayerNormWeights
Definition: LstmParams.hpp:59
const ConstTensor * m_ForgetGateBias
Definition: LstmParams.hpp:52
const ConstTensor * m_InputToCellWeights
Definition: LstmParams.hpp:42
const ConstTensor * m_InputToOutputWeights
Definition: LstmParams.hpp:43
This layer represents a QLstm operation.
Definition: QLstmLayer.hpp:79
std::unique_ptr< ScopedCpuTensorHandle > m_ForgetGateBias
A unique pointer to represent 1D bias tensor with dimensions [num_units] (int32). ...
Definition: QLstmLayer.hpp:31
const ConstTensor * m_RecurrentToForgetWeights
Definition: LstmParams.hpp:45
const ConstCpuTensorHandle * m_RecurrentToOutputWeights
std::unique_ptr< ScopedCpuTensorHandle > m_RecurrentToCellWeights
A unique pointer to represent 2D weights tensor with dimensions [num_units, outputSize] (QSymmS8)...
Definition: QLstmLayer.hpp:26
bool m_ProjectionEnabled
Enable/disable the projection layer.
const ConstTensor * m_RecurrentToInputWeights
Definition: LstmParams.hpp:44
WorkloadInfo PrepInfoAndDesc(QueueDescriptor &descriptor) const
Helper function to reduce duplication in *LayerCreateWorkload.
const ConstCpuTensorHandle * m_InputGateBias
std::unique_ptr< ScopedCpuTensorHandle > m_RecurrentToOutputWeights
A unique pointer to represent 2D weights tensor with dimensions [num_units, outputSize] (QSymmS8)...
Definition: QLstmLayer.hpp:28
const OutputSlot & GetOutputSlot(unsigned int index=0) const override
Get the const output slot handle by slot index.
Definition: Layer.hpp:314
void Accept(ILayerVisitor &visitor) const override
Apply a visitor to this layer.
Definition: QLstmLayer.cpp:303
virtual const TensorInfo & GetTensorInfo() const =0
QLstmOptCifgParameters m_CifgParameters
Definition: QLstmLayer.hpp:84
QLstmOptPeepholeParameters m_PeepholeParameters
Definition: QLstmLayer.hpp:86
const char * GetName() const override
Returns the name of the layer.
Definition: Layer.hpp:307
const ConstCpuTensorHandle * m_InputLayerNormWeights
const ConstCpuTensorHandle * m_RecurrentToForgetWeights
const ConstTensor * m_OutputLayerNormWeights
Definition: LstmParams.hpp:60
std::vector< std::reference_wrapper< std::unique_ptr< ScopedCpuTensorHandle > >> ConstantTensors
Definition: Layer.hpp:378
std::vector< TensorShape > InferOutputShapes(const std::vector< TensorShape > &inputShapes) const override
By default returns inputShapes if the number of inputs are equal to number of outputs, otherwise infers the output shapes from given input shapes and layer properties.
Definition: QLstmLayer.cpp:151
const ConstCpuTensorHandle * m_ForgetGateBias
const TensorInfo & GetTensorInfo(const ITensorHandle *tensorHandle)
float32 helpers
const TensorInfo & GetTensorInfo() const override
Definition: Layer.cpp:63
const ConstCpuTensorHandle * m_InputToOutputWeights
bool m_CifgEnabled
Enable/disable CIFG (coupled input & forget gate).
const ConstCpuTensorHandle * m_InputToInputWeights
ShapeInferenceMethod m_ShapeInferenceMethod
Definition: Layer.hpp:387
const ConstTensor * m_InputToForgetWeights
Definition: LstmParams.hpp:41
const ConstTensor * m_InputToInputWeights
Definition: LstmParams.hpp:40
const ConstCpuTensorHandle * m_InputToCellWeights