生活随笔
收集整理的這篇文章主要介紹了
深度学习(十一)RNN入门学习
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
RNN入門學習
原文地址: http://blog.csdn.net/hjimce/article/details/49095371
作者:hjimce
一、相關理論
RNN( Recurrent Neural Networks) 中文名又稱之為:循環神經網絡(原來還有一個遞歸神經網絡,也叫RNN,搞得我有點混了,菜鳥剛入門,對不上號)。在計算機視覺里面用的比較少,我目前看過很多篇計算機視覺領域的相關深度學習的文章,就除了2015 ICCV的一篇圖像語意分割文獻《Conditional Random Fields as Recurrent Neural Networks》有提到RNN這個詞外,目前還未見到其它的把RNN用到圖像上面。RNN主要用于序列問題,如自然語言、語音音頻等領域,相比于CNN來說,簡單很多,CNN包含:卷積層、池化層、全連接層、特征圖等概念,RNN基本上就僅僅只是三個公式就可以搞定了,因此對于RNN我們只需要知道三個公式就可以理解RNN了。說實話,一開是聽到循環神經網絡這個名子,感覺好難的樣子,因為曾經剛開始學CNN的時候,也有很多不懂的地方。還是不啰嗦了,……開始前,我們先回顧一下,簡單的MLP三層神經網絡模型:
簡單MLP模型
上面那個圖是最簡單的淺層網絡模型了,x為輸入,s為隱藏層神經元,o為輸出層神經元。然后U、V就是我們要學習的參數了。上面的圖很簡單,每層神經元的個數就只有一個,我們可以得到如下公式:
(1)隱藏層神經元的激活值為:
s=f(u*x+b1)
(2)然后輸出層的激活值為:
o=f(v*s+b2)
這就是最簡單的三層神經網絡模型的計算公式了,如果對上面的公式,還不熟悉,建議還是看看神經網絡的書,打好基礎先。 而其實RNN網絡結構圖,僅僅是在上面的模型上,加了一條連接線而已, RNN結構圖:
RNN結構圖
看到結構圖,是不是覺得RNN網絡好像很簡單的樣子,至少沒有像CNN過程那么長。從上面的結構圖看,RNN網絡基礎結構,就只有一個輸入層、隱藏層、輸出層,看起來好像跟傳統淺層神經網絡模型差不多(只包含輸出層、隱藏層、輸出層),唯一的區別是:上面隱藏層多了一天連接線,像圓圈一樣的東東,而那條線就是所謂的循環遞歸,同時那個圈圈連接線也多了個一個參數W。 還是先看一下RNN的展開圖,比較容易理解:
我們直接看,上面展開圖中,O t 的計算流程,看到隱藏層神經元s t 的輸入包含了兩個:來時x t 的輸入、來自s t-1 的輸入。于是RNN,t時刻的計算公式如下:
(1)t時刻,隱藏層神經元的激活值為:
s t =f(u*x t +w*s t-1 + b1)
(2)t時刻,輸出層的激活值為:
o t =f(v*s t +b2)
是不是感覺上面的公式,跟一開始給出的MLP,公式上就差那么一點點。僅僅只是上面的st計算的時候,在函數f變量計算的時候,多個一個w*s
t-1。
二、源碼實現
下面結合代碼,了解代碼層面的RNN實現:
[python] ?view plaincopy
?? ? ? ? ? ?? ?? import ?numpy?as?np?? import ?codecs?? ?? data?=?open('text.txt' ,? 'r' ).read()? ?? chars?=?list(set(data))?? print ?chars?? ?? data_size,?vocab_size?=?len(data),?len(chars)?? print ? 'data?has?%d?characters,?%d?unique.' ?%?(data_size,?vocab_size)?? ?? char_to_ix?=?{?ch:i?for ?i,ch? in ?enumerate(chars)?}?? ix_to_char?=?{?i:ch?for ?i,ch? in ?enumerate(chars)?}?? print ?char_to_ix?? hidden_size?=?100 ? ?? seq_length?=?20 ? ?? learning_rate?=?1e - 1 ?? ?? ?? Wxh?=?np.random.randn(hidden_size,?vocab_size)*0.01 ? ?? Whh?=?np.random.randn(hidden_size,?hidden_size)*0.01 ? ?? Why?=?np.random.randn(vocab_size,?hidden_size)*0.01 ? ?? bh?=?np.zeros((hidden_size,?1 ))? ?? by?=?np.zeros((vocab_size,?1 ))? ?? ?? ?? ?? def ?lossFun(inputs,?targets,?hprev):?? ?? ??xs,?hs,?ys,?ps?=?{},?{},?{},?{}?? ??hs[-1 ]?=?np.copy(hprev)?? ??loss?=?0 ?? ???? ??for ?t? in ?xrange(len(inputs)):?? ????xs[t]?=?np.zeros((vocab_size,1 ))? ?? ????xs[t][inputs[t]]?=?1 ?? ????hs[t]?=?np.tanh(np.dot(Wxh,?xs[t])?+?np.dot(Whh,?hs[t-1 ])?+?bh)? ?? ????ys[t]?=?np.dot(Why,?hs[t])?+?by??? ????ps[t]?=?np.exp(ys[t])?/?np.sum(np.exp(ys[t]))??? ????loss?+=?-np.log(ps[t][targets[t],0 ])? ?? ???? ??dWxh,?dWhh,?dWhy?=?np.zeros_like(Wxh),?np.zeros_like(Whh),?np.zeros_like(Why)?? ??dbh,?dby?=?np.zeros_like(bh),?np.zeros_like(by)?? ??dhnext?=?np.zeros_like(hs[0 ])?? ??for ?t? in ?reversed(xrange(len(inputs))):?? ????dy?=?np.copy(ps[t])?? ????dy[targets[t]]?-=?1 ? ?? ????dWhy?+=?np.dot(dy,?hs[t].T)?? ????dby?+=?dy?? ????dh?=?np.dot(Why.T,?dy)?+?dhnext??? ????dhraw?=?(1 ?-?hs[t]?*?hs[t])?*?dh? ?? ????dbh?+=?dhraw?? ????dWxh?+=?np.dot(dhraw,?xs[t].T)?? ????dWhh?+=?np.dot(dhraw,?hs[t-1 ].T)?? ????dhnext?=?np.dot(Whh.T,?dhraw)?? ??for ?dparam? in ?[dWxh,?dWhh,?dWhy,?dbh,?dby]:?? ????np.clip(dparam,?-5 ,? 5 ,?out=dparam)? ?? ??return ?loss,?dWxh,?dWhh,?dWhy,?dbh,?dby,?hs[len(inputs)- 1 ]?? ?? def ?sample(h,?seed_ix,?n):?? ?? ??x?=?np.zeros((vocab_size,?1 ))?? ??x[seed_ix]?=?1 ?? ??ixes?=?[]?? ??for ?t? in ?xrange(n):?? ????h?=?np.tanh(np.dot(Wxh,?x)?+?np.dot(Whh,?h)?+?bh)?? ????y?=?np.dot(Why,?h)?+?by?? ????p?=?np.exp(y)?/?np.sum(np.exp(y))?? ????ix?=?np.random.choice(range(vocab_size),?p=p.ravel())?? ????x?=?np.zeros((vocab_size,?1 )) ?? ????x[ix]?=?1 ?? ????ixes.append(ix)?? ??return ?ixes?? ?? n,?p?=?0 ,? 0 ?? mWxh,?mWhh,?mWhy?=?np.zeros_like(Wxh),?np.zeros_like(Whh),?np.zeros_like(Why)?? mbh,?mby?=?np.zeros_like(bh),?np.zeros_like(by)??? smooth_loss?=?-np.log(1.0 /vocab_size)*seq_length? ?? ?? while ?n< 20000 :?? ???? ??if ?p+seq_length+ 1 ?>=?len(data)? or ?n?==? 0 :??? ????hprev?=?np.zeros((hidden_size,1 ))? ?? ????p?=?0 ? ?? ???? ??inputs?=?[char_to_ix[ch]?for ?ch? in ?data[p:p+seq_length]]?? ??targets?=?[char_to_ix[ch]?for ?ch? in ?data[p+ 1 :p+seq_length+ 1 ]]?? ?? ???? ??if ?n?%? 1000 ?==? 0 :?? ????sample_ix?=?sample(hprev,?inputs[0 ],? 200 )?? ????txt?=?'' .join(ix_to_char[ix]? for ?ix? in ?sample_ix)?? ????print ? '----\n?%s?\n----' ?%?(txt,?)?? ?? ???? ??loss,?dWxh,?dWhh,?dWhy,?dbh,?dby,?hprev?=?lossFun(inputs,?targets,?hprev)?? ??smooth_loss?=?smooth_loss?*?0.999 ?+?loss?*? 0.001 ?? ??if ?n?%? 100 ?==? 0 :? print ? 'iter?%d,?loss:?%f' ?%?(n,?smooth_loss)? ?? ???? ???? ??for ?param,?dparam,?mem? in ?zip([Wxh,?Whh,?Why,?bh,?by],??? ????????????????????????????????[dWxh,?dWhh,?dWhy,?dbh,?dby],??? ????????????????????????????????[mWxh,?mWhh,?mWhy,?mbh,?mby]):?? ????mem?+=?dparam?*?dparam?? ????param?+=?-learning_rate?*?dparam?/?np.sqrt(mem?+?1e - 8 )? ?? ??p?+=?seq_length??? ??n?+=?1 ? ??
參考文獻:
1、http://www.wildml.com/2015/09/recurrent-neural-networks-tutorial-part-1-introduction-to-rnns/
2、http://blog.csdn.net/danieljianfeng/article/details/42931721
3、聲明:上面的源碼例子是從github下載的,具體忘了是從哪個作者,非商業用途,僅供學習參考,如有侵權請聯系博主刪除
**********************作者:hjimce ? 時間:2015.10.23 ?聯系QQ:1393852684 ? 地址:http://blog.csdn.net/hjimce? ?原創文章,版權所有,轉載請保留本行信息(不允許刪除)
總結
以上是生活随笔 為你收集整理的深度学习(十一)RNN入门学习 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。