如何用40行代碼寫出一個神經網路?

大家好,很高興又可以和大家進行一些學習,這幾天我在學習使用TensorFlow的過程中對如何使用TensorFlow進行簡單神經網路的設定進行了一些研究,所以今天我想用一篇文章的形式來簡單的概括下我所使用的方法.

1:什麼是神經網路?

對於什麼是神經網路這個問題,有的時候機器學習的方式和我們人類相類似,或者說機器學習的神經網路模型就是根據人類的大腦的已知結構所研究發明的,對於神經網路的詳細的研究說明,我在我以前的文章中已經詳細的闡述了什麼是神經網路,現在在這裡就不再贅述.

現在回到我們構建神經網路的的這個層面上來,當我們擁有理論層的時候,就是時候用代碼將其呈現出來了,現在我以TensorFlow為例,來解釋出這個項目的使用以及具體的代碼.

1:添加神經層函數

在TensorFlow中定義一個添加層的函數很容易就可以將其添加為神經網路,添加為神經網路以後我們其實就可以省下很多的時間來去構建我們的層數設計.

在神經層中常見的參數有weights,biases,以及激勵函數等等.

首先第一步,我們先要導入我們的TensorFlow的模塊.

然後我們就應該定義我們的神經層函數了,def add_layer(),在這個函數當中,其中包括了四個小的函數,包括輸入值,輸入的大小,輸出的大小以及激勵函數,現在的時候,我們默認的激勵函數是None

接下來的下一步,我們就可以定義我們之前所說的weights和biases等神經網路參數了.

因為在生成剛開始的初始參數的時候,隨機變數生成的數值會比全部都為0要好很多,所以在這個時候,我們定義weights為一個in_size行,out_size列的變數矩陣

因為在機器學習中,我們如果實踐多了會發現biases的值通常都是不推薦使用0的,但是具體為什麼這麼做,我現在還不太理解,所以就先在原有的0的基礎上選擇了增加0.1,當然這個值可以任意取值,但是不宜取值過大,否則會造成模型的損失程度增大.

下面,我們來繼續定義Wx_push_b,這個函數的定義可以理解為神經網路未激活的值,其中的tf.matmul()是矩陣的乘法:

這個時候,當activation_function,即激勵函數為None的時候,輸出的h值就是當前預測的值—wx_plus_b,當不為None的時候,我們就把Wx_plus_b傳到activation_function()函數中得到輸出.

最後,返回一個輸出值,添加一個神經層函數———def add_layer()就可以定義好了

接下來呢,我們完成了上述的構造一個簡單的神經層以後,讓我們完善起立建立起這個簡單的完整的神經網路,其中我們希望裡邊包含有神經網路的基本的東西,比如添加神經層,計算誤差,訓練步驟,以及在進行步數運算以後判斷是否仍然在學習,這個時候我們就需要在頭文件中導入我們numpy包:

因為在這個時候,我們現在所使用的x_data和y_data其實並沒有什麼嚴格的一元二次的函數關係,所以我們現在在這裡加一個noise,使得盡量的使x和y是一元二次關係,盡量的看起來是真實的情況.

對於輸入的問題,這個時候我們一般是利用佔位符來定義我們所需的神經網路的輸入.tf.placeholder()就是代表著佔位符,這裡的None其實就是代表著無論輸入多少都可以.因為這裡只有一個特徵,就是1

接下來,我們就可以開始定義神經層了,通常情況下,神經層都是包括輸入層,隱藏層和輸出層.因為我們這裡是一個簡單的神經網路.這裡的輸入層也只有一個屬性,所以我們就只有一個輸入;隱藏層我們也可以自己進行假設.這裡我們假設我們的隱藏層有10個神經元.輸入層和輸出層的結構是一樣的,所以我們的輸出層也只有一層,這樣我們就構建了一個——1個輸入層,10個隱藏層,1個輸出層的神經網路.

下面,我們開始自定義我們的隱藏層,這時候我們可以利用我們之前的add_layer(0函數,或者使用TensorFlow中自帶的激勵函數tf.nnrelu.

接著開始定義輸出層,這個時候的輸入就是隱藏層的輸出——L1,輸入有10層,輸出的有一層.

現在再計算預測值和真實值的差距,對兩者的差的平方求和再取平均

接下來,這個是很好關鍵的一部,如何讓神經網路進行學習來提升他的準確率,這裡使用的是tf.train.GradientDescentOptimizer().在上邊的那個函數中通常的值都是小於1的,所以我們這裡取得值是0.1,用0.1來表示最小化的誤差loss.

在使用變數的時候進行初始化,這是必不可少的.然後定義一個session,並且用session來執行init初始化步驟,

現在,讓機器來進行學習:

比如在這裡,我們先讓機器學習10000次,機器學習的是train_step,用session來run每一次training的數據,逐步提升神經網路的預測準確性,並且讓我們每50步來輸出一下神經網路的預測準確性.

實踐證明,效果還是蠻不錯的,符合我的預期要求,所以,我們的第一個檢驗神經網路就這樣構成啦,繼續加油吧.

代碼如下:1507848924/hello-world

推薦閱讀:

機器學習 | 更進一步,用評估器給花卉分類
如何評價Sony新出的深度學習庫NNabla?
執行tf.convert_to_tensor()時,究竟發生了什麼?
TF Boys (TensorFlow Boys ) 養成記(一):TensorFlow 基本操作

TAG:机器学习 | 深度学习DeepLearning | TensorFlow |