![]() |
OpenCV 4.11.0
开源计算机视觉库
|
LSTM 循环层。 更多…
#include <opencv2/dnn/all_layers.hpp>
公共成员函数 | |
| int | inputNameToIndex (String inputName) CV_OVERRIDE |
| 返回输入 blob 在输入数组中的索引。 | |
| int | outputNameToIndex (const String &outputName) CV_OVERRIDE |
| 返回输出 blob 在输出数组中的索引。 | |
| virtual void | setOutShape (const MatShape &outTailShape=MatShape())=0 |
指定输出 blob 的形状,其将为 [[T], N] + outTailShape。 | |
| virtual void | setProduceCellOutput (bool produce=false)=0 |
| 如果将此标志设置为 true,则层将生成 \( c_t \) 作为第二个输出。 | |
| virtual void | setUseTimstampsDim (bool use=true)=0 |
| 指定是将输入 blob 的第一维解释为时间戳维还是样本。 | |
| virtual void | setWeights (const Mat &Wh, const Mat &Wx, const Mat &b)=0 |
| 设置 LSTM 层的训练权重。 | |
从 cv::dnn::Layer 继承的公共成员函数 | |
| Layer () | |
| Layer (const LayerParams ¶ms) | |
| 仅初始化 name、type 和 blobs 字段。 | |
| virtual | ~Layer () |
| virtual void | applyHalideScheduler (Ptr< BackendNode > &node, const std::vector< Mat * > &inputs, const std::vector< Mat > &outputs, int targetId) const |
| 基于层超参数的自动 Halide 调度。 | |
| virtual void | finalize (const std::vector< Mat * > &input, std::vector< Mat > &output) |
| 根据输入、输出和 blobs 计算并设置内部参数。 | |
| std::vector< Mat > | finalize (const std::vector< Mat > &inputs) |
| 这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。 | |
| void | finalize (const std::vector< Mat > &inputs, std::vector< Mat > &outputs) |
| 这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。 | |
| virtual void | finalize (InputArrayOfArrays inputs, OutputArrayOfArrays outputs) |
| 根据输入、输出和 blobs 计算并设置内部参数。 | |
| virtual void | forward (InputArrayOfArrays inputs, OutputArrayOfArrays outputs, OutputArrayOfArrays internals) |
给定input blobs,计算输出blobs。 | |
| virtual void | forward (std::vector< Mat * > &input, std::vector< Mat > &output, std::vector< Mat > &internals) |
给定input blobs,计算输出blobs。 | |
| void | forward_fallback (InputArrayOfArrays inputs, OutputArrayOfArrays outputs, OutputArrayOfArrays internals) |
给定input blobs,计算输出blobs。 | |
| virtual int64 | getFLOPS (const std::vector< MatShape > &inputs, const std::vector< MatShape > &outputs) const |
| virtual bool | getMemoryShapes (const std::vector< MatShape > &inputs, const int requiredOutputs, std::vector< MatShape > &outputs, std::vector< MatShape > &internals) const |
| virtual void | getScaleShift (Mat &scale, Mat &shift) const |
| 返回具有通道乘法和加法的层的参数。 | |
| virtual void | getScaleZeropoint (float &scale, int &zeropoint) const |
| 返回层的比例和零点。 | |
| virtual Ptr< BackendNode > | initCann (const std::vector< Ptr< BackendWrapper > > &inputs, const std::vector< Ptr< BackendWrapper > > &outputs, const std::vector< Ptr< BackendNode > > &nodes) |
| 返回一个 CANN 后端节点。 | |
| virtual Ptr< BackendNode > | initCUDA (void *context, const std::vector< Ptr< BackendWrapper > > &inputs, const std::vector< Ptr< BackendWrapper > > &outputs) |
| 返回一个CUDA后端节点。 | |
| virtual Ptr< BackendNode > | initHalide (const std::vector< Ptr< BackendWrapper > > &inputs) |
| 返回Halide后端节点。 | |
| virtual Ptr< BackendNode > | initNgraph (const std::vector< Ptr< BackendWrapper > > &inputs, const std::vector< Ptr< BackendNode > > &nodes) |
| virtual Ptr< BackendNode > | initTimVX (void *timVxInfo, const std::vector< Ptr< BackendWrapper > > &inputsWrapper, const std::vector< Ptr< BackendWrapper > > &outputsWrapper, bool isLast) |
| 返回一个TimVX后端节点。 | |
| virtual Ptr< BackendNode > | initVkCom (const std::vector< Ptr< BackendWrapper > > &inputs, std::vector< Ptr< BackendWrapper > > &outputs) |
| virtual Ptr< BackendNode > | initWebnn (const std::vector< Ptr< BackendWrapper > > &inputs, const std::vector< Ptr< BackendNode > > &nodes) |
| void | run (const std::vector< Mat > &inputs, std::vector< Mat > &outputs, std::vector< Mat > &internals) |
| 分配层并计算输出。 | |
| virtual bool | setActivation (const Ptr< ActivationLayer > &layer) |
| 尝试将后续激活层附加到该层,即在部分情况下进行层融合。 | |
| void | setParamsFrom (const LayerParams ¶ms) |
| 仅初始化 name、type 和 blobs 字段。 | |
| virtual bool | supportBackend (int backendId) |
| 询问层是否支持特定的后端进行计算。 | |
| virtual Ptr< BackendNode > | tryAttach (const Ptr< BackendNode > &node) |
| 实现层融合。 | |
| virtual bool | tryFuse (Ptr< Layer > &top) |
| 尝试将当前层与下一层融合。 | |
| virtual bool | tryQuantize (const std::vector< std::vector< float > > &scales, const std::vector< std::vector< int > > &zeropoints, LayerParams ¶ms) |
| 尝试量化给定层并计算定点实现所需的量化参数。 | |
| virtual void | unsetAttached () |
| “分离”附加到特定层的所有层。 | |
| virtual bool | updateMemoryShapes (const std::vector< MatShape > &inputs) |
从cv::Algorithm继承的公共成员函数 | |
| Algorithm () | |
| virtual | ~Algorithm () |
| virtual void | clear () |
| 清除算法状态。 | |
| virtual bool | empty () const |
| 如果Algorithm为空(例如,在开始时或读取失败后),则返回true。 | |
| virtual String | getDefaultName () const |
| virtual void | read (const FileNode &fn) |
| 从文件存储中读取算法参数。 | |
| virtual void | save (const String &filename) const |
| void | write (const Ptr< FileStorage > &fs, const String &name=String()) const |
| virtual void | write (FileStorage &fs) const |
| 将算法参数存储到文件存储中。 | |
| void | write (FileStorage &fs, const String &name) const |
静态公共成员函数 | |
| static Ptr< LSTMLayer > | create (const LayerParams ¶ms) |
从cv::Algorithm继承的静态公共成员函数 | |
| template<typename _Tp > | |
| static Ptr< _Tp > | load (const String &filename, const String &objname=String()) |
| 从文件中加载算法。 | |
| template<typename _Tp > | |
| static Ptr< _Tp > | loadFromString (const String &strModel, const String &objname=String()) |
| 从字符串加载算法。 | |
| template<typename _Tp > | |
| static Ptr< _Tp > | read (const FileNode &fn) |
| 从文件节点读取算法。 | |
其他继承的成员 | |
从cv::dnn::Layer继承的公共属性 | |
| std::vector< Mat > | blobs |
| 学习到的参数列表必须存储在此处,以便可以使用Net::getParam()读取它们。 | |
| String | name |
| 层实例的名称,可用于日志记录或其他内部用途。 | |
| int | preferableTarget |
| 层前向传播的首选目标 | |
| String | type |
| 通过层工厂创建层时使用的类型名称。 | |
继承自cv::Algorithm的受保护成员函数 | |
| void | writeFormat (FileStorage &fs) const |
LSTM循环层。
|
static |
创建LSTM层的实例
|
virtual |
返回输入 blob 在输入数组中的索引。
| inputName | 输入blob的标签 |
每个层的输入和输出都可以被标记,以便使用“%
重载自cv::dnn::Layer。
|
virtual |
指定输出 blob 的形状,其将为 [[T], N] + outTailShape。
如果此参数为空或未设置,则将使用outTailShape = [Wh.size(0)],其中Wh是来自setWeights()的参数。
|
纯虚函数 |
|
纯虚函数 |
指定是将输入 blob 的第一维解释为时间戳维还是样本。
produce_cell_output。如果标志设置为true,则输入blob的形状将被解释为[T, N, [data dims]],其中T指定时间戳的数量,N是独立流的数量。在这种情况下,每个forward()调用将遍历T个时间戳并更新层的T次状态。
如果标志设置为false,则输入blob的形状将被解释为[N, [data dims]]。在这种情况下,每个forward()调用将进行一次迭代并生成一个形状为[N, [out dims]]的时间戳。
设置 LSTM 层的训练权重。
LSTM 在每个步骤上的行为由当前输入、先前输出、先前单元状态和学习到的权重定义。
令\(x_t\)为当前输入,\(h_t\)为当前输出,\(c_t\)为当前状态。则当前输出和当前单元状态计算如下
\begin{eqnarray*} h_t &= o_t \odot tanh(c_t), \\ c_t &= f_t \odot c_{t-1} + i_t \odot g_t, \\ \end{eqnarray*}
其中\(\odot\)是逐元素乘法运算,\(i_t, f_t, o_t, g_t\)是使用学习到的权重计算的内部门。
门的计算方式如下
\begin{eqnarray*} i_t &= sigmoid&(W_{xi} x_t + W_{hi} h_{t-1} + b_i), \\ f_t &= sigmoid&(W_{xf} x_t + W_{hf} h_{t-1} + b_f), \\ o_t &= sigmoid&(W_{xo} x_t + W_{ho} h_{t-1} + b_o), \\ g_t &= tanh &(W_{xg} x_t + W_{hg} h_{t-1} + b_g), \\ \end{eqnarray*}
其中\(W_{x?}\),\(W_{h?}\)和\(b_{?}\)是表示为矩阵的学习权重:\(W_{x?} \in R^{N_h \times N_x}\),\(W_{h?} \in R^{N_h \times N_h}\),\(b_? \in R^{N_h}\)。
为简单起见和提高性能,我们使用\( W_x = [W_{xi}; W_{xf}; W_{xo}, W_{xg}] \)(即\(W_x\)是\( W_{x?} \)的垂直连接),\( W_x \in R^{4N_h \times N_x} \)。\( W_h = [W_{hi}; W_{hf}; W_{ho}, W_{hg}], W_h \in R^{4N_h \times N_h} \)和\( b = [b_i; b_f, b_o, b_g]\), \(b \in R^{4N_h} \)也是如此。
| Wh | 是定义如何将先前输出转换为内部门的矩阵(即,根据上述符号为\( W_h \)) |
| Wx | 是定义如何将当前输入转换为内部门的矩阵(即,根据上述符号为\( W_x \)) |
| b | 是偏差向量(即,根据上述符号为\( b \)) |