使用循環(huán)神經(jīng)網(wǎng)絡(luò)識別minist數(shù)據(jù)

RNN 循環(huán)神經(jīng)網(wǎng)絡(luò)的基本知識

其實(shí)循環(huán)神經(jīng)網(wǎng)絡(luò)我對了好久都沒有讀懂,之前還研究過源代碼,但是到后來沒有多久又忘記了。今天在我已經(jīng)非常熟悉CNN的情況下,我想再仔細(xì)研究一下RNN。

RNN網(wǎng)絡(luò)創(chuàng)建的目的

CNN算法是為了提取一個二維圖像里的特征,形成一個特征圖,送到下一級,由下一級多判斷使用。
我想RNN也是普通的神經(jīng)元,他的目的也是為了識別特征,并且把識別出來的特征傳輸?shù)较乱患墸┫乱患壸雠袛?。所以我們還是按照這個思慮來判斷吧。

為了借鑒CNN的信息,我們先看看和RNN網(wǎng)絡(luò)等價的網(wǎng)絡(luò)


看到這里的X0,X1,X2...Xn了嗎,其實(shí)和CNN 算法的輸入是一樣的,只不過CNN的輸入是按照二維來看待的,而RNN里輸入的數(shù)據(jù)是一位的。說到一維的我又想起來了全連接層,



在Layer L2中,共四個神經(jīng)元,每個神經(jīng)元同樣也是接受X1...Xn個輸入嗎?
所以在RNN中的一個Cell和普通的神經(jīng)元是一個意思,都是接收n個數(shù)據(jù)的輸入,然后在內(nèi)部與權(quán)重相乘求和之后,輸出給下一個層級的神經(jīng)元而已。

所以這里我開始劃重點(diǎn)了,在深度學(xué)習(xí)里,非常要看重的兩個概念是:
1、特征向量,就是一個實(shí)例的描述,比如一幅圖像(h,w)是一個實(shí)例,一句話也是一個實(shí)例,一個單詞也是一個實(shí)例,也叫作輸入信號。
2、神經(jīng)元,是基本的觸發(fā)單元,所謂的神經(jīng)元,就是你給他幾個輸入,和他胃口,他就給你觸發(fā)一個信號。當(dāng)然神經(jīng)元是可以串聯(lián)的,串聯(lián)起來的神經(jīng)元稱為神經(jīng)網(wǎng)絡(luò)。

那么我們看圖一的神經(jīng)元和圖二的神經(jīng)元,最大的不同是圖二是把一個實(shí)例的所有特征輸入給了一個神經(jīng)元,然后神經(jīng)元把觸發(fā)信號連接到下一個級。圖二里的神經(jīng)元,其實(shí)是一個神經(jīng)元,輸入的X0到Xn其實(shí)是串型進(jìn)入,而他的激勵信號剛好h0到hn也是串型輸出的。就是說給一個X0,他就有個h0輸出,再給個X1,他又有個h1輸出。而且神經(jīng)元的權(quán)重參數(shù)也是同一個。你看到的那種向右的箭頭,并不是輸出。

如果按照這個道理來說,那么RNN和普通的單輸入神經(jīng)元不就一樣了,當(dāng)然不可能一樣,最大的不同是什么?就是在RNN里,一個神經(jīng)元內(nèi)部可以保持狀態(tài)的。他的輸入和激勵就像是有一塊鐵皮接收別人的捶打,每次只能錘一拳頭,但是重復(fù)錘這個地方,影響也就能顯現(xiàn)出來了。就是說每次輸入一個X0,除了根據(jù)權(quán)重W進(jìn)行輸出之外,他還把當(dāng)前的狀態(tài)保存在內(nèi)部,下個輸入會對這個狀態(tài)會有影響。

而且每次來一個輸入會和輸出一起觸發(fā)神經(jīng)元,一起激發(fā)神經(jīng)元的輸出。

因此RNN稱作循環(huán)神經(jīng)網(wǎng)絡(luò),這個循環(huán)的意思就是他內(nèi)部的狀態(tài)是遞歸的,也就是前面的輸入影響到了輸出和內(nèi)部狀態(tài),也就影響到了后邊的輸出,也就是前面的輸出影響到了后邊的輸出。因此把循環(huán)神經(jīng)元改個更加形象的名字就是:串型輸入、遞歸影響的神經(jīng)元。

現(xiàn)在終于對循環(huán)神經(jīng)元有了基本理解了,首先是神經(jīng)元,他也可以接受X0到Xn個特征輸入,并且最終會有一個輸出hn,中間還有其它的輸出h0到hn-1,但是我們不關(guān)心,我們只需要知道有X0個輸入,有最終的一個輸出hn,當(dāng)然也可以跟觸發(fā)信號了。而且我們知道輸入X0和輸入Xn是有順序的,他們輸入的不同輸出的也不同。

這個很好理解,說:“我看到一只狗”和“狗看到一個我”表示起來意思不一樣的?!拔矣?0塊錢”和“10塊錢有我”也是不一樣的。

當(dāng)然在具體實(shí)現(xiàn)的時候輸入的維度并不能無限加深,我們總是在定義神經(jīng)元的時候就是確定了最大維度。下面我們開始進(jìn)行真正的實(shí)踐。

實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)

lstm_cell = tf.contrib.rnn.BasicLSTMCell(n_hidden_units, forget_bias=1.0, state_is_tuple=True)
這就定義了一個神經(jīng)元,n_hidden_units代表LSTM Cell個神經(jīng)元個數(shù),其實(shí)輸入一個單詞的維度,
outputs, final_state = tf.nn.dynamic_rnn(lstm_cell, X_in, time_major=False)
一篇文章的單詞的長度代表的是時序。當(dāng)time_major=False時,輸入數(shù)據(jù)x_in就是一篇文章,他的格式是(batch_size, time_steps, inputs_size)。

如果是在用在一幅圖像上,比如mnist的圖像(28,28),應(yīng)該怎么輸入到這個網(wǎng)絡(luò)里呢?LSTMCell的大小應(yīng)該是28,就是代表一個輸入數(shù)據(jù)的維度。dynamic_rnn的x_in輸入應(yīng)該是(batch_size, 28行, 28維)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容