OpenCV 4.12.0
開源計算機視覺
載入中...
搜尋中...
無匹配項
cv::dnn::LSTMLayer 類參考abstract

LSTM 迴圈層。更多...

#include <opencv2/dnn/all_layers.hpp>

cv::dnn::LSTMLayer 協作圖

公共成員函式

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 &params)
 僅初始化 nametypeblobs 欄位。
 
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)
 根據輸入、輸出和 blob 計算並設定內部引數。
 
std::vector< Matfinalize (const std::vector< Mat > &inputs)
 這是一個過載成員函式,為方便起見而提供。它與上述函式的區別僅在於它接受的引數。
 
void finalize (const std::vector< Mat > &inputs, std::vector< Mat > &outputs)
 這是一個過載成員函式,為方便起見而提供。它與上述函式的區別僅在於它接受的引數。
 
virtual void finalize (InputArrayOfArrays inputs, OutputArrayOfArrays outputs)
 根據輸入、輸出和 blob 計算並設定內部引數。
 
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< BackendNodeinitCann (const std::vector< Ptr< BackendWrapper > > &inputs, const std::vector< Ptr< BackendWrapper > > &outputs, const std::vector< Ptr< BackendNode > > &nodes)
 返回一個 CANN 後端節點。
 
virtual Ptr< BackendNodeinitCUDA (void *context, const std::vector< Ptr< BackendWrapper > > &inputs, const std::vector< Ptr< BackendWrapper > > &outputs)
 返回一個 CUDA 後端節點。
 
virtual Ptr< BackendNodeinitHalide (const std::vector< Ptr< BackendWrapper > > &inputs)
 返回 Halide 後端節點。
 
virtual Ptr< BackendNodeinitNgraph (const std::vector< Ptr< BackendWrapper > > &inputs, const std::vector< Ptr< BackendNode > > &nodes)
 
virtual Ptr< BackendNodeinitTimVX (void *timVxInfo, const std::vector< Ptr< BackendWrapper > > &inputsWrapper, const std::vector< Ptr< BackendWrapper > > &outputsWrapper, bool isLast)
 返回一個 TimVX 後端節點。
 
virtual Ptr< BackendNodeinitVkCom (const std::vector< Ptr< BackendWrapper > > &inputs, std::vector< Ptr< BackendWrapper > > &outputs)
 
virtual Ptr< BackendNodeinitWebnn (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 &params)
 僅初始化 nametypeblobs 欄位。
 
virtual bool supportBackend (int backendId)
 詢問層是否支援特定的後端進行計算。
 
virtual Ptr< BackendNodetryAttach (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 &params)
 嘗試量化給定層並計算定點實現所需的量化引數。
 
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< LSTMLayercreate (const LayerParams &params)
 
- 繼承自 cv::Algorithm 的靜態公共成員函式
template<typename _Tp >
static Ptr< _Tpload (const String &filename, const String &objname=String())
 從檔案中載入演算法。
 
template<typename _Tp >
static Ptr< _TploadFromString (const String &strModel, const String &objname=String())
 從字串載入演算法。
 
template<typename _Tp >
static Ptr< _Tpread (const FileNode &fn)
 從檔案節點讀取演算法。
 

額外繼承的成員

- 繼承自 cv::dnn::Layer 的公共屬性
std::vector< Matblobs
 學習到的引數列表必須儲存在此處,以便使用 Net::getParam() 讀取。
 
String name
 層例項的名稱,可用於日誌記錄或其他內部目的。
 
int preferableTarget
 層轉發的首選目標
 
String type
 透過層工廠建立層時使用的型別名稱。
 
- 繼承自 cv::Algorithm 的保護成員函式
void writeFormat (FileStorage &fs) const
 

詳細描述

LSTM 迴圈層。

成員函式文件

◆ create()

static Ptr< LSTMLayer > cv::dnn::LSTMLayer::create ( const LayerParams & params)
static

建立 LSTM 層例項

◆ inputNameToIndex()

int cv::dnn::LSTMLayer::inputNameToIndex ( String inputName)
virtual

返回輸入 blob 在輸入陣列中的索引。

引數
inputName輸入 blob 的標籤

每個層的輸入和輸出都可以標記,以便使用“%<layer_name%>[.output_name]”符號輕鬆識別它們。此方法將輸入 blob 的標籤對映到其在輸入向量中的索引。

重新實現自 cv::dnn::Layer

◆ outputNameToIndex()

int cv::dnn::LSTMLayer::outputNameToIndex ( const String & outputName)
virtual

返回輸出 blob 在輸出陣列中的索引。

另請參見
inputNameToIndex()

重新實現自 cv::dnn::Layer

◆ setOutShape()

virtual void cv::dnn::LSTMLayer::setOutShape ( const MatShape & outTailShape = MatShape())
純虛擬函式

指定輸出 blob 的形狀,其將為 [[T], N] + outTailShape

如果此引數為空或未設定,則將使用 outTailShape = [Wh.size(0)],其中 Wh 是來自 setWeights() 的引數。

◆ setProduceCellOutput()

virtual void cv::dnn::LSTMLayer::setProduceCellOutput ( bool produce = false)
純虛擬函式

如果此標誌設定為 true,則層將生成 \( c_t \) 作為第二個輸出。

已棄用
LayerParams 中使用標誌 use_timestamp_dim

第二個輸出的形狀與第一個輸出相同。

◆ setUseTimstampsDim()

virtual void cv::dnn::LSTMLayer::setUseTimstampsDim ( bool use = true)
純虛擬函式

指定是將輸入 blob 的第一維度解釋為時間戳維度還是樣本維度。

已棄用
LayerParams 中使用標誌 produce_cell_output

如果標誌設定為 true,則輸入 blob 的形狀將被解釋為 [T, N, [data dims]],其中 T 指定時間戳的數量,N 是獨立流的數量。在這種情況下,每次 forward() 呼叫將遍歷 T 個時間戳並更新層的狀態 T 次。

如果標誌設定為 false,則輸入 blob 的形狀將被解釋為 [N, [data dims]]。在這種情況下,每次 forward() 呼叫將進行一次迭代並生成一個形狀為 [N, [out dims]] 的時間戳。

◆ setWeights()

virtual void cv::dnn::LSTMLayer::setWeights ( const Mat & Wh,
const Mat & Wx,
const Mat & b )
純虛擬函式

為 LSTM 層設定已訓練的權重。

已棄用
請改用 LayerParams::blobs

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 \))

此類的文件由以下檔案生成: