日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

深度学习(十一)RNN入门学习

發布時間:2025/3/21 pytorch 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深度学习(十一)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的展開圖,比較容易理解:



我們直接看,上面展開圖中,Ot的計算流程,看到隱藏層神經元st的輸入包含了兩個:來時xt的輸入、來自st-1的輸入。于是RNN,t時刻的計算公式如下:

(1)t時刻,隱藏層神經元的激活值為:

st=f(u*xt+w*st-1+b1)

(2)t時刻,輸出層的激活值為:

ot=f(v*st+b2)

是不是感覺上面的公式,跟一開始給出的MLP,公式上就差那么一點點。僅僅只是上面的st計算的時候,在函數f變量計算的時候,多個一個w*s t-1。

二、源碼實現

下面結合代碼,了解代碼層面的RNN實現:

[python]?view plaincopy
  • #?-*-?coding:?utf-8?-*-??
  • """?
  • Created?on?Thu?Oct?08?17:36:23?2015?
  • ?
  • @author:?Administrator?
  • """??
  • ??
  • import?numpy?as?np??
  • import?codecs??
  • ??
  • data?=?open('text.txt',?'r').read()?#讀取txt一整個文件的內容為字符串str類型??
  • 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))?#輸出層偏置項??
  • #inputs??t時刻序列,也就是相當于輸入??
  • #targets?t+1時刻序列,也就是相當于輸出??
  • #hprev?t-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))?#把輸入編碼成0、1格式,在input中,為0代表此字符未激活??
  • ????xs[t][inputs[t]]?=?1??
  • ????hs[t]?=?np.tanh(np.dot(Wxh,?xs[t])?+?np.dot(Whh,?hs[t-1])?+?bh)?#?RNN的隱藏層神經元激活值計算??
  • ????ys[t]?=?np.dot(Why,?hs[t])?+?by?#?RNN的輸出??
  • ????ps[t]?=?np.exp(ys[t])?/?np.sum(np.exp(ys[t]))?#?概率歸一化??
  • ????loss?+=?-np.log(ps[t][targets[t],0])?#?softmax?損失函數??
  • ??#反向傳播??
  • ??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?#?backprop?into?y??
  • ????dWhy?+=?np.dot(dy,?hs[t].T)??
  • ????dby?+=?dy??
  • ????dh?=?np.dot(Why.T,?dy)?+?dhnext?#?backprop?into?h??
  • ????dhraw?=?(1?-?hs[t]?*?hs[t])?*?dh?#?backprop?through?tanh?nonlinearity??
  • ????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)?#?clip?to?mitigate?exploding?gradients??
  • ??return?loss,?dWxh,?dWhh,?dWhy,?dbh,?dby,?hs[len(inputs)-1]??
  • #預測函數,用于驗證,給定seed_ix為t=0時刻的字符索引,生成預測后面的n個字符??
  • 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)#h是遞歸更新的??
  • ????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)?#?memory?variables?for?Adagrad??
  • smooth_loss?=?-np.log(1.0/vocab_size)*seq_length?#?loss?at?iteration?0??
  • ??
  • while?n<20000:??
  • ??#n表示迭代網絡迭代訓練次數。當輸入是t=0時刻時,它前一時刻的隱藏層神經元的激活值我們設置為0??
  • ??if?p+seq_length+1?>=?len(data)?or?n?==?0:???
  • ????hprev?=?np.zeros((hidden_size,1))?#???
  • ????p?=?0?#?go?from?start?of?data??
  • ??#輸入與輸出??
  • ??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]]??
  • ??
  • ??#當迭代了1000次,??
  • ??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,?)??
  • ??
  • ??#?RNN前向傳導與反向傳播,獲取梯度值??
  • ??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)?#?print?progress??
  • ????
  • ??#?采用Adagrad自適應梯度下降法,可參看博文:http://blog.csdn.net/danieljianfeng/article/details/42931721??
  • ??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入门学习的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。