在本教程中,您將發現 Keras 深度學習庫中 LSTM 層的回傳序列和回傳狀態的區別和結果,
完成本教程后,您將了解:
- 該回傳序列回傳每個輸入時間步的隱藏狀態輸出,
- 該回傳狀態回傳最后一個輸入時間步的隱藏狀態輸出和單元狀態,
- 可以同時使用回傳序列和回傳狀態,
本教程分為 4 個部分:
- 長短期記憶
- 回傳序列
- 回傳狀態
- 回傳狀態和序列
長短期記憶
長短期記憶(LSTM)是一個由內門組成的回圈神經網路,與其他回圈神經網路不同,該網路的內部門允許模型通過時間反向傳播或 BPTT 成功訓練,并避免梯度消失問題,
在 Keras 深度學習庫中,可以使用LSTM() 類創建 LSTM 層,創建 LSTM 記憶體單元層允許指定層內的記憶體單元數,
層內的每個單元或單元都有一個內部單元狀態,通常縮寫為“ c ”,并輸出一個隱藏狀態,通常縮寫為“ h ”,
Keras API 允許您訪問這些資料,這在開發復雜的回圈神經網路架構(例如編碼器-解碼器模型)時可能很有用甚至是必需的,
回傳序列
每個 LSTM 單元將為每個輸入輸出一個隱藏狀態h,
h = LSTM(X)
我們可以在 Keras 中使用一個非常小的模型來證明這一點,該模型具有一個 LSTM 層,該層本身包含一個 LSTM 單元,
在此示例中,我們將有一個具有 3 個時間步長的輸入樣本,并在每個時間步長觀察到一個特征:
t1 = 0.1
t2 = 0.2
t3 = 0.3
下面列出了完整的示例,
from keras.models import Model
from keras.layers import Input
from keras.layers import LSTM
from numpy import array
# define model
inputs1 = Input(shape=(3, 1))
lstm1 = LSTM(1)(inputs1)
model = Model(inputs=inputs1, outputs=lstm1)
# define input data
data = array([0.1, 0.2, 0.3]).reshape((1,3,1))
# make and show prediction
print(model.predict(data))
運行該示例會為具有 3 個時間步長的輸入序列輸出單個隱藏狀態,鑒于 LSTM 權重和單元狀態的隨機初始化,您的特定輸出值會有所不同,
可以訪問每個輸入時間步的隱藏狀態輸出,
這可以通過在定義 LSTM 層時將return_sequences屬性設定為True來完成,如下所示:
LSTM(1, return_sequences=True)
我們可以用這個改變來更新前面的例子,下面提供了完整的代碼清單,
from keras.models import Model
from keras.layers import Input
from keras.layers import LSTM
from numpy import array
# define model
inputs1 = Input(shape=(3, 1))
lstm1 = LSTM(1, return_sequences=True)(inputs1)
model = Model(inputs=inputs1, outputs=lstm1)
# define input data
data = array([0.1, 0.2, 0.3]).reshape((1,3,1))
# make and show prediction
print(model.predict(data))
運行該示例會回傳一個包含 3 個值的序列,該層中單個 LSTM 單元的每個輸入時間步都有一個隱藏狀態輸出,
回傳狀態
LSTM 單元或單元層的輸出稱為隱藏狀態,
這很令人困惑,因為每個 LSTM 單元都保留了一個不輸出的內部狀態,稱為單元狀態或c,
通常,我們不需要訪問單元狀態,除非我們正在開發復雜的模型,其中后續層可能需要使用另一層的最終單元狀態初始化其單元狀態,例如在編碼器-解碼器模型中,
Keras 向 LSTM 層提供 return_state 引數,該層將提供對隱藏狀態輸出 ( state_h ) 和單元狀態 ( state_c ) 的訪問,例如:
lstm1, state_h, state_c = LSTM(1, return_state=True)
這可能看起來令人困惑,因為 lstm1 和state_h都參考相同的隱藏狀態輸出,這兩個張量分開的原因將在下一節中變得清楚,
我們可以通過下面列出的作業示例演示對 LSTM 層中單元格的隱藏狀態和單元格狀態的訪問,
from keras.models import Model
from keras.layers import Input
from keras.layers import LSTM
from numpy import array
# define model
inputs1 = Input(shape=(3, 1))
lstm1, state_h, state_c = LSTM(1, return_state=True)(inputs1)
model = Model(inputs=inputs1, outputs=[lstm1, state_h, state_c])
# define input data
data = array([0.1, 0.2, 0.3]).reshape((1,3,1))
# make and show prediction
print(model.predict(data))
運行示例回傳 3 個陣列:
- 最后一個時間步的 LSTM 隱藏狀態輸出,
- 最后一個時間步的 LSTM 隱藏狀態輸出(再次),
- 最后一個時間步的 LSTM 單元狀態,
隱藏狀態和單元狀態又可以用于初始化具有相同單元數的另一個 LSTM 層的狀態,
回傳狀態和序列
我們可以同時訪問隱藏狀態序列和單元狀態,這可以通過將 LSTM 層配置為回傳序列和回傳狀態來完成,
lstm1, state_h, state_c = LSTM(1, return_sequences=True, return_state=True)
下面列出了完整的示例,
from keras.models import Model
from keras.layers import Input
from keras.layers import LSTM
from numpy import array
# define model
inputs1 = Input(shape=(3, 1))
lstm1, state_h, state_c = LSTM(1, return_sequences=True, return_state=True)(inputs1)
model = Model(inputs=inputs1, outputs=[lstm1, state_h, state_c])
# define input data
data = array([0.1, 0.2, 0.3]).reshape((1,3,1))
# make and show prediction
print(model.predict(data))
運行這個例子,我們現在可以看到為什么 LSTM 輸出張量和隱藏狀態輸出張量是分開宣告的,
該層回傳每個輸入時間步的隱藏狀態,然后分別回傳最后一個時間步的隱藏狀態輸出和最后一個輸入時間步的單元狀態,
這可以通過查看回傳序列(第一個陣列)中的最后一個值與隱藏狀態(第二個陣列)中的值匹配來確認,
概括
在本教程中,您發現了 Keras 深度學習庫中 LSTM 層的回傳序列和回傳狀態的差異和結果,
具體來說,了解到:
- 該回傳序列回傳每個輸入時間步的隱藏狀態輸出,
- 該回傳狀態回傳最后一個輸入時間步的隱藏狀態輸出和單元狀態,
- 可以同時使用回傳序列和回傳狀態,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/432107.html
標籤:AI
