1. 程式人生 > >keras:4)LSTM函式詳解

keras:4)LSTM函式詳解

LSTM層

keras.layers.recurrent.LSTM(units, activation='tanh', recurrent_activation='hard_sigmoid', use_bias=True, kernel_initializer='glorot_uniform', recurrent_initializer='orthogonal', bias_initializer='zeros', unit_forget_bias=True, kernel_regularizer=None, recurrent_regularizer=None, bias_regularizer=None
, activity_regularizer=None, kernel_constraint=None, recurrent_constraint=None, bias_constraint=None, dropout=0.0, recurrent_dropout=0.0)

核心引數
units:輸出維度
input_dim:輸入維度,當使用該層為模型首層時,應指定該值(或等價的指定input_shape)
return_sequences:布林值,預設False,控制返回型別。若為True則返回整個序列,否則僅返回輸出序列的最後一個輸出
input_length:當輸入序列的長度固定時,該引數為輸入序列的長度。當需要在該層後連線Flatten層,然後又要連線Dense層時,需要指定該引數,否則全連線的輸出無法計算出來。

輸入shape
形如(samples,timesteps,input_dim)的3D張量

輸出shape

如果return_sequences=True:返回形如(samples,timesteps,output_dim)的3D張量否則,返回形如(samples,output_dim)的2D張量

1.輸入和輸出的型別
相對之前的tensor,這裡多了個引數timesteps,其表示啥意思?舉個栗子,假如我們輸入有100個句子,每個句子都由5個單片語成,而每個單詞用64維的詞向量表示。那麼samples=100,timesteps=5,input_dim=64,你可以簡單地理解timesteps就是輸入序列的長度input_length(視情而定

)

2.units
假如units=128,就一個單詞而言,你可以把LSTM內部簡化看成 Y = X 1 × 64 W 64 × 128 ,X為上面提及的詞向量比如64維,W中的128就是units,也就是說通過LSTM,把詞的維度由64轉變成了128

3.return_sequences
我們可以把很多LSTM層串在一起,但是最後一個LSTM層return_sequences通常為false,具體看下面的栗子。

栗子
Sentence01: you are really a genius

model = Sequential()
model.add(LSTM(128, input_dim=64, input_length=5, return_sequences=True))
model.add(LSTM(256, return_sequences=False))

這裡寫圖片描述

(1)我們把輸入的單詞,轉換為維度64的詞向量,小矩形的數目即單詞的個數input_length
(2)通過第一個LSTM中的Y=XW,這裡輸入為維度64,輸出為維度128,而return_sequences=True,我們可以獲得5個128維的詞向量V1’..V5’
(3)通過第二個LSTM,此時輸入為V1’..V5’都為128維,經轉換後得到V1”..V5”為256維,最後因為return_sequences=False,所以只輸出了最後一個紅色的詞向量

參考:
https://www.zhihu.com/question/41949741?sort=created
http://www.cnblogs.com/leeshum/p/6133290.html
http://spaces.ac.cn/archives/4122/ (word2vec和Ebedding的區別)