人工智慧-建立第一個神經網路

在前四章,第一章介紹了”什麼是神經網路”,讓我們對神經網路有一個概略的觀念,在第二章介紹了神經網路所使用的優化函數(梯度下降法),而”梯度下降法”是在深度學習中主要使用的優化函數,這部分也讓我們了解梯度下降法的初步原理。而在第三、四章,介紹了如何使用anacoda和tensorflow這兩個軟體,來撰寫神經網路基本程式,也簡單的介紹了幾個常用的程式語法。接下來讓我們來看看,如何建立一個神經網路吧! 走~~~~跟我們一起看下去。


在Tensorflow裡定義一個增加層的函數可以很容易的增加神經層,為之後的增加省下大量時間。神經層裡常見的參數通常有weights,biases和激勵函數(activation function)。首先,我們需要import tensorflow模塊。

                                                                                                                                                                                  
                                                                                                                                                                                      圖1 import tensorflow
然後定義增加神經層的函數def add_layer(),它有四個參數:輸入值,輸入的大小,輸出的大小和激勵函數(activation function),我們設定為的激勵函數(activation function)是None(代表線性函數)。
                                                                                                                                                   
                                                                                                                                                                                      圖2 增加神經層的函數 

接下來,我們開始定義weights和biases。 因為在產生初始參數時,隨機變數(正態分佈)會比總為0要好很多,所以我們這裡的weights為一個in_size行,out_size列的隨機變數矩陣。
                                                                                                                                                         
                                                                                                                                                                                      圖3 定義Weights變數
 
在機器學習中,biases的推薦值不為0,所以我們這裡是在0向量的基礎上又加了0.1。
                                                                                                                                                                
                                                                                                                                                                                      圖4 定義biases變數
下面,我們定義Wx_plus_b,即神經網路未激活的值。其中,tf.matmul()是矩陣的乘法。
                                                                                                                                                               
                                                                                                                                                                                      圖5 定義Wx_plus_b變數

當activation_function——激勵函數為None時,輸出就是當前的預測值——Wx_plus_b,不為None時,就把Wx_plus_b傳到activation_function()函數中得到輸出
                                                                                                                                                              
                                                                                                                                                                           圖6 定義激勵函數(activation function)

最後,返回輸出,增加一個神經層的函數——def add_layer()就定義好了。再來,我們import 建立矩陣資料所需的模塊。
                                                                                                                                                                                  
                                                                                                                                                                                      圖7 建立矩陣資料模塊

建構所需要的資料,這裡的x_data和y_data並不是嚴格的一元二次函數的關係,因為我們多加了一個Noise(將資料點建立在一元二次曲線的附近),這樣看起來會更像真實情況。
                                                                                                                                                 
                                                                                                                                                                                            圖8 建立資料曲線

利用佔位符(placeholder)定義我們所需的神經網絡的輸入。 tf.placeholder()就是代表佔位符,這裡的None代表無論輸入有多少都可以,因為輸入只有一個特徵,所以這裡是1。
                                                                                                                                                                       
                                                                                                                                                                                      圖9 定義神經網路的輸入


接下來,我們就可以開始定義神經層了。通常神經層都包括輸入層、隱藏層和輸出層。這裡的輸入層只有一個屬性, 所以我們就只有一個輸入;隱藏層我們可以自己假設,這裡我們假設隱藏層有10個神經元; 輸出層和輸入層的結構是一樣的,所以我們的輸出層也是只有一層。所以,我們建構的是——輸入層1個、隱藏層10個、輸出層1個的神經網絡。
       
下面,我們開始定義隱藏層,利用之前的add_layer()函數,這裡使用 Tensorflow 自帶的激勵函數tf.nn.relu。

                                                                                                                                                           
                                                                                                                                                                                            圖10 定義隱藏層

再來,我們定義輸出層。此時的輸入就是隱藏層的輸出——l1,輸入有10層(隱藏層的輸出層),輸出有1層。
                                                                                                                                                       
                                                                                                                                                                                            圖11 定義輸出層

再建立誤差變數,計算預測值prediction和真實值的誤差,對二者差的平方求和再取平均。
                                                                                                                                                   
                                                                                                                                                                                           圖12 建立誤差變數

接下來,是很關鍵的一步,如何讓機器學習提升它的準確率。 tf.train.GradientDescentOptimizer()中的值通常都小於1,這裡取的是0.1,代表以0.1的效率來最小化誤差loss。
                                                                                                                                                 
                                                                                                                                                                                           圖13 建立學習函數

使用變數時,都要對它進行初始化,這是必不可少的。
                                                                                                                                                                           
                                                                                                                                                                                        圖14 定義初始化變數

定義Session,並用Session 來執行 init 初始化步驟。 (注意:在tensorflow中,只有session.run()才會執行我們定義的運算。)
                                                                                                                                                                                     
                                                                                                                                                                                       圖15 執行初始化變數

我們讓機器開始學習,比如這裡,我們讓機器學習1000次。機器學習的內容是train_step,用Session來run每一次training 的數據,逐步提升神經網絡的預測準確性。 (注意:當運算要用到placeholder時,就需要feed_dict這個字典來指定輸入。)
                                                                                                                                                     
                                                                                                                                                                                            圖16 執行訓練
每50步我們輸出一下機器學習的誤差。
                                                                                                                                                    
                                                                                                                                                                                           圖17 列印誤差值

在電腦上運行本次代碼的結果為:
                                                                                                                                               
                                                                                                                                                                                    圖18 執行結果
通過上圖可以看出,誤差在逐漸減小,這表示機器學習是有積極的效果的。



 

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論