tensorflow-RNN和LSTM
本章主要介紹循環(huán)神經(jīng)網(wǎng)絡(luò)(recurrent neuralnetwork,RNN)和長短時記憶網(wǎng)絡(luò)(long short-term memory,LSTM)
一. RNN簡介
1.背景
循環(huán)神經(jīng)網(wǎng)絡(luò)挖掘數(shù)據(jù)中的時序信息以及語義信息的深度表達能力別充分利用,并在語音識別、語言模型、機器翻譯以及時序分析等方面實現(xiàn)了突破。
循環(huán)神經(jīng)網(wǎng)絡(luò)的主要用途是處理和預(yù)測序列數(shù)據(jù)。在全連接神經(jīng)網(wǎng)絡(luò)或卷積神經(jīng)網(wǎng)絡(luò)中,網(wǎng)絡(luò)結(jié)構(gòu)都是從輸入層到隱藏層再到輸出層,層與層之間是全連接或部分連接的,但每層之間的節(jié)點是無連接的。考慮這樣一個問題,如果要預(yù)測句子的下一個單詞是什么,一般需要用到當(dāng)前單詞以及前面的單詞,因為句子中前后單詞并不是獨立的。循環(huán)神經(jīng)網(wǎng)絡(luò)的來源就是為了刻畫一個序列當(dāng)前的輸出與之前信息的關(guān)系。從網(wǎng)絡(luò)結(jié)構(gòu)上,循環(huán)神經(jīng)網(wǎng)絡(luò)會記憶之前的信息,并利用之前的信息影響后面節(jié)點的輸出。也就是說,循環(huán)神經(jīng)網(wǎng)絡(luò)的隱藏層之間的節(jié)點是有連接的,隱藏層的輸入不僅包括輸入層的輸出,還包括上一時刻隱藏層的輸出。
2.RNN經(jīng)典結(jié)構(gòu)
如上所示為一個經(jīng)典的循環(huán)神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)。可以看到在每一時刻t,循環(huán)神經(jīng)網(wǎng)絡(luò)會針對該時刻的輸入結(jié)合當(dāng)前模型的狀態(tài)給出一個輸出,并更新模型狀態(tài)。此結(jié)構(gòu)A的輸入除了來自輸入層xt,還有一個循環(huán)的邊來提供上一時刻的隱藏狀態(tài)(hidden state)ht-1。在每一個時刻,循環(huán)神經(jīng)網(wǎng)絡(luò)的模塊A在讀取了xt和ht-1之后會生成新的隱藏狀態(tài)ht,并產(chǎn)生本時刻的輸出ot(在很多模型中隱藏狀態(tài)ht也被直接用于輸出,這類模型可以看作ot == ht的特性。一些資料直接用ht同時代表這兩個輸出),由于模型A中的運算和變量在不同時刻是相同的,因此循環(huán)神經(jīng)網(wǎng)絡(luò)理論上可以被看作是同一神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)被無限復(fù)制的結(jié)果。正如卷積神經(jīng)網(wǎng)絡(luò)在不同的空間位置共享參數(shù),循環(huán)神經(jīng)網(wǎng)絡(luò)是在不同時間位置共享參數(shù),從而能夠使用有限的參數(shù)處理任意長度的序列。
3.展開輸入輸出序列
3.1 將完整的輸入輸出展開,可以得到上面的結(jié)構(gòu),可以更加清楚地看到循環(huán)神經(jīng)網(wǎng)絡(luò)在每一個時刻會有一個輸入xt,然后根據(jù)循環(huán)神經(jīng)網(wǎng)絡(luò)前一時刻的狀態(tài)ht-1計算新的狀態(tài)ht,并輸出ot。循環(huán)神經(jīng)網(wǎng)絡(luò)當(dāng)前的狀態(tài)ht是根據(jù)上一時刻的狀態(tài)ht-1和當(dāng)前的輸入xt共同決定的。在時刻t,狀態(tài)ht-1濃縮了前面序列x0,x1,...,xt-1的信息,用于作為輸出ot的參考。由于序列的長度可以無限延長,維度有限的h狀態(tài)不可能將序列的全部信息都保存下來,因此模型必須學(xué)習(xí)只保留與后面任務(wù)ot,ot+1,...相關(guān)的最重要的信息。
3.2 循環(huán)網(wǎng)絡(luò)的展開在模型訓(xùn)練中有重要意義。從上圖可以看出,循環(huán)神經(jīng)網(wǎng)絡(luò)對長度為N的序列展開之后,可以視為一個有N個中間層的前饋神經(jīng)網(wǎng)絡(luò)。這個前饋神經(jīng)網(wǎng)絡(luò)沒有循環(huán)鏈接,因此可以直接使用反向傳播算法進行訓(xùn)練,而不需要任何特別的優(yōu)化算法。這樣的訓(xùn)練方法稱為“沿時間反向傳播”(Back-Propagation Through Time),是訓(xùn)練循環(huán)神經(jīng)網(wǎng)絡(luò)最常見的方法。
3.3 從上圖可以看出循環(huán)神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)特征最擅長解決與時間時序相關(guān)的問題。循環(huán)神經(jīng)網(wǎng)絡(luò)也是處理這類問題時最自然的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)。對于一個序列數(shù)據(jù),可以將這個序列上不同時刻的數(shù)據(jù)依次傳入循環(huán)神經(jīng)網(wǎng)絡(luò)的輸入層,而輸出可以是對序列中下一個時刻的預(yù)測,也可以是對當(dāng)前時刻信息的處理結(jié)果(比如語音識別結(jié)果)。循環(huán)神經(jīng)網(wǎng)絡(luò)要求每一個時刻都有一個輸入。但是不一定每一個時刻都需要有輸出。循環(huán)神經(jīng)網(wǎng)絡(luò)被廣泛地應(yīng)用在語音識別、語言模型、機器翻譯以及時序分析等問題上,并取得了巨大的成功。
4. 機器翻譯案例
循環(huán)神經(jīng)網(wǎng)絡(luò)中每一個時刻的輸入為需要翻譯的句子中的單詞,如下圖所示,需要翻譯的句子為ABCD,那么循環(huán)神經(jīng)網(wǎng)絡(luò)第一段每一個時刻的輸入就分別是A、B、C和D,然后用"_"作為待翻譯句子的結(jié)束符(句子結(jié)束符可以用符號或字符串表示,只要文本正文中沒有出現(xiàn)過即可)。在第一段中,循環(huán)神經(jīng)網(wǎng)絡(luò)沒有輸出。從結(jié)束符”_“開始,循環(huán)神經(jīng)網(wǎng)絡(luò)進入翻譯階段。該階段中每一個時刻的輸入是上一個時刻的輸出,而最終得到的輸出就是句子ABCD翻譯的結(jié)果,當(dāng)網(wǎng)絡(luò)輸出"_"時翻譯結(jié)束。
5.循環(huán)體介紹
如之前所介紹,循環(huán)神經(jīng)網(wǎng)絡(luò)可以看作是同一神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)在時間序列上被復(fù)制多次的結(jié)果,這個被復(fù)制多次的結(jié)構(gòu)被稱之為循環(huán)體。如何設(shè)計循環(huán)體的網(wǎng)絡(luò)結(jié)構(gòu)是循環(huán)神經(jīng)網(wǎng)絡(luò)解決實際問題的關(guān)鍵。下面展示了一個最簡單的循環(huán)體結(jié)構(gòu)。這個循環(huán)體中只使用了一個類似全連接層的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)。
循環(huán)神經(jīng)網(wǎng)絡(luò)中的狀態(tài)是通過一個向量來表示的,這個向量的維度也稱為循環(huán)神經(jīng)網(wǎng)絡(luò)隱藏層的大小,假設(shè)其為n,上圖可以看出,循環(huán)體中的神經(jīng)網(wǎng)絡(luò)的輸入有兩部分,一部分為上一時刻的狀態(tài),另一部分為當(dāng)前時刻的輸入樣本。對于時間序列數(shù)據(jù)來說(比如不同時刻商品的銷量),每一時刻的輸入樣例可以是當(dāng)前時刻的數(shù)值(比如銷量值);對于語言模型來說,輸入樣例可以是當(dāng)前單詞對應(yīng)的單詞向量。
假設(shè)輸入向量的維度為x,隱藏狀態(tài)的維度為n,那么上圖中循環(huán)體的全連接層神經(jīng)網(wǎng)絡(luò)的輸入大小為n+x。也就是將上一時刻的狀態(tài)與當(dāng)前時刻的輸入拼接成一個大的向量作為循環(huán)體中神經(jīng)網(wǎng)絡(luò)的輸入(有時也將會將上一時刻狀態(tài)對應(yīng)的權(quán)重和當(dāng)前時刻輸入對應(yīng)的權(quán)重特意分開,但它們的實質(zhì)是一樣的。本節(jié)采用了向量拼接的方式)。因為該全連接層的輸出為當(dāng)前時刻的狀態(tài),于是輸出層的節(jié)點個數(shù)也為n,循環(huán)體中的參數(shù)個數(shù)為(n+x)xn+n。上圖可以看出,循環(huán)體中的神經(jīng)網(wǎng)絡(luò)輸出不但提供給了下一時刻作為狀態(tài),同時也會提供給當(dāng)前時刻的輸出。注意到循環(huán)體狀態(tài)與最終輸出的維度通常不同,因此為了將當(dāng)前時刻的狀態(tài)轉(zhuǎn)化為最終的輸出,循環(huán)神經(jīng)網(wǎng)絡(luò)還需要另外一個全連接神經(jīng)網(wǎng)絡(luò)來完成這個過程。這和卷積神經(jīng)網(wǎng)絡(luò)中最后的全連接層的意思是一樣的。類似的,不同時刻用于輸出的全連接神經(jīng)網(wǎng)絡(luò)中的參數(shù)也是一致的。
6. 循環(huán)神經(jīng)網(wǎng)絡(luò)的前向傳播過程
如下圖所示,假設(shè)狀態(tài)的維度為2,輸入、輸出的維度都為1,而且循環(huán)體中的全連接層權(quán)重為:wrnn=[[0.1, 0.2], [0.3, 0.4], [0.5, 0.6]],偏置項的大小為brnn=[0.1, -0.1]。用于輸出的全連接層權(quán)重為:woutput=[1.0, 2.0],偏置項大小為boutput=0.1.那么在時刻t0,因為沒有上一時刻,所以將狀態(tài)初始化為hinit=[0, 0],而當(dāng)前的輸入為1,所以拼接得到的向量為[0, 0, 1],通過循環(huán)體中的全連接層神經(jīng)網(wǎng)絡(luò)得到的結(jié)果為:
這個結(jié)果將作為下一時刻的輸入狀態(tài),同時循環(huán)神經(jīng)網(wǎng)絡(luò)也會使用該狀態(tài)生成輸出。將該向量作為輸入提供給用于輸出的全連接神經(jīng)網(wǎng)絡(luò)可以得到t0時刻的最終輸出:[0.537, 0.462]x[1.0, 2.0] + 0.1 = 1.56,使用t0時刻的狀態(tài)可以類似地推導(dǎo)得出t1時刻的狀態(tài)為[0.860, 0.884],而t1時刻的輸出為2.73。在得到循環(huán)神經(jīng)網(wǎng)絡(luò)的前向傳播結(jié)果之后,可以和其他神經(jīng)網(wǎng)絡(luò)類似地定義損失函數(shù),循環(huán)神經(jīng)網(wǎng)絡(luò)唯一的區(qū)別在于因為它每個時刻都有一個輸出,所以循環(huán)神經(jīng)網(wǎng)絡(luò)的總損失為所有時刻(或者部分時刻)上的損失函數(shù)的總和。
此前向傳播代碼練習(xí)參考:https://github.com/pythonAndAI/tensorflow-exercise/blob/master/com/tensorflow/exercise/RNN/RNN_basis.py
和其他神經(jīng)網(wǎng)絡(luò)類似,在定義完損失函數(shù)之后,套用前面說的優(yōu)化框架(指數(shù)衰減法、滑動平均模型、優(yōu)化器、正則化等)Tensorflow就可以自動完成模型訓(xùn)練的過程。這里唯一需要特別指出的是,理論上循環(huán)神經(jīng)網(wǎng)絡(luò)可以支持任意長度的序列,然而在實際訓(xùn)練過程中,,如果序列過長,一方面會導(dǎo)致優(yōu)化時出現(xiàn)梯度消散和梯度爆炸的問題,另一方面,展開后的前饋神經(jīng)網(wǎng)絡(luò)會占用過大的內(nèi)存,所以實際中一般會規(guī)定一個最大長度,當(dāng)序列長度超過規(guī)定長度之后會對序列進行截斷。
二、長短時記憶網(wǎng)絡(luò)(LSTM)結(jié)構(gòu)
1. LSTM結(jié)構(gòu)詳情
在有些問題中,模型僅僅需要短期內(nèi)的信息來執(zhí)行當(dāng)前的任務(wù),在這樣的場景中,相關(guān)的信息和待預(yù)測的詞的位置之間的間隔很小,循環(huán)神經(jīng)網(wǎng)絡(luò)可以比較容易地利用先前的信息。這類問題可以用前面介紹的簡單循環(huán)體來解決。
但同樣也有一些上下文場景更加復(fù)雜的情況。比如一個模型僅僅根據(jù)短期的信息不能正確的預(yù)測正確的結(jié)果。這樣前面介紹的簡單循環(huán)神經(jīng)網(wǎng)絡(luò)有可能會喪失學(xué)習(xí)到距離如此遠的信息的能力。或者在復(fù)雜語言場景中,有用信息的間隔有大有小、長短不一,循環(huán)神經(jīng)網(wǎng)絡(luò)的性能也會受到限制。
長短時記憶網(wǎng)絡(luò)(long short-term memory,LSTM)的設(shè)計就是為了解決這個問題,在很多任務(wù)上,采用LSTM結(jié)構(gòu)的循環(huán)神經(jīng)網(wǎng)絡(luò)比標(biāo)準(zhǔn)的循環(huán)神經(jīng)網(wǎng)絡(luò)表現(xiàn)更好。LSTM結(jié)構(gòu)是由Sepp Hochreiter和Jurgen Schmidhuber于1997年提出的,它是一種特殊的循環(huán)體結(jié)構(gòu)。如下圖所示,與單一tanh循環(huán)體結(jié)構(gòu)不同,LSTM是一種擁有三個“門”結(jié)構(gòu)的特殊網(wǎng)絡(luò)結(jié)構(gòu)。
LSTM靠一些“門”的結(jié)構(gòu)讓信息有選擇性地影響循環(huán)神經(jīng)網(wǎng)絡(luò)中每個時刻的狀態(tài)。所謂“門”的結(jié)構(gòu)就是一個使用sigmoid神經(jīng)網(wǎng)絡(luò)和一個按位做乘法的操作,這兩個操作合在一起就是一個“門”的結(jié)構(gòu)。之所以該結(jié)構(gòu)叫做“門”是因為使用sigmoid作為激活函數(shù)的全連接神經(jīng)網(wǎng)絡(luò)層會輸出一個0到1之間的數(shù)值,描述當(dāng)前輸入有多少信息量可以通過這個結(jié)構(gòu)。于是這個結(jié)構(gòu)的功能就類似于一扇門,當(dāng)門打開時(sigmoid神經(jīng)網(wǎng)絡(luò)層輸出為1時),全部信息都可以通過;當(dāng),而門關(guān)上時(sigmoid神經(jīng)網(wǎng)絡(luò)層輸出為0時),任何信息都無法通過。
為了使循環(huán)神經(jīng)網(wǎng)絡(luò)更有效的保存長期記憶,上圖中“遺忘門”和“輸入門”至關(guān)重要,它們是LSTM結(jié)構(gòu)的核心。“遺忘門”的作用是讓循環(huán)神經(jīng)網(wǎng)絡(luò)“忘記”之前沒有用的信息。比如一段文章中先介紹了某地原來是綠水藍天,但后來被污染了。于是在看到被污染了之后,循環(huán)神經(jīng)網(wǎng)絡(luò)應(yīng)該“忘記”之前綠水藍天的狀態(tài)。這個工作是通過“遺忘門”來完成的。“遺忘門”會根據(jù)當(dāng)前的輸入xt和上一時刻輸出ht-1決定那一部分記憶需要被遺忘。假設(shè)狀態(tài)c的維度為n,“遺忘門”會根據(jù)當(dāng)前的輸入xt和上一時刻輸出ht-1計算一個維度為n的向量f=sigmoid(W1x +?W2h),它在每一維度上的值都在(0,1)范圍內(nèi)。再將上一時刻的狀態(tài)ct-1與f向量按位相乘,那么f取值接近0的維度上的信息就會被“忘記”,而f取值接近1的維度上的信息會被保留。
在循環(huán)神經(jīng)網(wǎng)絡(luò)“忘記”了部分之前的狀態(tài)后,它還需要從當(dāng)前的輸入補充最新的記憶。這個過程就是“輸入門”完成的。如上圖所示,“輸入門”會根據(jù)xt和ht-1決定哪些信息加入到轉(zhuǎn)態(tài)ct-1中生成新的狀態(tài)ct。比如當(dāng)看到文章中提到環(huán)境被污染之后,模型需要將這個信息寫入新的狀態(tài)。這時“輸入門”和需要寫入的新狀態(tài)都從xt和ht-1計算產(chǎn)生。通過“遺忘門”和“輸入門”,LSTM結(jié)構(gòu)可以更加有效地決定哪些信息應(yīng)該被遺忘,哪些信息應(yīng)該得到保留。
LSTM結(jié)構(gòu)在計算得到新的狀態(tài)ct后需要產(chǎn)生當(dāng)前時刻的輸出,這個過程是通過“輸出門”完成的。“輸出門”會根據(jù)最新的狀態(tài)ct、上一時刻的輸出ht-1和當(dāng)前的輸入xt來決定該時刻的輸出ht。比如當(dāng)前的狀態(tài)為被污染,那么“天空的顏色”后面的單詞很可能就是“灰色的”。
2. LSTM的前向傳播
相比1.6介紹的循環(huán)神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),使用LSTM結(jié)構(gòu)的循環(huán)神經(jīng)網(wǎng)絡(luò)的前向傳播是一個相對比較復(fù)雜的過程。具體LSTM每個“門”的公式定義如下:
z = tanh(Wz[ht-1,xt])? ? (輸入值)? ? ? ? i = sigmoid(Wi[ht-1,xt])? ? ? ? (輸入門)
f = sigmoid((Wf[ht-1,xt])) (遺忘門)? o = sigmoid(Wo[ht-1,xt])? ? (輸出門)
ct = f * ct-1?+ i * z? ?(新狀態(tài))? ? ht = o * tanh ct? ?(輸出)
其中Wz、Wi、Wf、Wo是4個維度為[2n, n]的參數(shù)矩陣。下面用流程圖的形式表示了上面的公式。
輸入:Ct-1、ht-1、Xt,輸出:Ct、ht
用tensorflow定義一個LSTM結(jié)構(gòu):https://github.com/pythonAndAI/tensorflow-exercise/blob/master/com/tensorflow/exercise/RNN/LSTM_test.py
三、循環(huán)神經(jīng)網(wǎng)絡(luò)的變種
1. 雙向循環(huán)神經(jīng)網(wǎng)絡(luò)
在經(jīng)典的循環(huán)神經(jīng)網(wǎng)絡(luò)中,狀態(tài)的傳輸是從前往后單向的。然而,在有些問題中,當(dāng)前時刻的輸出不僅和之前的狀態(tài)有關(guān),也和之后的狀態(tài)相關(guān)。這時就需要使用雙向循環(huán)神經(jīng)網(wǎng)絡(luò)(bidirectional RNN)來解決這類問題。例如預(yù)測一個句子中缺失的單詞不僅需要根據(jù)前文來判斷,也需要根據(jù)后面的內(nèi)容,這時雙向循環(huán)神經(jīng)網(wǎng)絡(luò)就可以發(fā)揮它的作用。雙向循環(huán)神經(jīng)網(wǎng)絡(luò)是由兩個獨立的循環(huán)神經(jīng)網(wǎng)絡(luò)疊加到一起組成的。輸出由這兩個循環(huán)神經(jīng)網(wǎng)絡(luò)的輸出拼接而成。如下圖所示結(jié)構(gòu)。
從上圖可以看出,雙向循環(huán)神經(jīng)網(wǎng)絡(luò)的主體結(jié)構(gòu)就是兩個單向循環(huán)神經(jīng)網(wǎng)絡(luò)的結(jié)合。在每一個時刻t,輸入會同時提供給這兩個方向相反的循環(huán)神經(jīng)網(wǎng)絡(luò)。兩個網(wǎng)絡(luò)獨立進行計算,各自產(chǎn)生該時刻的新狀態(tài)和輸出。而雙向循環(huán)神經(jīng)網(wǎng)絡(luò)的最終輸出是這兩個單向循環(huán)神經(jīng)網(wǎng)絡(luò)的輸出的簡單拼裝。兩個循環(huán)神經(jīng)網(wǎng)絡(luò)除方向不同以外,其余結(jié)構(gòu)完全對稱。每一層網(wǎng)絡(luò)中的循環(huán)體可以自由選用任意結(jié)構(gòu),如前面說的簡單RNN、LSTM均作為雙向循環(huán)神經(jīng)網(wǎng)絡(luò)的循環(huán)體。雙向循環(huán)神經(jīng)網(wǎng)絡(luò)的前向傳播過程和單向的循環(huán)神經(jīng)網(wǎng)絡(luò)十分類似。
2. 深層循環(huán)神經(jīng)網(wǎng)絡(luò)
深層循環(huán)神經(jīng)網(wǎng)絡(luò)(Deep RNN)是循環(huán)神經(jīng)網(wǎng)絡(luò)的另外一種變種。為了增強模型的表達能力,可以在網(wǎng)路中設(shè)置多個循環(huán)層,將每層循環(huán)網(wǎng)絡(luò)的輸出傳給下一層進行處理。在前面描述的單層循環(huán)網(wǎng)絡(luò)中,每一時刻的輸入xt到輸出ot之間只有一個全連接層,因此在xt到ot的路徑上是一個很淺的神經(jīng)網(wǎng)絡(luò),從輸入中提取抽象信息的能力將受到限制。下圖給出的深層循環(huán)神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)。可以看出,在一個L層的深層循環(huán)網(wǎng)絡(luò)中,每一個時刻的輸入xt到輸出ot之間有L個循環(huán)體,網(wǎng)絡(luò)因此可以從輸入中抽取更加高層的信息。和CNN類似,每一層(每個時刻的相同層,比如h1init是0時刻到t時刻的第一層)的循環(huán)體中參數(shù)是一致的,而不同層中的參數(shù)可以不同。Tensorflow中提供了MultiRNNCell類來實現(xiàn)深層循環(huán)神經(jīng)網(wǎng)絡(luò)的前向傳播過程。
用Tensorflow實現(xiàn)一個Deep RNN前向傳播過程:https://github.com/pythonAndAI/tensorflow-exercise/blob/master/com/tensorflow/exercise/RNN/RNN_Deep.py
四、循環(huán)神經(jīng)網(wǎng)絡(luò)的dropout
在CNN時有使用過dropout方法。通過dropout方法,可以讓卷積神經(jīng)網(wǎng)絡(luò)更加健壯。類似的,在循環(huán)神經(jīng)網(wǎng)絡(luò)中使用dropout也有同樣的功能。而且,類似CNN只在最后的全連接層中使用dropout,RNN一般只在不同層循環(huán)體結(jié)構(gòu)之間使用dropout,而不再同一層的循環(huán)體結(jié)構(gòu)之間使用。如下圖,也就是說從時刻t-1傳遞到時刻t時,RNN不會進行狀態(tài)的dropout;而在同一時刻t中,不同層循環(huán)體之間會使用dropout(下圖實線箭頭表示不使用dropout,虛線箭頭表示使用dropout)。
如上圖所示。假設(shè)要從t-2時刻的輸入xt-2傳遞到t+1時刻的輸入yt+1,那么xt-2將首先傳入第一層循環(huán)體結(jié)構(gòu),這個過程會使用dropout。但是從t-2時刻的第一層循環(huán)體結(jié)構(gòu)傳遞到第一層的t-1、t、t+1時刻不會使用dropout。在t+1時刻的第一層循環(huán)體結(jié)構(gòu)傳遞到傳遞到同一時刻內(nèi)更高層的循環(huán)體結(jié)構(gòu)時,會再次使用dropout,tensorflow中可以用tf.nn.rnn_cell.DropoutWrapper類實現(xiàn)dropout功能。可以參考此地址練習(xí):https://github.com/pythonAndAI/tensorflow-exercise/blob/master/com/tensorflow/exercise/RNN/RNN_dropout.py
?五、RNN樣例應(yīng)用
前面已經(jīng)介紹了不同循環(huán)神經(jīng)網(wǎng)絡(luò)的網(wǎng)絡(luò)結(jié)構(gòu),并給出了具體的Tensorflow程序來實現(xiàn)這些循環(huán)神經(jīng)網(wǎng)絡(luò)的前向傳播過程。將以時序預(yù)測為例,利用循環(huán)神經(jīng)網(wǎng)絡(luò)實現(xiàn)對函數(shù)sinx取值的預(yù)測。下面給出了sin函數(shù)的函數(shù)圖像。
下面將用Tensorflow程序來實現(xiàn)預(yù)測sin函數(shù)。因為循環(huán)神經(jīng)網(wǎng)絡(luò)模型預(yù)測的是離散時刻的取值,所以在程序中需要將連續(xù)的sin函數(shù)曲線離散化。所謂離散化就是在一個給定的區(qū)間[0, MAX]內(nèi),通過有限個采樣點模擬一個連續(xù)的曲線。比如在以下練習(xí)中每個SAMPLE_ITERVAL對sin函數(shù)進行一次采樣,采樣得到的序列就是sin函數(shù)離散化之后的結(jié)果。練習(xí)代碼地址為:https://github.com/pythonAndAI/tensorflow-exercise/blob/master/com/tensorflow/exercise/RNN/RNN_sin_case.py
https://www.cnblogs.com/eagou/p/9257380.html
轉(zhuǎn)載于:https://www.cnblogs.com/bestExpert/p/10633794.html
總結(jié)
以上是生活随笔為你收集整理的tensorflow-RNN和LSTM的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2018-2019-2 20165209
- 下一篇: HTTP 缓存相关