上一節,我們提到了rnn已經rnn在keras中最簡單的層******rnn。但******rnn由於過於簡化,沒有實用價值。
實際上,它不可以學到長期依賴。原因在於梯度消失問題,當運用比較多的非迴圈層時,而讓網變得無法訓練。同樣的問題其實也普遍發生在密集連線層。
今天介紹的lstm(long short-term memory)層,也是rnn層中的一種,這個演算法有hochreiter和 schmidhuber 在 1997 年開發,是二人研究梯度消失問題的重要成果。
簡單的來講,lstm比******rnn在內部迴圈中多了乙個ct值的傳遞。
這裡,附上偽**,lstm與******rnn的對比來方便理解:
#******rnn:
output_t = np.tanh(np.dot(w, input_t)
+ np.dot(u, state_t)
+ b)
state_t = output_t
#lstm
output_t = activation(dot(state_t,uo)
+ dot(input_t,wo)
+ dot(c_t,vo)
+ bo)
i_t = activation(dot(state_t, ui)
+ dot(input_t, wi)
+ bi)
f_t = activation(dot(state_t, uf)
+ dot(input_t, wf)
+ bf)
k_t = activation(dot(state_t, uk)
+ dot(input_t, wk)
+ bk)
c_t+
1= i_t * k_t + c_t * f_t
state_t = output_t
其中,i,f,k分別代表迴圈過程前面的層。將迴圈過程中不同的權重(w)和狀態權重(u)攜帶到後面的迴圈中,有效控制梯度消失問題。這裡貼上簡單的例子,理解lstm的實際運用:
from keras import layers
from keras import models
#處理資料
from keras.datasets import imdb
from keras.preprocessing import sequence
max_features =
10000
maxlen =
500# 在這麼多單詞之後截斷文字(這些單詞都
# 屬於前 max_features 個最常見的單詞)
batch_size =
32print
('loading data...'
)(input_train,y_train)
,(input_test,y_test)
= imdb.load_data(num_words=max_features)
print
(len
(input_train)
,'train sequence'
)print
(len
(input_test)
,'test sequence'
)print
('pad sequences (sample x time)'
)input_train = sequence.pad_sequences(input_train,maxlen=maxlen)
input_test = sequence.pad_sequences(input_test,maxlen=maxlen)
print
('input_train shape:'
,input_train.shape)
print
('input_test shape:'
,input_test.shape)
#構建模型
model = models.sequential(
)model.add(layers.embedding(max_features,32)
)# 32 維向量
model.add(layers.lstm(32)
)model.add(layers.dense(
1,activation=
'sigmoid'))
model.summary(
)#編譯模型
model.
compile
(optimizer=
'rmsprop'
, loss=
'binary_crossentropy'
, metrics=
['acc'])
#訓練模型
驗證精度達到了88%,還不錯,肯定比******rnn網路好多了,這主要是因為lstm受梯度消失問題的影響要小的多。
Python學習筆記(十)
mylab 專案實戰 1 在templates中乙個index.html我需要引入當前資料夾中的另乙個網頁,我直接在index的 中引入 html無效 最後,我在這個專案的主目錄下的urls中進行設定,可行 2 在呼叫網頁的時候,進行views設定,就已經把處理函式給選定了 直接在views,用re...
python學習筆記十
字典遍歷 集合函式 copy僅拷貝物件本身,而不對中的子物件進行拷貝,故對子物件進行修改也會隨著修改。dict1 dict2 dict1 dict3 dict1.copy dict1 user root dict1 num remove 1 print dict1 print dict2 print...
Python 深度學習 學習筆記(十四)
用一維卷積神經網路處理序列 今天,我們將學習到用一維卷積理解序列資料。一維卷積的卷積核是 n,1 的形狀。這裡需要注意的一點是,我們在二維卷積是大部分時間用到的卷積核為 3,3 3x3 9 在一維卷積層,卷積視窗的大小可以提公升到 7,或 9,一維卷積處理的思路與二維的大致相同,這裡直接貼上 例項 ...