長短時記憶網絡LSTM中各個輸入、輸出和參數維度及計算流程

個人筆記,不喜勿噴。

舉例說明(結合pytorch,最後會給出代碼)

構建的網絡nn.LSTM:(28,4,num_layers=2),即圖中是4層

輸入lstm_input:維度是(10,3,28)

初始化隱藏狀態h_init:維度是(2,3,4)

初始化初始化細胞狀態c_init:維度是(2,3,4)

計算結果out:維度是(10,3,4)

計算後最後一個時間步h隱藏狀態:維度是(2,3,4)

計算後最後一個時間步c細胞狀態:維度是(2,3,4)

計算過程中,input計算參數維度:(16,28)

計算過程中,隱藏層計算參數維度:(16,4)

結合上圖來分析:

圖中綠色的方框代表LSTM中的神經元;

左邊藍色的橢圓是初始化的h和c參數,由於它們維度一致,就將它們合起來一起表示,當然,在pytorch中可以使用系統自定義的h和c參數,不必自定義。在這裏,我們定義了h和c的維度均是(2,3,4),其中2代表有兩層網絡,3代表着時序輸入(圖中下邊藍色3個輸入,每個輸入維度28),4代表着特徵維度(自定義的,即想要提取的特徵數);

下邊藍色的橢圓是輸入,在這裏我們看到,有3個時序輸入,每個時序輸入是28維度。在上面的例子中,輸入維度是10,3,28),其中10代表着分10次批量輸入,3代表着時序輸入,28代表着每個時序的輸入是28維度;

右邊黃色的橢圓是h和c參數的輸出,輸出後的參數的維度和初始化的是一致的。在上面的例子中,h和c的初始和計算後維度均爲(10,3,4)。

上邊黃色的橢圓是網絡的輸出。在上面的例子中,其維度爲(10,3,4),其中10是批量數,3是時序(即每個時序都有輸出),4代表每個時序的輸出的維度,在這裏雖然網絡有兩層,但是僅取最後一層作爲輸出

計算過程中,結合上面例子,input計算參數維度是(16,28)。16代表着啥,代表4*4,第一個4是固定的,因爲LSTM中有四個類似‘門’計算(三個門和一個狀態計算),後面的4代表着特徵數,就是參數h和c中的4(即神經元每一列個數,因爲他們一樣)。28代表啥,代表着每個時序輸入的特徵數28。

計算過程中,結合上面例子,隱藏層計算參數維度:(16,4)。16代表啥,和input計算參數維度一樣。4代表啥,特徵數,就是參數h和c中的4(即神經元每一列個數,因爲他們一樣)。

 

接下來上代碼:

import torch
from torch.autograd import Variable
from torch import nn

lstm_seq = nn.LSTM(28, 4, num_layers=2)  # 構建LSTM網絡
lstm_input = Variable(torch.randn(10, 3, 28))  # 構建輸入
h_init = Variable(torch.randn(2, 3, 4))  # 構建h輸入參數
c_init = Variable(torch.randn(2, 3, 4))  # 構建c輸出參數
out, (h, c) = lstm_seq(lstm_input, (h_init, c_init))  # 計算
print(lstm_seq.weight_ih_l0.shape)
print(lstm_seq.weight_hh_l0.shape)
print(out.shape, h.shape, c.shape)

結果如下:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章