圖中雖然有3個lstm單元,但是實際上只有一lstm單元a,這裡計算過程是假設輸入的時間序列是3,則首先輸入樣本x
0x_0
x0,lstm初始狀態c
0c_0
c0,h
0h_0
h0得到lstm的狀態c
1c_1
c1和h
1h_1
h1,此時在同乙個lstm單元輸入x
1x_1
x1和c
1c_1
c1和h
1h_1
h1,得到c
2c_2
c2和h
2h_2
h2,在同乙個lstm單元輸入x
2x_2
x2和c
2c_2
c2和h
2h_2
h2,得到h
3h_3
h3和c
2c_2
c2,此時完成了一次lstm的forward計算,然後才開始進行反向梯度下降更新引數。
lstm核心記憶單元是cell state,他儲存著經歷過的資訊。
遺忘門通過遺忘門控制是否保留之前的記憶c。
遺忘門是以上一時刻的lstm單元輸出h和當前時刻的樣本輸入x拼接成為新的輸入變數,經過一層全連線層計算,在啟用函式sigmod函式變為值範圍[0,1]的陣列。
輸入門輸入門控制當前時刻的樣本輸入x是否加入細胞狀態記憶c中。
輸入門同樣以上乙個時刻lstm神經元的輸出h和當前時刻的樣本x拼接成新的變數,經過一成全連線層計算和sigmod啟用函式,得到[0,1]範圍的門控制值。
樣本資訊,需要經過一層全連線層和tanh函式的處理,得到資訊的樣本資訊。
該圖就是將以前的狀態資訊和當前新的資訊進行相加,得到新的細胞狀態記憶,其中用遺忘門和輸入門分別控制兩部分資訊應該保留的多少程度。
輸出門輸出門控制lstm單元是否要輸出當前的細胞狀態資訊c。
輸出門和其他門計算一樣,輸出的資訊需要先經過tanh啟用函式後再輸出。
完整公式
多層lstm其計算過程以與單層類似,第一層lstm以輸入的樣本x和初始化的h0,
c0h_0,c_0
h0,c0
作為輸入進行計算,之後的lstm以上一層lstm的輸出h
hh代替樣本x,與上一時刻同層次的lstm的h,c
h,ch,
c輸入進行計算。
最終,output儲存了每個時刻樣本x輸入得到的最後一層lstm的輸出h的集合,若輸入時序長度為5,隱層神經元數(門計算時全連線層的隱層神經元數)為3,則乙個序列計算後,得到的output的大小就是(5,3),與lstm層數無關。如果是batch_size=10,那麼就是(10,5,3)。通常情況下我們只要最後乙個時刻的輸出值,即output[:,-1,:]的值。
h
nh_n
hn得到的是最後乙個時刻x輸入,每層lstm輸出h的集合。假設共有4層lstm,隱層神經元個數為3,則乙個序列計算後,得到的h
nh_n
hn大小就是(4,3),與序列大小無關,若batch_size=10,那麼就是(10,5,3)。
這裡可以看到,output[:,-1,:]與h
nh_n
hn[:,-1,:]是相等的,都是最後乙個樣本的最後一層lstm的輸出。
pytorch的lstm輸入輸出
torch.nn.lstm(樣本的輸入維度,隱層神經元個數,lstm的層數)
input(序列長度,批大小,樣本輸入維度)pytorch預設第0維是序列大小
輸出out(序列長度,批大小,隱層神經元數);
hn大小(lstm層數,批大小,隱層神經元個數);
cn大小(lstm層數,批大小,隱層神經元個數);
關於輸入輸出流的理解
前面學習jdk的時候,真的沒理解輸入輸出流的概念,今天上網看了別人的理解,覺得受益非淺,為了以後方便我也把我的理解記錄了下來.主要是從記憶體 磁碟 終端 螢幕 鍵盤 網路之間的闡述。程式操作的資料都應該是在記憶體裡面,記憶體是你操作的主物件,把資料從其他資源裡面傳送到記憶體裡面,就是輸入,反之,把資...
STM32輸入輸出理解
最近在看資料手冊的時候,發現在cortex m3裡,對於gpio的配置種類有8種之多 1 gpio mode ain 模擬輸入 2 gpio mode in floating 浮空輸入 3 gpio mode ipd 下拉輸入 4 gpio mode ipu 上拉輸入 5 gpio mode out...
輸入輸出流的初步理解
1.什麼是輸入輸出 輸入輸出的物件是資料,資料的儲存區域是光碟或者磁碟等裝置,還有乙個儲存資料的空間 記憶體,其中磁碟的速度比較慢,記憶體的速度比較快,把資料讀入記憶體的動作稱作輸入,把資料從記憶體存入磁碟的動作稱作輸出。2.流的分類 按流向分類 輸入流和輸出流 按照資料內容 位元組流 能處理位元組...