ArmNN
 20.08
LstmLayer.cpp
Go to the documentation of this file.
1 //
2 // Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 #include "LstmLayer.hpp"
6 
7 #include "LayerCloneBase.hpp"
8 
9 #include <armnn/LstmParams.hpp>
10 #include <armnn/TypesUtils.hpp>
13 
14 namespace armnn
15 {
16 
17 LstmLayer::LstmLayer(const LstmDescriptor& param, const char* name)
18  : LayerWithParameters(3, 4, LayerType::Lstm, param, name)
19 {
20 }
21 
22 std::unique_ptr<IWorkload> LstmLayer::CreateWorkload(const IWorkloadFactory& factory) const
23 {
24  LstmQueueDescriptor 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  }
61  }
62 
63  // Layer normalisation parameters
65  {
67  {
69  }
73  }
74 
75  return factory.CreateLstm(descriptor, PrepInfoAndDesc(descriptor));
76 }
77 
79 {
80  auto layer = CloneBase<LstmLayer>(graph, m_Param, GetName());
81 
83  std::make_unique<ScopedCpuTensorHandle>(*m_BasicParameters.m_InputToForgetWeights)
84  : 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  {
124  layer->m_PeepholeParameters.m_CellToInputWeights = m_PeepholeParameters.m_CellToInputWeights ?
125  std::make_unique<ScopedCpuTensorHandle>(*m_PeepholeParameters.m_CellToInputWeights) : nullptr;
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  layer->m_LayerNormParameters.m_InputLayerNormWeights = m_LayerNormParameters.m_InputLayerNormWeights ?
136  std::make_unique<ScopedCpuTensorHandle>(*m_LayerNormParameters.m_InputLayerNormWeights) : nullptr;
137  layer->m_LayerNormParameters.m_ForgetLayerNormWeights = m_LayerNormParameters.m_ForgetLayerNormWeights ?
138  std::make_unique<ScopedCpuTensorHandle>(*m_LayerNormParameters.m_ForgetLayerNormWeights) : nullptr;
139  layer->m_LayerNormParameters.m_CellLayerNormWeights = m_LayerNormParameters.m_CellLayerNormWeights ?
140  std::make_unique<ScopedCpuTensorHandle>(*m_LayerNormParameters.m_CellLayerNormWeights) : nullptr;
141  layer->m_LayerNormParameters.m_OutputLayerNormWeights = m_LayerNormParameters.m_OutputLayerNormWeights ?
142  std::make_unique<ScopedCpuTensorHandle>(*m_LayerNormParameters.m_OutputLayerNormWeights) : nullptr;
143  }
144 
145  return std::move(layer);
146 }
147 
148 std::vector<TensorShape> LstmLayer::InferOutputShapes(const std::vector<TensorShape>& inputShapes) const
149 {
150  ARMNN_ASSERT(inputShapes.size() == 3);
151 
152  // Get input values for validation
153  unsigned int batchSize = inputShapes[0][0];
154  unsigned int outputSize = inputShapes[1][1];
155  unsigned int numUnits = inputShapes[2][1];
156 
157  std::vector<TensorShape> outShapes;
158  outShapes.push_back(TensorShape({batchSize, numUnits * (m_Param.m_CifgEnabled ? 3 : 4)}));
159  outShapes.push_back(TensorShape({batchSize, outputSize}));
160  outShapes.push_back(TensorShape({batchSize, numUnits}));
161  outShapes.push_back(TensorShape({batchSize, outputSize}));
162 
163  return outShapes;
164 }
165 
167 {
169 
170  const TensorShape& outputShape = GetOutputSlot(0).GetTensorInfo().GetShape();
171 
173 
174  auto inferredShapes = InferOutputShapes( {
178  });
179 
180  ARMNN_ASSERT(inferredShapes.size() == 4);
181 
182  // Check if the weights are nullptr
184  "LstmLayer: m_BasicParameters.m_InputToForgetWeights should not be null.");
186  "LstmLayer: m_BasicParameters.m_InputToCellWeights should not be null.");
188  "LstmLayer: m_BasicParameters.m_InputToOutputWeights should not be null.");
190  "LstmLayer: m_BasicParameters.m_RecurrentToForgetWeights should not be null.");
192  "LstmLayer: m_BasicParameters.m_RecurrentToCellWeights should not be null.");
194  "LstmLayer: m_BasicParameters.m_RecurrentToOutputWeights should not be null.");
196  "LstmLayer: m_BasicParameters.m_ForgetGateBias should not be null.");
198  "LstmLayer: m_BasicParameters.m_CellBias should not be null.");
200  "LstmLayer: m_BasicParameters.m_OutputGateBias should not be null.");
201 
202  if (!m_Param.m_CifgEnabled)
203  {
205  "LstmLayer: m_CifgParameters.m_InputToInputWeights should not be null.");
207  "LstmLayer: m_CifgParameters.m_RecurrentToInputWeights should not be null.");
209  "LstmLayer: m_CifgParameters.m_InputGateBias should not be null.");
210 
211  ValidateAndCopyShape(outputShape, inferredShapes[0], m_ShapeInferenceMethod, "LstmLayer");
212  }
213  else
214  {
216  "LstmLayer: m_CifgParameters.m_InputToInputWeights should not have a value when CIFG is enabled.");
218  "LstmLayer: m_CifgParameters.m_RecurrentToInputWeights should not have a value when CIFG is enabled.");
220  "LstmLayer: m_CifgParameters.m_InputGateBias should not have a value when CIFG is enabled.");
221 
222  ValidateAndCopyShape(outputShape, inferredShapes[0], m_ShapeInferenceMethod, "LstmLayer");
223  }
224 
226  {
228  "LstmLayer: m_ProjectionParameters.m_ProjectionWeights should not be null.");
229  }
230 
232  {
233  if (!m_Param.m_CifgEnabled)
234  {
236  "LstmLayer: m_PeepholeParameters.m_CellToInputWeights should not be null "
237  "when Peephole is enabled and CIFG is disabled.");
238  }
240  "LstmLayer: m_PeepholeParameters.m_CellToForgetWeights should not be null.");
242  "LstmLayer: m_PeepholeParameters.m_CellToOutputWeights should not be null.");
243  }
244 
246  GetOutputSlot(1).GetTensorInfo().GetShape(), inferredShapes[1], m_ShapeInferenceMethod, "LstmLayer", 1);
248  GetOutputSlot(2).GetTensorInfo().GetShape(), inferredShapes[2], m_ShapeInferenceMethod, "LstmLayer", 2);
250  GetOutputSlot(3).GetTensorInfo().GetShape(), inferredShapes[3], m_ShapeInferenceMethod, "LstmLayer", 3);
251 
253  {
255  {
257  "LstmLayer: m_LayerNormParameters.m_inputLayerNormWeights should not be null.");
258  }
260  "LstmLayer: m_LayerNormParameters.m_forgetLayerNormWeights should not be null.");
262  "LstmLayer: m_LayerNormParameters.m_cellLayerNormWeights should not be null.");
264  "LstmLayer: m_LayerNormParameters.m_outputLayerNormWeights should not be null.");
265  }
266 }
267 
269 {
279 
280  // Cifg parameters
284 
285  // Projection parameters
288 
289  // Peephole parameters
293 
294  // Layer normalisation parameters
299 }
300 
301 void LstmLayer::Accept(ILayerVisitor& visitor) const
302 {
303  LstmInputParams inputParams;
304  ConstTensor inputToInputWeightsTensor;
306  {
307  ConstTensor inputToInputWeightsTensorCopy(m_CifgParameters.m_InputToInputWeights->GetTensorInfo(),
309  inputToInputWeightsTensor = inputToInputWeightsTensorCopy;
310  inputParams.m_InputToInputWeights = &inputToInputWeightsTensor;
311  }
312  ConstTensor inputToForgetWeightsTensor;
314  {
315  ConstTensor inputToForgetWeightsTensorCopy(m_BasicParameters.m_InputToForgetWeights->GetTensorInfo(),
317  inputToForgetWeightsTensor = inputToForgetWeightsTensorCopy;
318  inputParams.m_InputToForgetWeights = &inputToForgetWeightsTensor;
319  }
320  ConstTensor inputToCellWeightsTensor;
322  {
323  ConstTensor inputToCellWeightsTensorCopy(m_BasicParameters.m_InputToCellWeights->GetTensorInfo(),
325  inputToCellWeightsTensor = inputToCellWeightsTensorCopy;
326  inputParams.m_InputToCellWeights = &inputToCellWeightsTensor;
327  }
328  ConstTensor inputToOutputWeightsTensor;
330  {
331  ConstTensor inputToOutputWeightsTensorCopy(m_BasicParameters.m_InputToOutputWeights->GetTensorInfo(),
333  inputToOutputWeightsTensor = inputToOutputWeightsTensorCopy;
334  inputParams.m_InputToOutputWeights = &inputToOutputWeightsTensor;
335  }
336  ConstTensor recurrentToInputWeightsTensor;
338  {
339  ConstTensor recurrentToInputWeightsTensorCopy(
342  recurrentToInputWeightsTensor = recurrentToInputWeightsTensorCopy;
343  inputParams.m_RecurrentToInputWeights = &recurrentToInputWeightsTensor;
344  }
345  ConstTensor recurrentToForgetWeightsTensor;
347  {
348  ConstTensor recurrentToForgetWeightsTensorCopy(
351  recurrentToForgetWeightsTensor = recurrentToForgetWeightsTensorCopy;
352  inputParams.m_RecurrentToForgetWeights = &recurrentToForgetWeightsTensor;
353  }
354  ConstTensor recurrentToCellWeightsTensor;
356  {
357  ConstTensor recurrentToCellWeightsTensorCopy(
360  recurrentToCellWeightsTensor = recurrentToCellWeightsTensorCopy;
361  inputParams.m_RecurrentToCellWeights = &recurrentToCellWeightsTensor;
362  }
363  ConstTensor recurrentToOutputWeightsTensor;
365  {
366  ConstTensor recurrentToOutputWeightsTensorCopy(
369  recurrentToOutputWeightsTensor = recurrentToOutputWeightsTensorCopy;
370  inputParams.m_RecurrentToOutputWeights = &recurrentToOutputWeightsTensor;
371  }
372  ConstTensor cellToInputWeightsTensor;
374  {
375  ConstTensor cellToInputWeightsTensorCopy(m_PeepholeParameters.m_CellToInputWeights->GetTensorInfo(),
377  cellToInputWeightsTensor = cellToInputWeightsTensorCopy;
378  inputParams.m_CellToInputWeights = &cellToInputWeightsTensor;
379  }
380  ConstTensor cellToForgetWeightsTensor;
382  {
383  ConstTensor cellToForgetWeightsTensorCopy(m_PeepholeParameters.m_CellToForgetWeights->GetTensorInfo(),
385  cellToForgetWeightsTensor = cellToForgetWeightsTensorCopy;
386  inputParams.m_CellToForgetWeights = &cellToForgetWeightsTensor;
387  }
388  ConstTensor cellToOutputWeightsTensor;
390  {
391  ConstTensor cellToOutputWeightsTensorCopy(m_PeepholeParameters.m_CellToOutputWeights->GetTensorInfo(),
393  cellToOutputWeightsTensor = cellToOutputWeightsTensorCopy;
394  inputParams.m_CellToOutputWeights = &cellToOutputWeightsTensor;
395  }
396  ConstTensor inputGateBiasTensor;
397  if (m_CifgParameters.m_InputGateBias != nullptr)
398  {
399  ConstTensor inputGateBiasTensorCopy(m_CifgParameters.m_InputGateBias->GetTensorInfo(),
400  m_CifgParameters.m_InputGateBias->Map(true));
401  inputGateBiasTensor = inputGateBiasTensorCopy;
402  inputParams.m_InputGateBias = &inputGateBiasTensor;
403  }
404  ConstTensor forgetGateBiasTensor;
405  if (m_BasicParameters.m_ForgetGateBias != nullptr)
406  {
407  ConstTensor forgetGateBiasTensorCopy(m_BasicParameters.m_ForgetGateBias->GetTensorInfo(),
409  forgetGateBiasTensor = forgetGateBiasTensorCopy;
410  inputParams.m_ForgetGateBias = &forgetGateBiasTensor;
411  }
412  ConstTensor cellBiasTensor;
413  if (m_BasicParameters.m_CellBias != nullptr)
414  {
415  ConstTensor cellBiasTensorCopy(m_BasicParameters.m_CellBias->GetTensorInfo(),
416  m_BasicParameters.m_CellBias->Map(true));
417  cellBiasTensor = cellBiasTensorCopy;
418  inputParams.m_CellBias = &cellBiasTensor;
419  }
420  ConstTensor outputGateBias;
421  if (m_BasicParameters.m_OutputGateBias != nullptr)
422  {
423  ConstTensor outputGateBiasCopy(m_BasicParameters.m_OutputGateBias->GetTensorInfo(),
425  outputGateBias = outputGateBiasCopy;
426  inputParams.m_OutputGateBias = &outputGateBias;
427  }
428  ConstTensor projectionWeightsTensor;
430  {
431  ConstTensor projectionWeightsTensorCopy(m_ProjectionParameters.m_ProjectionWeights->GetTensorInfo(),
433  projectionWeightsTensor = projectionWeightsTensorCopy;
434  inputParams.m_ProjectionWeights = &projectionWeightsTensor;
435  }
436  ConstTensor projectionBiasTensor;
438  {
439  ConstTensor projectionBiasTensorCopy(m_ProjectionParameters.m_ProjectionBias->GetTensorInfo(),
441  projectionBiasTensor = projectionBiasTensorCopy;
442  inputParams.m_ProjectionBias = &projectionBiasTensor;
443  }
444  ConstTensor inputLayerNormTensor;
446  {
447  ConstTensor inputLayerNormTensorCopy(m_LayerNormParameters.m_InputLayerNormWeights->GetTensorInfo(),
449  inputLayerNormTensor = inputLayerNormTensorCopy;
450  inputParams.m_InputLayerNormWeights = &inputLayerNormTensor;
451  }
452  ConstTensor forgetLayerNormTensor;
454  {
455  ConstTensor forgetLayerNormTensorCopy(m_LayerNormParameters.m_ForgetLayerNormWeights->GetTensorInfo(),
457  forgetLayerNormTensor = forgetLayerNormTensorCopy;
458  inputParams.m_ForgetLayerNormWeights = &forgetLayerNormTensor;
459  }
460  ConstTensor cellLayerNormTensor;
462  {
463  ConstTensor cellLayerNormTensorCopy(m_LayerNormParameters.m_CellLayerNormWeights->GetTensorInfo(),
465  cellLayerNormTensor = cellLayerNormTensorCopy;
466  inputParams.m_CellLayerNormWeights = &cellLayerNormTensor;
467  }
468  ConstTensor outputLayerNormTensor;
470  {
471  ConstTensor outputLayerNormTensorCopy(m_LayerNormParameters.m_OutputLayerNormWeights->GetTensorInfo(),
473  outputLayerNormTensor = outputLayerNormTensorCopy;
474  inputParams.m_OutputLayerNormWeights = &outputLayerNormTensor;
475  }
476 
477 
478  visitor.VisitLstmLayer(this, GetParameters(), inputParams, GetName());
479 }
480 
481 } // namespace armnn
std::unique_ptr< ScopedCpuTensorHandle > m_ForgetGateBias
A unique pointer to represent 1D weights tensor with dimensions [num_units].
Definition: LstmLayer.hpp:69
std::unique_ptr< ScopedCpuTensorHandle > m_InputToOutputWeights
A unique pointer to represent 2D weights tensor with dimensions [input_size, num_units].
Definition: LstmLayer.hpp:61
std::unique_ptr< ScopedCpuTensorHandle > m_RecurrentToCellWeights
A unique pointer to represent 2D weights tensor with dimensions [output_size, num_units].
Definition: LstmLayer.hpp:65
bool m_ProjectionEnabled
Enable/disable the projection layer.
LstmBasicParameters m_BasicParameters
Definition: LstmLayer.hpp:81
const ConstTensor * m_ProjectionWeights
Definition: LstmParams.hpp:55
const ConstTensor * m_CellBias
Definition: LstmParams.hpp:53
LstmDescriptor m_Param
The parameters for the layer (not including tensor-valued weights etc.).
const TensorShape & GetShape() const
Definition: Tensor.hpp:187
std::unique_ptr< ScopedCpuTensorHandle > m_InputToInputWeights
A unique pointer to represent 2D weights tensor with dimensions [input_size, num_units].
Definition: LstmLayer.hpp:29
const ConstCpuTensorHandle * m_RecurrentToForgetWeights
const ConstCpuTensorHandle * m_CellToOutputWeights
const ConstTensor * m_CellToOutputWeights
Definition: LstmParams.hpp:50
const ConstCpuTensorHandle * m_InputToCellWeights
const ConstCpuTensorHandle * m_InputToOutputWeights
std::unique_ptr< ScopedCpuTensorHandle > m_CellLayerNormWeights
A unique pointer to represent 1D weights tensor with dimensions [num_units].
Definition: LstmLayer.hpp:21
virtual void VisitLstmLayer(const IConnectableLayer *layer, const LstmDescriptor &descriptor, const LstmInputParams &params, const char *name=nullptr)=0
Function an Lstm layer should call back to when its Accept(ILayerVisitor&) function is invoked...
std::unique_ptr< ScopedCpuTensorHandle > m_RecurrentToForgetWeights
A unique pointer to represent 2D weights tensor with dimensions [output_size, num_units].
Definition: LstmLayer.hpp:63
const ConstCpuTensorHandle * m_ProjectionBias
virtual std::unique_ptr< IWorkload > CreateLstm(const LstmQueueDescriptor &descriptor, const WorkloadInfo &info) const
const ConstTensor * m_CellToInputWeights
Definition: LstmParams.hpp:48
const ConstCpuTensorHandle * m_OutputGateBias
const ConstTensor * m_InputGateBias
Definition: LstmParams.hpp:51
const ConstCpuTensorHandle * m_CellToInputWeights
std::unique_ptr< ScopedCpuTensorHandle > m_OutputGateBias
A unique pointer to represent 1D weights tensor with dimensions [num_units].
Definition: LstmLayer.hpp:73
const ConstTensor * m_RecurrentToCellWeights
Definition: LstmParams.hpp:46
virtual std::unique_ptr< IWorkload > CreateWorkload(const IWorkloadFactory &factory) const override
Makes a workload for the LSTM type.
Definition: LstmLayer.cpp:22
const ConstCpuTensorHandle * m_CellLayerNormWeights
std::unique_ptr< ScopedCpuTensorHandle > m_InputLayerNormWeights
A unique pointer to represent 1D weights tensor with dimensions [num_units].
Definition: LstmLayer.hpp:17
const ConstTensor * m_ForgetLayerNormWeights
Definition: LstmParams.hpp:58
void VerifyShapeInferenceType(const TensorShape &outputShape, ShapeInferenceMethod shapeInferenceMethod)
Definition: Layer.cpp:432
const ConstTensor * m_CellToForgetWeights
Definition: LstmParams.hpp:49
Copyright (c) 2020 ARM Limited.
This layer represents a LSTM operation.
Definition: LstmLayer.hpp:77
const ConstCpuTensorHandle * m_CellToForgetWeights
const IOutputSlot * GetConnection() const override
Definition: Layer.hpp:199
const ConstCpuTensorHandle * m_CellBias
const ConstCpuTensorHandle * m_RecurrentToInputWeights
std::unique_ptr< ScopedCpuTensorHandle > m_CellBias
A unique pointer to represent 1D weights tensor with dimensions [num_units].
Definition: LstmLayer.hpp:71
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
void VerifyLayerConnections(unsigned int expectedConnections, const CheckLocation &location) const
Definition: Layer.cpp:344
std::unique_ptr< ScopedCpuTensorHandle > m_CellToForgetWeights
A unique pointer to represent 1D weights tensor with dimensions [num_units].
Definition: LstmLayer.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
std::unique_ptr< ScopedCpuTensorHandle > m_OutputLayerNormWeights
A unique pointer to represent 1D weights tensor with dimensions [num_units].
Definition: LstmLayer.hpp:23
const ConstCpuTensorHandle * m_InputLayerNormWeights
void ValidateTensorShapesFromInputs() override
Check if the input tensor shape(s) will lead to a valid configuration of LstmLayer.
Definition: LstmLayer.cpp:166
const ConstCpuTensorHandle * m_OutputLayerNormWeights
const ConstTensor * m_RecurrentToOutputWeights
Definition: LstmParams.hpp:47
LstmLayer * Clone(Graph &graph) const override
Creates a dynamically-allocated copy of this layer.
Definition: LstmLayer.cpp:78
An LstmDescriptor for the LstmLayer.
#define ARMNN_ASSERT_MSG(COND, MSG)
Definition: Assert.hpp:15
const ConstCpuTensorHandle * m_ForgetGateBias
const ConstTensor * m_ProjectionBias
Definition: LstmParams.hpp:56
std::unique_ptr< ScopedCpuTensorHandle > m_CellToInputWeights
A unique pointer to represent 1D weights tensor with dimensions [num_units].
Definition: LstmLayer.hpp:47
const ConstCpuTensorHandle * m_InputToInputWeights
A tensor defined by a TensorInfo (shape and data type) and an immutable backing store.
Definition: Tensor.hpp:298
bool m_PeepholeEnabled
Enable/disable peephole.
#define ARMNN_ASSERT(COND)
Definition: Assert.hpp:14
LstmOptLayerNormParameters m_LayerNormParameters
Definition: LstmLayer.hpp:85
#define CHECK_LOCATION()
Definition: Exceptions.hpp:197
std::unique_ptr< ScopedCpuTensorHandle > m_RecurrentToInputWeights
A unique pointer to represent 2D weights tensor with dimensions [input_size, num_units].
Definition: LstmLayer.hpp:31
Layer::ConstantTensors GetConstantTensorsByRef() override
Retrieve the handles to the constant values stored by the layer.
Definition: LstmLayer.cpp:268
std::unique_ptr< ScopedCpuTensorHandle > m_RecurrentToOutputWeights
A unique pointer to represent 2D weights tensor with dimensions [output_size, num_units].
Definition: LstmLayer.hpp:67
LstmOptPeepholeParameters m_PeepholeParameters
Definition: LstmLayer.hpp:84
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
LstmOptProjectionParameters m_ProjectionParameters
Definition: LstmLayer.hpp:83
std::unique_ptr< ScopedCpuTensorHandle > m_ProjectionBias
A unique pointer to represent 1D weights tensor with dimensions [output_size].
Definition: LstmLayer.hpp:41
bool m_CifgEnabled
Enable/disable cifg (coupled input & forget gate).
const ConstCpuTensorHandle * m_RecurrentToOutputWeights
void Accept(ILayerVisitor &visitor) const override
Apply a visitor to this layer.
Definition: LstmLayer.cpp:301
std::unique_ptr< ScopedCpuTensorHandle > m_InputToCellWeights
A unique pointer to represent 2D weights tensor with dimensions [input_size, num_units].
Definition: LstmLayer.hpp:59
const ConstTensor * m_RecurrentToForgetWeights
Definition: LstmParams.hpp:45
const ConstCpuTensorHandle * m_ForgetLayerNormWeights
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_CellToOutputWeights
A unique pointer to represent 1D weights tensor with dimensions [num_units].
Definition: LstmLayer.hpp:51
LstmLayer(const LstmDescriptor &param, const char *name)
Constructor to create a LstmLayer.
Definition: LstmLayer.cpp:17
bool m_LayerNormEnabled
Enable/disable layer normalization.
const OutputSlot & GetOutputSlot(unsigned int index=0) const override
Get the const output slot handle by slot index.
Definition: Layer.hpp:314
std::unique_ptr< ScopedCpuTensorHandle > m_ProjectionWeights
A unique pointer to represent 2D weights tensor with dimensions [output_size, num_units].
Definition: LstmLayer.hpp:39
virtual const TensorInfo & GetTensorInfo() const =0
const ConstCpuTensorHandle * m_RecurrentToCellWeights
std::unique_ptr< ScopedCpuTensorHandle > m_ForgetLayerNormWeights
A unique pointer to represent 1D weights tensor with dimensions [num_units].
Definition: LstmLayer.hpp:19
LstmOptCifgParameters m_CifgParameters
Definition: LstmLayer.hpp:82
const char * GetName() const override
Returns the name of the layer.
Definition: Layer.hpp:307
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: LstmLayer.cpp:148
const ConstTensor * m_OutputLayerNormWeights
Definition: LstmParams.hpp:60
std::vector< std::reference_wrapper< std::unique_ptr< ScopedCpuTensorHandle > >> ConstantTensors
Definition: Layer.hpp:378
const TensorInfo & GetTensorInfo(const ITensorHandle *tensorHandle)
float32 helpers
const TensorInfo & GetTensorInfo() const override
Definition: Layer.cpp:63
std::unique_ptr< ScopedCpuTensorHandle > m_InputToForgetWeights
A unique pointer to represent 2D weights tensor with dimensions [input_size, num_units].
Definition: LstmLayer.hpp:57
std::unique_ptr< ScopedCpuTensorHandle > m_InputGateBias
A unique pointer to represent 1D weights tensor with dimensions [num_units].
Definition: LstmLayer.hpp:33
ShapeInferenceMethod m_ShapeInferenceMethod
Definition: Layer.hpp:387
const ConstCpuTensorHandle * m_ProjectionWeights
const ConstTensor * m_InputToForgetWeights
Definition: LstmParams.hpp:41
const ConstTensor * m_InputToInputWeights
Definition: LstmParams.hpp:40
const ConstCpuTensorHandle * m_InputToForgetWeights