ArmNN  NotReleased
LstmQueueDescriptor Struct Reference

#include <WorkloadData.hpp>

Inheritance diagram for LstmQueueDescriptor:
QueueDescriptorWithParameters< LstmDescriptor > QueueDescriptor

Public Member Functions

 LstmQueueDescriptor ()
 
void Validate (const WorkloadInfo &workloadInfo) const
 
- Public Member Functions inherited from QueueDescriptor
void ValidateInputsOutputs (const std::string &descName, unsigned int numExpectedIn, unsigned int numExpectedOut) const
 

Public Attributes

const ConstCpuTensorHandlem_InputToInputWeights
 
const ConstCpuTensorHandlem_InputToForgetWeights
 
const ConstCpuTensorHandlem_InputToCellWeights
 
const ConstCpuTensorHandlem_InputToOutputWeights
 
const ConstCpuTensorHandlem_RecurrentToInputWeights
 
const ConstCpuTensorHandlem_RecurrentToForgetWeights
 
const ConstCpuTensorHandlem_RecurrentToCellWeights
 
const ConstCpuTensorHandlem_RecurrentToOutputWeights
 
const ConstCpuTensorHandlem_CellToInputWeights
 
const ConstCpuTensorHandlem_CellToForgetWeights
 
const ConstCpuTensorHandlem_CellToOutputWeights
 
const ConstCpuTensorHandlem_InputGateBias
 
const ConstCpuTensorHandlem_ForgetGateBias
 
const ConstCpuTensorHandlem_CellBias
 
const ConstCpuTensorHandlem_OutputGateBias
 
const ConstCpuTensorHandlem_ProjectionWeights
 
const ConstCpuTensorHandlem_ProjectionBias
 
const ConstCpuTensorHandlem_InputLayerNormWeights
 
const ConstCpuTensorHandlem_ForgetLayerNormWeights
 
const ConstCpuTensorHandlem_CellLayerNormWeights
 
const ConstCpuTensorHandlem_OutputLayerNormWeights
 
- Public Attributes inherited from QueueDescriptorWithParameters< LstmDescriptor >
LstmDescriptor m_Parameters
 
- Public Attributes inherited from QueueDescriptor
std::vector< ITensorHandle * > m_Inputs
 
std::vector< ITensorHandle * > m_Outputs
 

Additional Inherited Members

- Protected Member Functions inherited from QueueDescriptorWithParameters< LstmDescriptor >
 ~QueueDescriptorWithParameters ()=default
 
 QueueDescriptorWithParameters ()=default
 
 QueueDescriptorWithParameters (QueueDescriptorWithParameters const &)=default
 
QueueDescriptorWithParametersoperator= (QueueDescriptorWithParameters const &)=default
 
- Protected Member Functions inherited from QueueDescriptor
 ~QueueDescriptor ()=default
 
 QueueDescriptor ()=default
 
 QueueDescriptor (QueueDescriptor const &)=default
 
QueueDescriptoroperator= (QueueDescriptor const &)=default
 

Detailed Description

Definition at line 358 of file WorkloadData.hpp.

Constructor & Destructor Documentation

◆ LstmQueueDescriptor()

LstmQueueDescriptor ( )
inline

Definition at line 360 of file WorkloadData.hpp.

