循环IRNNv2Layer实现
循環IRNNv2Layer實現
IRNNv2Layer實現循環層,例如循環神經網絡(RNN),門控循環單元(GRU)和長期短期記憶(LSTM)。支持的類型為RNN,GRU和LSTM。它執行循環操作,該操作由幾個眾所周知的循環神經網絡(RNN)“單元”之一定義。
層描述
該層接受輸入序列 X,初始隱藏狀態 H0, 如果該單元格是長短期記憶(LSTM)單元格,則初始單元格狀態 C0, 并產生輸出 y 代表通過計算得出的最終RNN“子層”的輸出 t時間步長(請參見下文)??蛇x地,該層還可以產生輸出 hT 代表最終的隱藏狀態,如果該單元格是LSTM單元格,則輸出 cT代表最終的細胞狀態。
單元的操作定義為函數 G(x, h, c)。此功能需要向量輸入x, h, and c, 并產生最多兩個向量輸出 ^ h “ 和 ? “,表示執行單元操作后的隱藏狀態和單元狀態。
在默認(單向)配置中,RNNv2層適用 G如下圖所示:
G’ 是G的變體。
進入方框的箭頭是功能輸入,而遠離方框的箭頭是功能輸出。X = [x0, x1, …, xT], Y = [y0, y1, …, yT], Hi= [hi,0, hi,1, …, hi,L], and Ci= [ci,0, ci,1, …, ci,L]。
灰色 C 僅當RNN將LSTM單元用于 G 和 G’。
注意:以上結構有L “sub-layers” (horizontal rows of G),以及矩陣matrices Hi and Ci have dimensionality L。
可選地,序列長度 t可以被指定為RNNv2層的輸入,從而允許客戶端指定一批具有不同長度的輸入序列。
雙向RNN (BiRNN):可以將RNN配置為雙向。在這種情況下,每個子層都由一個“前向”層和“向后”層組成。前向層迭代地適用G 使用 The forward layer iteratively applies G using xi from 0 to T,然后向后層迭代地應用 applies G using xi from T to 0,如下圖所示:
上圖中的黑條表示串聯。完全隱藏狀態 ht 由前向隱藏狀態的串聯定義 htf 和向后隱藏狀態 htb:
? ht,i = [ htf,i ,htb,i]
? ht= [ ht,0, ht,1, …,ht,L]。
類似地,對于單元狀態(未示出)。每ht,i,用作下一個子層的輸入,如上所示。
RNN算子: RNNv2層支持以下單元操作:
? ReLU: G(x, h, c) := max(Wix + Rih + Wb + Rb, 0) (c not used)
? tanh: G(x, h, c) := tanh(Wix + Rih + Wb + Rb) (c not used)
? GRU:
o Z := sigmoid(Wzx + Rzh + Wbz + Rbz)
o M := sigmoid(Wrx + Rrh + Wbr + Rbr)
o G(x, h, c) := tanh(Whx + M(h + Rbh) + Wbh) (c not used)
? LSTM:
o I := sigmoid(WIx + RIh + Wbi + Rbi)
o F := sigmoid(Wfx + Rfh + Wbf + Rbf)
o O := sigmoid(Wox + Roh + Wbo + Rbo)
o C := tanh(WCx + RCh + Wbc + Rbc)
o C’ := F × C
o H := O x tanh(C’)
o G(x, h, c) := { H, C’ }
對于GRU和LSTM,我們指的是Z, M, I, F, etc. as "gates"等稱為“門”。
在單向情況下, the W matrices is HxE for the first layer and HxH,對于后續圖層(除非設置了跳越模式,請參見下文)。在雙向情況下,the dimensionality of the W matrices is HxE for the first forward/backward layer, and Hx2H for subsequent layers用于后續圖層。
維度the R matrices is always HxH. The biases Wbx and Rbx have dimensionality H。
跳越模式: RNNv2使用的默認模式是“線性模式”。在此模式下,RNNv2層的第一子層使用該單元G’(x, h, c),它接受一個大小 e的向量 X (嵌入尺寸)和向量 H 和 C 大小 H(隱藏狀態大小),并由單元格算子公式定義。后續層使用單元G(x, h,c),其中 X, H和 C 都是大小的向量 h, 并且還由單元格算子公式定義。
可選地,可以將RNN配置為以“跳越模式”運行,這意味著第一層的輸入權重矩陣是隱式的單元矩陣,并且 X 預期是大小 H。
條件與限制
數據 (X)輸入和初始隱藏/單元格狀態(高0 和 C 0張量至少具有2個非批量尺寸。其它尺寸被認為是批次尺寸。
可選的序列長度輸入 T is 0-dimensional (scalar)尺寸(標量)(不包括批次尺寸)。
數據 (y)輸出和最終的隱藏/單元狀態(HT and CT張量至少具有2個非批量尺寸。其他尺寸被認為是批次尺寸。如果提供了序列長度輸入,則將批次中的每個輸出填充到最大序列長度Tmax。
IRNNv2Layer 支持:
? FP32和FP16數據類型用于輸入和輸出,隱藏和單元張量。
? INT32數據類型僅用于序列長度張量。
定義網絡后,可以標記所需的輸出。未標記為網絡輸出或不用作另一層輸入的RNNv2輸出張量將被丟棄。
network->markOutput(*pred->getOutput(1));
pred->getOutput(1)->setType(DataType::kINT32);
rnn->getOutput(1)->setName(HIDDEN_OUT_BLOB_NAME);
network->markOutput(*rnn->getOutput(1));
if (rnn->getOperation() == RNNOperation::kLSTM)
{
rnn->getOutput(2)->setName(CELL_OUT_BLOB_NAME);
network->markOutput(*rnn->getOutput(2));
};
參閱C ++類 IRNNv2Layer或Python類 IRNNv2Layer 有關更多詳細信息。
總結
以上是生活随笔為你收集整理的循环IRNNv2Layer实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2D池化IPoolingLayer
- 下一篇: 用于ONNX的TensorRT后端