單層LSTM和多層LSTM的輸入與輸出

單層LSTM的輸入與輸出

在這裏插入圖片描述
上圖是單層LSTM的輸入輸出結構圖。其實它是由一個LSTM單元的一個展開,如下圖所示:
在這裏插入圖片描述
所以從左到右的每個LSTM Block只是對應一個時序中的不同的步。
在第一個圖中,輸入的時序特徵有S個,長度記作:seq_len,每個特徵是一個C維的向量,長度記作:input_size。而Initial State是LSTM的隱藏狀態和內部狀態的一個輸入的初始化。分別記作:h0和c0。
輸出可以通過設置,來決定是輸出所有時序步的輸出,還是隻輸出最後一個時序步的輸出。Final_State是隱藏狀態和內部狀態的輸出,記作:hn和cn.

那麼對於在pytorch中的函數LSTM的參數的輸入情況如下:

輸入數據:
  • X的格式:(seq_len,batch,input_size)
    #batch是批次數,可以在LSTM()中設置batch_first,使得X的輸入格式要求變爲(batch,seq_len,input_size)
  • h0的格式:(1,batch,hidden_size)
  • c0的格式:(1,batch,hidden_size)
    因爲不管輸入的數據X是多少個特徵的,h0和c0的都只需要一個輸入就行。

對於輸出,輸出的hidden_size的大小是由門控中的隱藏的神經元的個數來確定的。

輸出的格式:
  • H的格式:(seq_len,batch,hidden_size)
    #如果按照(seq_len,batch,hidden_size) 的格式輸出,需要在LSTM()中設置return_sequences=True,否則默認只輸出最後一個時間步的輸出結果(1,batch,hidden_size).
  • hn的格式:(1,batch,hidden_size)
  • cn的格式:(1,batch,hidden_size)

這只是LSTM單元的輸入輸出格式,真實的其後還要跟一個全連接層,用於把LSTM的輸出結果映射到自己想要的結果上,如分類:
在這裏插入圖片描述
如果只想要研究最後一個時間步的輸出結果,只需在最後一個時間步添加全連接即可。

多層LSTM的輸入與輸出

在這裏插入圖片描述
對於多層的LSTM,需要把第一層的每個時間步的輸出作爲第二層的時間步的輸入,如上圖所示。
對於num_layers層LSTM:

輸入數據:
  • X的格式:(seq_len,batch,input_size)
  • h0的格式:(num_layers,batch,hidden_size)
  • c0的格式:(num_layers,batch,hidden_size)
輸出數據:
  • H的格式:(seq_len,batch,hidden_size)
  • hn的格式:(num_layers,batch,hidden_size)
  • cn的格式:(num_layers,batch,hidden_size)

如果是雙向的,即在LSTM()函數中,添加關鍵字bidirectional=True,則:
單向則num_direction=1,雙向則num_direction=2
輸入數據格式:
input(seq_len, batch, input_size)
h0(num_layers * num_directions, batch, hidden_size)
c0(num_layers * num_directions, batch, hidden_size)
輸出數據格式:
output(seq_len, batch, hidden_size * num_directions)
hn(num_layers * num_directions, batch, hidden_size)
cn(num_layers * num_directions, batch, hidden_size)

補充細節,下面是轉載的:
版權聲明:本文爲CSDN博主「ssswill」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/ssswill/article/details/88429794
在這裏插入圖片描述
可以看到中間的 cell 裏面有四個黃色小框,你如果理解了那個代表的含義一切就明白了,每一個小黃框代表一個前饋網絡層,對,就是經典的神經網絡的結構,num_units就是這個層的隱藏神經元個數,就這麼簡單。其中1、2、4的激活函數是 sigmoid,第三個的激活函數是 tanh。
另外幾個需要注意的地方:
1、 cell 的狀態是一個向量,是有多個值的。
2、 上一次的狀態 h(t-1)是怎麼和下一次的輸入 x(t) 結合(concat)起來的,這也是很多資料沒有明白講的地方,也很簡單,concat, 直白的說就是把二者直接拼起來,比如 x是28位的向量,h(t-1)是128位的,那麼拼起來就是156位的向量。
3、 cell 的權重是共享的,這是什麼意思呢?這是指這張圖片上有三個綠色的大框,代表三個 cell 對吧,但是實際上,它只是代表了一個 cell 在不同時序時候的狀態,所有的數據只會通過一個 cell,然後不斷更新它的權重。
4、那麼一層的 LSTM 的參數有多少個?根據第 3 點的說明,我們知道參數的數量是由 cell 的數量決定的,這裏只有一個 cell,所以參數的數量就是這個 cell 裏面用到的參數個數。假設 num_units 是128,輸入是28位的,那麼根據上面的第 2 點,可以得到,四個小黃框的參數一共有 (128+28)*(128*4),也就是156 * 512,可以看看 TensorFlow 的最簡單的 LSTM 的案例,中間層的參數就是這樣,不過還要加上輸出的時候的激活函數的參數,假設是10個類的話,就是128*10的 W 參數和10個bias 參數
5、cell 最上面的一條線的狀態即 s(t) 代表了長時記憶,而下面的 h(t)則代表了工作記憶或短時記憶。

LSTM的訓練過程:
在這裏插入圖片描述
在這裏插入圖片描述
說明:上面畫紅框的地方,如想輸出如上的三維矩陣,需要指明參數:return_sequences=True
在這裏插入圖片描述

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