361  : m_InputToInputWeights(nullptr)
362  , m_InputToForgetWeights(nullptr)
363  , m_InputToCellWeights(nullptr)
364  , m_InputToOutputWeights(nullptr)
365  , m_RecurrentToInputWeights(nullptr)
366  , m_RecurrentToForgetWeights(nullptr)
367  , m_RecurrentToCellWeights(nullptr)
368  , m_RecurrentToOutputWeights(nullptr)
369  , m_CellToInputWeights(nullptr)
370  , m_CellToForgetWeights(nullptr)
371  , m_CellToOutputWeights(nullptr)
372  , m_InputGateBias(nullptr)
373  , m_ForgetGateBias(nullptr)
374  , m_CellBias(nullptr)
375  , m_OutputGateBias(nullptr)
376  , m_ProjectionWeights(nullptr)
377  , m_ProjectionBias(nullptr)
378  , m_InputLayerNormWeights(nullptr)
379  , m_ForgetLayerNormWeights(nullptr)
380  , m_CellLayerNormWeights(nullptr)
381  , m_OutputLayerNormWeights(nullptr)
382  {
383  }
const ConstCpuTensorHandle * m_ProjectionBias
const ConstCpuTensorHandle * m_RecurrentToCellWeights
const ConstCpuTensorHandle * m_InputToCellWeights
const ConstCpuTensorHandle * m_ProjectionWeights
const ConstCpuTensorHandle * m_ForgetGateBias
const ConstCpuTensorHandle * m_ForgetLayerNormWeights
const ConstCpuTensorHandle * m_InputToForgetWeights
const ConstCpuTensorHandle * m_CellToOutputWeights
const ConstCpuTensorHandle * m_InputToOutputWeights
const ConstCpuTensorHandle * m_InputGateBias
const ConstCpuTensorHandle * m_RecurrentToForgetWeights
const ConstCpuTensorHandle * m_InputLayerNormWeights
const ConstCpuTensorHandle * m_CellBias
const ConstCpuTensorHandle * m_InputToInputWeights
const ConstCpuTensorHandle * m_CellToForgetWeights
const ConstCpuTensorHandle * m_OutputLayerNormWeights
const ConstCpuTensorHandle * m_CellToInputWeights
const ConstCpuTensorHandle * m_CellLayerNormWeights
const ConstCpuTensorHandle * m_OutputGateBias
const ConstCpuTensorHandle * m_RecurrentToOutputWeights
const ConstCpuTensorHandle * m_RecurrentToInputWeights

Member Function Documentation

◆ Validate()

void Validate ( const WorkloadInfo workloadInfo) const

Definition at line 1721 of file WorkloadData.cpp.

References armnn::Float16, armnn::Float32, WorkloadInfo::m_InputTensorInfos, WorkloadInfo::m_OutputTensorInfos, and armnn::QSymmS16.

1722 {
1723  // ported from android/ml/nn/common/operations/LSTM.cpp CheckInputTensorDimensions()
1724 
1725  const std::string descriptorName{"LstmQueueDescriptor"};
1726 
1727  // check dimensions of all inputs and outputs
1728  if (workloadInfo.m_InputTensorInfos.size() != 3)
1729  {
1730  throw InvalidArgumentException(descriptorName + ": Invalid number of inputs.");
1731  }
1732  if (workloadInfo.m_OutputTensorInfos.size() != 4)
1733  {
1734  throw InvalidArgumentException(descriptorName + ": Invalid number of outputs.");
1735  }
1736 
1737  std::vector<DataType> supportedTypes =
1738  {
1742  };
1743 
1744  // check for supported type of one input and match them with all the other input and output
1745  ValidateDataTypes(workloadInfo.m_InputTensorInfos[0], supportedTypes, descriptorName);
1746 
1747  // type matches all other inputs
1748  for (uint32_t i = 1u; i < workloadInfo.m_InputTensorInfos.size(); ++i)
1749  {
1750  ValidateTensorDataTypesMatch(workloadInfo.m_InputTensorInfos[0],
1751  workloadInfo.m_InputTensorInfos[i],
1752  descriptorName,
1753  "input_0",
1754  "input_" + std::to_string(i));
1755  }
1756  // type matches all other outputs
1757  for (uint32_t i = 0u; i < workloadInfo.m_OutputTensorInfos.size(); ++i)
1758  {
1759  ValidateTensorDataTypesMatch(workloadInfo.m_InputTensorInfos[0],
1760  workloadInfo.m_OutputTensorInfos[i],
1761  "LstmQueueDescriptor",
1762  "input_0",
1763  "output_" + std::to_string(i));
1764  }
1765 
1766  // Making sure clipping parameters have valid values.
1767  // == 0 means no clipping
1768  // > 0 means clipping
1769  if (m_Parameters.m_ClippingThresCell < 0.0f)
1770  {
1771  throw InvalidArgumentException(descriptorName + ": negative cell clipping threshold is invalid");
1772  }
1773  if (m_Parameters.m_ClippingThresProj < 0.0f)
1774  {
1775  throw InvalidArgumentException(descriptorName + ": negative projection clipping threshold is invalid");
1776  }
1777 
1778 
1779  // Inferring batch size, number of outputs and number of cells from the inputs.
1780  const uint32_t n_input = workloadInfo.m_InputTensorInfos[0].GetShape()[1];
1781  const uint32_t n_batch = workloadInfo.m_InputTensorInfos[0].GetShape()[0];
1782  ValidatePointer(m_InputToOutputWeights, "Null pointer check", "InputToOutputWeights");
1783  const uint32_t n_cell = m_InputToOutputWeights->GetShape()[0];
1784  ValidatePointer(m_RecurrentToOutputWeights, "Null pointer check", "RecurrentToOutputWeights");
1785  const uint32_t n_output = m_RecurrentToOutputWeights->GetShape()[1];
1786 
1787  // input tensor
1788  ValidateTensorNumDimNumElem(workloadInfo.m_InputTensorInfos[0], 2, (n_batch * n_input),
1789  descriptorName + " input_0");
1790  // outputStateInTensor
1791  ValidateTensorNumDimNumElem(workloadInfo.m_InputTensorInfos[1], 2, (n_batch * n_output),
1792  descriptorName + " input_1");
1793  // outputStateInTensor
1794  ValidateTensorNumDimNumElem(workloadInfo.m_InputTensorInfos[2], 2, (n_batch * n_cell),
1795  descriptorName + " input_2");
1796  // scratchBufferTensor
1797  unsigned int scratchBufferSize = m_Parameters.m_CifgEnabled ? n_cell * 3 : n_cell * 4;
1798  ValidateTensorNumDimNumElem(workloadInfo.m_OutputTensorInfos[0], 2, (n_batch * scratchBufferSize),
1799  descriptorName + " output_0");
1800  // outputStateOutTensor
1801  ValidateTensorNumDimNumElem(workloadInfo.m_OutputTensorInfos[1], 2, (n_batch * n_output),
1802  descriptorName + " output_1");
1803  // cellStateOutTensor
1804  ValidateTensorNumDimNumElem(workloadInfo.m_OutputTensorInfos[2], 2, (n_batch * n_cell),
1805  descriptorName + " output_2");
1806  // outputTensor
1807  ValidateTensorNumDimNumElem(workloadInfo.m_OutputTensorInfos[3], 2, (n_batch * n_output),
1808  descriptorName + " output_3");
1809 
1810 
1811  // check that dimensions of inputs/outputs and QueueDescriptor data match with each other
1812  if ( m_InputToInputWeights )
1813  {
1814  ValidateTensorNumDimNumElem(m_InputToInputWeights->GetTensorInfo(), 2,
1815  (n_cell * n_input), "InputLayerNormWeights");
1816  }
1817 
1818  ValidatePointer(m_InputToForgetWeights, "Null pointer check", "InputToForgetWeights");
1819  ValidateTensorNumDimNumElem(m_InputToForgetWeights->GetTensorInfo(), 2,
1820  (n_cell * n_input), "InputToForgetWeights");
1821 
1822  ValidatePointer(m_InputToCellWeights, "Null pointer check", "InputToCellWeights");
1823  ValidateTensorNumDimNumElem(m_InputToCellWeights->GetTensorInfo(), 2,
1824  (n_cell * n_input), "InputToCellWeights");
1825 
1827  {
1828  ValidateTensorNumDimNumElem(m_RecurrentToInputWeights->GetTensorInfo(), 2,
1829  (n_cell * n_output), "RecurrentToInputWeights");
1830  }
1831 
1832  ValidatePointer(m_RecurrentToForgetWeights, "Null pointer check", "RecurrentToForgetWeights");
1833  ValidateTensorNumDimNumElem(m_RecurrentToForgetWeights->GetTensorInfo(), 2,
1834  (n_cell * n_output), "RecurrentToForgetWeights");
1835 
1836  ValidatePointer(m_RecurrentToCellWeights, "Null pointer check", "RecurrentToCellWeights");
1837  ValidateTensorNumDimNumElem(m_RecurrentToCellWeights->GetTensorInfo(), 2,
1838  (n_cell * n_output), "RecurrentToCellWeights");
1839 
1840  // Make sure the input-gate's parameters are either both present (regular
1841  // LSTM) or not at all (CIFG-LSTM). And CifgEnable is set accordingly.
1842  bool cifg_weights_all_or_none = ((m_InputToInputWeights && m_RecurrentToInputWeights &&
1846  if (!cifg_weights_all_or_none)
1847  {
1848  throw InvalidArgumentException(descriptorName + ": Input-Gate's parameters InputToInputWeights and "
1849  "RecurrentToInputWeights must either both be present (regular LSTM) "
1850  "or both not present (CIFG-LSTM). In addition CifgEnable must be set "
1851  "accordingly.");
1852  }
1853 
1854  if ( m_CellToInputWeights )
1855  {
1856  ValidateTensorNumDimNumElem(m_CellToInputWeights->GetTensorInfo(), 1,
1857  n_cell, "CellToInputWeights");
1858  }
1859  if ( m_CellToForgetWeights )
1860  {
1861  ValidateTensorNumDimNumElem(m_CellToForgetWeights->GetTensorInfo(), 1,
1862  n_cell, "CellToForgetWeights");
1863  }
1864  if ( m_CellToOutputWeights )
1865  {
1866  ValidateTensorNumDimNumElem(m_CellToOutputWeights->GetTensorInfo(), 1,
1867  n_cell, "CellToOutputWeights");
1868  }
1869 
1870  // Making sure the peephole weights are there all or none. And PeepholeEnable is set accordingly.
1871  bool peephole_weights_all_or_none =
1876  if (!peephole_weights_all_or_none)
1877  {
1878  throw InvalidArgumentException(descriptorName + ": Invalid combination of peephole parameters.");
1879  }
1880 
1881  // Make sure the input gate bias is present only when not a CIFG-LSTM.
1883  {
1884  if (m_InputGateBias)
1885  {
1886  throw InvalidArgumentException(descriptorName + ": InputGateBias is present and CIFG-LSTM is enabled.");
1887  }
1888  }
1889  else
1890  {
1891  if (!m_InputGateBias)
1892  {
1893  throw InvalidArgumentException(descriptorName + ": If CIFG-LSTM is disabled InputGateBias "
1894  "must be present.");
1895  }
1896  ValidateTensorNumDimNumElem(m_InputGateBias->GetTensorInfo(), 1,
1897  n_cell, "InputGateBias");
1898  }
1899 
1900  ValidatePointer(m_ForgetGateBias, "Null pointer check", "ForgetGateBias");
1901  ValidateTensorNumDimNumElem(m_ForgetGateBias->GetTensorInfo(), 1, n_cell, "ForgetGateBias");
1902 
1903  ValidatePointer(m_CellBias, "Null pointer check", "CellBias");
1904  ValidateTensorNumDimNumElem(m_CellBias->GetTensorInfo(), 1, n_cell, "CellBias");
1905 
1906  ValidatePointer(m_OutputGateBias, "Null pointer check", "OutputGateBias");
1907  ValidateTensorNumDimNumElem(m_OutputGateBias->GetTensorInfo(), 1, n_cell, "OutputGateBias");
1908 
1909  if (m_ProjectionWeights)
1910  {
1911  ValidateTensorNumDimNumElem(m_ProjectionWeights->GetTensorInfo(), 2,
1912  (n_cell * n_output), "ProjectionWeights");
1913  }
1914  if (m_ProjectionBias)
1915  {
1916  ValidateTensorNumDimNumElem(m_ProjectionBias->GetTensorInfo(), 1, n_output, "ProjectionBias");
1917  }
1918 
1919  // Making sure the projection tensors are consistent:
1920  // 1) If projection weight is not present, then projection bias should not be
1921  // present.
1922  // 2) If projection weight is present, then projection bias is optional.
1923  bool projecton_tensors_consistent = ((!m_ProjectionWeights && !m_ProjectionBias &&
1929  if (!projecton_tensors_consistent)
1930  {
1931  throw InvalidArgumentException(descriptorName + ": Projection tensors are inconsistent.");
1932  }
1933 
1934  // The four layer normalization weights either all have values or none of them have values. Additionally, if
1935  // CIFG is used, input layer normalization weights tensor is omitted and the other layer normalization weights
1936  // either all have values or none of them have values. Layer normalization is used when the values of all the
1937  // layer normalization weights are present
1939  {
1940  ValidateTensorNumDimNumElem(m_InputLayerNormWeights->GetTensorInfo(), 1, n_cell, "InputLayerNormWeights");
1941  }
1943  {
1944  ValidateTensorNumDimNumElem(m_ForgetLayerNormWeights->GetTensorInfo(), 1, n_cell, "ForgetLayerNormWeights");
1945  }
1947  {
1948  ValidateTensorNumDimNumElem(m_CellLayerNormWeights->GetTensorInfo(), 1, n_cell, "CellLayerNormWeights");
1949  }
1951  {
1952  ValidateTensorNumDimNumElem(m_OutputLayerNormWeights->GetTensorInfo(), 1, n_cell, "OutputLayerNormWeights");
1953  }
1954 
1956  {
1958  {
1960  {
1961  throw InvalidArgumentException(descriptorName + ": Layer normalisation is enabled and CIFG-LSTM is "
1962  "disabled but InputLayerNormWeights are not present");
1963  }
1964  ValidateTensorNumDimNumElem(m_InputLayerNormWeights->GetTensorInfo(),
1965  1, n_cell, "InputLayerNormWeights");
1966  }
1967  else if (m_InputLayerNormWeights)
1968  {
1969  throw InvalidArgumentException(descriptorName + ":InputLayerNormWeights are present while CIFG is "
1970  "enabled");
1971  }
1972 
1973  ValidatePointer(m_ForgetLayerNormWeights, "Null pointer check layer normalisation enabled",
1974  "ForgetLayerNormWeights");
1975  ValidateTensorNumDimNumElem(m_ForgetLayerNormWeights->GetTensorInfo(), 1, n_cell, "ForgetLayerNormWeights");
1976 
1977  ValidatePointer(m_OutputLayerNormWeights, "Null pointer check layer normalisation enabled",
1978  "OutputLayerNormWeights");
1979  ValidateTensorNumDimNumElem(m_OutputLayerNormWeights->GetTensorInfo(), 1, n_cell, "OutputLayerNormWeights");
1980 
1981  ValidatePointer(m_CellLayerNormWeights, "Null pointer check layer normalisation enabled",
1982  "CellLayerNormWeights");
1983  ValidateTensorNumDimNumElem(m_CellLayerNormWeights->GetTensorInfo(), 1, n_cell, "CellLayerNormWeights");
1984  }
1986  {
1987  throw InvalidArgumentException(descriptorName + ": Layer normalisation is disabled but one or more layer "
1988  "normalisation weights are present.");
1989  }
1990 }
bool m_ProjectionEnabled
Enable/disable the projection layer.
const ConstCpuTensorHandle * m_ProjectionBias
const ConstCpuTensorHandle * m_RecurrentToCellWeights
const ConstCpuTensorHandle * m_InputToCellWeights
const TensorInfo & GetTensorInfo() const
float m_ClippingThresCell
Clipping threshold value for the cell state.
std::vector< TensorInfo > m_OutputTensorInfos
bool m_CifgEnabled
Enable/disable cifg (coupled input & forget gate).
const ConstCpuTensorHandle * m_ProjectionWeights
TensorShape GetShape() const override
const ConstCpuTensorHandle * m_ForgetGateBias
const ConstCpuTensorHandle * m_ForgetLayerNormWeights
const ConstCpuTensorHandle * m_InputToForgetWeights
const ConstCpuTensorHandle * m_CellToOutputWeights
bool m_PeepholeEnabled
Enable/disable peephole.
const ConstCpuTensorHandle * m_InputToOutputWeights
const ConstCpuTensorHandle * m_InputGateBias
const ConstCpuTensorHandle * m_RecurrentToForgetWeights
std::vector< TensorInfo > m_InputTensorInfos
const ConstCpuTensorHandle * m_InputLayerNormWeights
const ConstCpuTensorHandle * m_CellBias
const ConstCpuTensorHandle * m_InputToInputWeights
const ConstCpuTensorHandle * m_CellToForgetWeights
const ConstCpuTensorHandle * m_OutputLayerNormWeights
const ConstCpuTensorHandle * m_CellToInputWeights
const ConstCpuTensorHandle * m_CellLayerNormWeights
const ConstCpuTensorHandle * m_OutputGateBias
bool m_LayerNormEnabled
Enable/disable layer normalization.
const ConstCpuTensorHandle * m_RecurrentToOutputWeights
float m_ClippingThresProj
Clipping threshold value for the projection.
const ConstCpuTensorHandle * m_RecurrentToInputWeights

Member Data Documentation

◆ m_CellBias

const ConstCpuTensorHandle* m_CellBias

Definition at line 398 of file WorkloadData.hpp.

Referenced by LstmLayer::CreateWorkload().

◆ m_CellLayerNormWeights

const ConstCpuTensorHandle* m_CellLayerNormWeights

Definition at line 404 of file WorkloadData.hpp.

Referenced by LstmLayer::CreateWorkload().

◆ m_CellToForgetWeights

const ConstCpuTensorHandle* m_CellToForgetWeights

Definition at line 394 of file WorkloadData.hpp.

Referenced by LstmLayer::CreateWorkload().

◆ m_CellToInputWeights

const ConstCpuTensorHandle* m_CellToInputWeights

Definition at line 393 of file WorkloadData.hpp.

Referenced by LstmLayer::CreateWorkload().

◆ m_CellToOutputWeights

const ConstCpuTensorHandle* m_CellToOutputWeights

Definition at line 395 of file WorkloadData.hpp.

Referenced by LstmLayer::CreateWorkload().

◆ m_ForgetGateBias

const ConstCpuTensorHandle* m_ForgetGateBias

Definition at line 397 of file WorkloadData.hpp.

Referenced by LstmLayer::CreateWorkload().

◆ m_ForgetLayerNormWeights

const ConstCpuTensorHandle* m_ForgetLayerNormWeights

Definition at line 403 of file WorkloadData.hpp.

Referenced by LstmLayer::CreateWorkload().

◆ m_InputGateBias

const ConstCpuTensorHandle* m_InputGateBias

Definition at line 396 of file WorkloadData.hpp.

Referenced by LstmLayer::CreateWorkload().

◆ m_InputLayerNormWeights

const ConstCpuTensorHandle* m_InputLayerNormWeights

Definition at line 402 of file WorkloadData.hpp.

Referenced by LstmLayer::CreateWorkload().

◆ m_InputToCellWeights

const ConstCpuTensorHandle* m_InputToCellWeights

Definition at line 387 of file WorkloadData.hpp.

Referenced by LstmLayer::CreateWorkload().

◆ m_InputToForgetWeights

const ConstCpuTensorHandle* m_InputToForgetWeights

Definition at line 386 of file WorkloadData.hpp.

Referenced by LstmLayer::CreateWorkload().

◆ m_InputToInputWeights

const ConstCpuTensorHandle* m_InputToInputWeights

Definition at line 385 of file WorkloadData.hpp.

Referenced by LstmLayer::CreateWorkload().

◆ m_InputToOutputWeights

const ConstCpuTensorHandle* m_InputToOutputWeights

Definition at line 388 of file WorkloadData.hpp.

Referenced by LstmLayer::CreateWorkload().

◆ m_OutputGateBias

const ConstCpuTensorHandle* m_OutputGateBias

Definition at line 399 of file WorkloadData.hpp.

Referenced by LstmLayer::CreateWorkload().

◆ m_OutputLayerNormWeights

const ConstCpuTensorHandle* m_OutputLayerNormWeights

Definition at line 405 of file WorkloadData.hpp.

Referenced by LstmLayer::CreateWorkload().

◆ m_ProjectionBias

const ConstCpuTensorHandle* m_ProjectionBias

Definition at line 401 of file WorkloadData.hpp.

Referenced by LstmLayer::CreateWorkload().

◆ m_ProjectionWeights

const ConstCpuTensorHandle* m_ProjectionWeights

Definition at line 400 of file WorkloadData.hpp.

Referenced by LstmLayer::CreateWorkload().

◆ m_RecurrentToCellWeights

const ConstCpuTensorHandle* m_RecurrentToCellWeights

Definition at line 391 of file WorkloadData.hpp.

Referenced by LstmLayer::CreateWorkload().

◆ m_RecurrentToForgetWeights

const ConstCpuTensorHandle* m_RecurrentToForgetWeights

Definition at line 390 of file WorkloadData.hpp.

Referenced by LstmLayer::CreateWorkload().

◆ m_RecurrentToInputWeights

const ConstCpuTensorHandle* m_RecurrentToInputWeights

Definition at line 389 of file WorkloadData.hpp.

Referenced by LstmLayer::CreateWorkload().

◆ m_RecurrentToOutputWeights

const ConstCpuTensorHandle* m_RecurrentToOutputWeights

Definition at line 392 of file WorkloadData.hpp.

Referenced by LstmLayer::CreateWorkload().


The documentation for this struct was generated from the following files: