1、定義:什么是LSTM?
首先,我們知道最基礎的神經網絡是【全連接神經網絡】,keras里為,dense層。Dense就是常用的全連接層,所實現的運算是output = activation(dot(input, kernel)+bias)。其中activation是逐元素計算的激活函數,kernel是本層的權值矩陣,bias為偏置向量,只有當use_bias=True才會添加。
然后是 卷積神經網絡。卷積神經網絡主要用在圖片上,將一張很大的圖片提取出圖片的特征,其中還涉及了padding。
他們在處理【前一個輸入】和【后一個輸入】是完全沒有關系的。但是,某些任務需要能夠更好的處理序列的信息,即前面的輸入和后面的輸入是有關系的。比如,當我們在理解一句話意思時,孤立的理解這句話的每個詞是不夠的,我們需要處理這些詞連接起來的整個序列;當我們處理視頻的時候,我們也不能只單獨的去分析每一幀,而要分析這些幀連接起來的整個序列。
這時,就需要用到深度學習領域中另一類非常重要神經網絡:循環神經網絡(Recurrent Neural Network)
但是傳統的RNN有一個重大缺陷,就是在前向傳播的過程當中會出現梯度消失的問題,梯度消失會導致一句話如果比較長,第一個字到后面的時候,都已經被忘記了。
所以引入了LSTM,LSTM相當於RNN的改進版。
【注意】一個LSTM單元,也就是一層LSTM,我們在圖示中經常會根據T展開,但是他們其實是同一層LSTM。
a<t>在其他地方經常寫成h<t>,及隱藏層的輸出
【keras中LSTM的參數】:
units: 是output size, 也就是hidden layer的神經元數量
#units: 是output size, 也就是hidden layer的神經元數量,也就是隱藏層輸出的size
units = 2
from keras.models import Model
from keras.layers import Input
from keras.layers import LSTM
from numpy import array
# define model
inputs1 = Input(shape=(5, 1))
lstm1 = LSTM(units)(inputs1)
model = Model(inputs=inputs1, outputs=lstm1)
# define input data
data = array([0.1, 0.2, 0.3,0.4,0.5]).reshape((1,5,1))
# make and show prediction
print(model.predict(data))
#========================
#return_sequence=True (默認是False)
#則會輸出每個時序輸出的hidden_state_output
units = 2
from keras.models import Model
from keras.layers import Input
from keras.layers import LSTM
from numpy import array
# define model
inputs1 = Input(shape=(5, 1))
lstm1 = LSTM(units, return_sequences=True)(inputs1)
model = Model(inputs=inputs1, outputs=lstm1)
# define input data
data = array([0.1, 0.2, 0.3,0.4,0.5]).reshape((1,5,1))
# make and show prediction
print(model.predict(data))
#========================
#如果是return_state=True
【注意!!!!!!!!!】
LSTM的輸出,稱之為hidden_state。簡寫h,也就是NG說的a,但是這個其實非常容易混淆
因為LSTM還保留了另外一個記憶cell的狀態,簡寫為c
一般來說,我們不需要接觸c,但是在一些復雜模型,比如seq2seq的模型里,需要用t-1時刻的c來初始化t時刻的c
#如果是return_state=True,而return_sequence=True
#這個時候我們就知道,為什么上一個例子,同樣的output需要輸出兩次。
#因為return_sequence=True,是針對於整個output,也就是
#lstm1 = LSTM(units, return_sequences=True)(inputs1)
#中的lstm1,而如果進行了return_state, 則state_h就是最后一刻的輸出,而state_c是 c
from keras.models import Model
from keras.layers import Input
from keras.layers import LSTM
from numpy import array
# define model
inputs1 = Input(shape=(5, 1))
lstm1, state_h, state_c = LSTM(2, 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,0.4,0.5]).reshape((1,5,1))
# make and show prediction
print(model.predict(data))
#注意,predict data之后,輸出的是3個東西
=============特別注釋=================
1、state_c不是一個值,它的維度和state_h一樣,是unit是數量
2、 上一次的狀態 h(t-1)是怎么和下一次的輸入 x(t) 結合(concat)起來的,這也是很多資料沒有明白講的地方,也很簡單,concat, 直白的說就是把二者直接拼起來。
比如 x是28位的向量,h(t-1)是128位的,那么拼起來就是156位的向量,就是這么簡單。