基於RNN的加法運算器 從零實現迴圈神經網路

2021-09-24 23:48:04 字數 3617 閱讀 6689

本文以乙個簡單的rnn為例,訓練乙個可以做二進位制加法的迴圈神經網路.

準備了乙個二進位制加法的資料集.其資料範圍是0-255,即最大值為28−

1=2552^8-1 = 255

28−1=2

55. 正數的加法如下,比如 c = a + b = 1 + 2 = 3; 對應到二進位制的加法如下:a=[

00000001];

b=[00000010];

c=[00000011

]a = [ 0 0 0 0 0 0 0 1]; b = [0 0 0 0 0 0 1 0]; c =[ 0 0 0 0 0 0 1 1]

a=[000

0000

1];b

=[00

0000

10];

c=[0

0000

011]

. 根據我們的經驗,二進位制加法和的位置t的值其實不僅依賴於a與b在t位置的值,還依賴於前幾位的情況,如t-1, t-2…因此理論上來看,卷積神經網路應該可以很好地處理這種場景,我們的目標就是輸入a,b,得到c(均為二進位制).

**:執行cal_generate_data, 可以生成資料.生成的資料結構,使用pickle,將其序列化為二進位制,使用的時候將其調出即可使用(類似matlab下的.mat)

one-hot向量表示法.這裡需要注意的是,我們的神經網路在輸入時,單個時間步的輸入其實是[0,0],是乙個2*1的向量,詞典中不同的字元個數為2(即不同的字元只有0, 1,因此詞典大小為2)

隱藏單元個數,隱藏單元個數是乙個超引數,超引數是在在機器學習中,需要提前定義的引數,而不是通過學習得到的引數.這裡,我們將該超引數設定為16.

輸入.輸入的個數是由詞典的維度決定的,這裡我們的維度為2,因此輸入為2*1.

輸出.同輸入,輸出的個數也是由詞典的維度決定的,這裡為2*1

根據輸入輸出以及隱含單元,我們就可以確定網路結構如下:

歷史狀態值st: 16 ×

\times

× 1變數權重值u 16 ×

\times

× 2歷史權重值w16 ×

\times

× 16

輸出權重值v2 ×

隱含狀態的儲存.為了方便多個時間步資訊的儲存,我們將uvw儲存在model這個類中. 將計算出來的歷史狀態資訊,即每一層的資訊,儲存在layers類中,在該例中,我們應該有8個時間步,儲存8個layer的資訊.

predict函式.predict的過程,就是輸入乙個8*2的x,得到乙個8*1的標籤.在每乙個時間步上,進行前向傳播.然後將結果分類為0-1.通過如下:argmax(output.predict(layer.mulv));維度變化:21–>21–>1;其中,output.predict使用exp指數函式把數值對映到正數空間,然後對其歸一化.

首先使用predict函式,得到0|1的概率. 即0|1的概率分別為:probs=0.4|0.6.

假設此時標籤為y=1, 那麼loss = -np.log(0.6); 我們希望0.6越大越好.

生成測試集合:執行: cal_generate_data.訓練.然後測試.

2019-07-16 17:21:53: loss after num_examples_seen=0 epoch=0: 0.711610

2019-07-16 17:22:22: loss after num_examples_seen=20000 epoch=1: 0.056623

2019-07-16 17:22:51: loss after num_examples_seen=40000 epoch=2: 0.034568

2019-07-16 17:23:20: loss after num_examples_seen=60000 epoch=3: 0.031605

2019-07-16 17:23:49: loss after num_examples_seen=80000 epoch=4: 0.030482

2019-07-16 17:24:17: loss after num_examples_seen=100000 epoch=5: 0.029896

2019-07-16 17:25:04: loss after num_examples_seen=120000 epoch=6: 0.029538

2019-07-16 17:25:51: loss after num_examples_seen=140000 epoch=7: 0.029297

2019-07-16 17:26:37: loss after num_examples_seen=160000 epoch=8: 0.029123

2019-07-16 17:27:25: loss after num_examples_seen=180000 epoch=9: 0.028993

準確率 100%

2019-07-16 19:59:14: loss after num_examples_seen=0 epoch=0: 0.709881

2019-07-16 20:00:30: loss after num_examples_seen=20000 epoch=1: 0.658799

2019-07-16 20:01:50: loss after num_examples_seen=40000 epoch=2: 0.622423

2019-07-16 20:03:09: loss after num_examples_seen=60000 epoch=3: 0.617654

2019-07-16 20:03:39: loss after num_examples_seen=80000 epoch=4: 0.614902

2019-07-16 20:04:08: loss after num_examples_seen=100000 epoch=5: 0.612439

2019-07-16 20:04:38: loss after num_examples_seen=120000 epoch=6: 0.610115

2019-07-16 20:05:08: loss after num_examples_seen=140000 epoch=7: 0.608214

2019-07-16 20:05:37: loss after num_examples_seen=160000 epoch=8: 0.606709

2019-07-16 20:06:07: loss after num_examples_seen=180000 epoch=9: 0.605867

準確率84%

從該實驗可以看出,rnn的確是使用了歷史資訊,才使得模型比較準確.通過訓練學習到了二進位制加法的規則.從側面反應了如下論斷:

凡是結構化,規則化的任務,配合大量資料,使用深度學習方法要優於傳統方法

只要隱含層足夠大,神經網路可以模擬任何非線性函式

**:1: 乙個使用attention模型,在karas中視覺化訓練的模型

2: karas官方自帶的求和的例子: 

3:

算術運算導致溢位 CPU的控制器與運算器

計算機基礎方面的知識,對於一些非科班出身的同學來講,一直是他們心中的痛,而對於科班出身的同學,很多同學在工作之後,也意識到自身所學知識的不足與欠缺,想回頭補補基礎知識。關於計算機基礎的課程很多,內容繁雜,但無論是相關書籍還是大學課程,都有點脫離工作。特別地,計算機基礎知識體系龐雜,想要從零學習或者複...

4位快速加法器設計 基本加減法運算器設計

基本的算邏運算部件 全加器 輸入端3個 ai,bi 本位運算元ci 1 低位來的進製輸出端2個 si 本位和ci 本位向高位的進製2.序列加法器與並行加法器加法器有序列和並行之分。序列加法器中,只有乙個全加器,資料逐位序列送入加法器進行運算 並行加法器則由多個全加器組成,其位數的多少取決於機器的字長...

運算方法和運算器 資料與文字的表示方法

一 資料格式 1 進製裝換 十進位制轉二進位制 整數部分除2取余至餘數為0,小數部分乘2取整至小數為0 2 數值資料表示格式 1 定點數表示方法 小數點固定 分為有符號數和無符號數,對於有符號數來說,最高位為符號位,0正1負 目前計算機中採用定點數表示純整數,定點運算又被稱為整數運算 2 浮點數的表...