個人筆記,不喜勿噴。
舉例說明(結合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)
結果如下: