1. 程式人生 > >訓練神經網路的簡單例子(TensorFlow平臺下Python實現)

訓練神經網路的簡單例子(TensorFlow平臺下Python實現)

本篇文章主要通過一個簡單的例子來實現神經網路。訓練資料是隨機產生的模擬資料集,解決二分類問題。

下面我們首先說一下,訓練神經網路的一般過程:

1.定義神經網路的結構和前向傳播的輸出結果

2.定義損失函式以及反向傳播優化的演算法

3.生成會話(Session)並且在訓練資料上反覆執行反向傳播優化演算法

要記住的一點是,無論神經網路的結構如何變化,以上三個步驟是不會改變的。

    完整程式碼如下:

import tensorflow as tf
#匯入TensorFlow工具包並簡稱為tf

from numpy.random import RandomState
#匯入numpy工具包,生成模擬資料集

batch_size = 8
#定義訓練資料batch的大小

w1 = tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))
w2 = tf.Variable(tf.random_normal([3,1],stddev=1,seed=1))
#分別定義一二層和二三層之間的網路引數,標準差為1,隨機產生的數保持一致

x = tf.placeholder(tf.float32,shape=(None,2),name='x-input')
y_ = tf.placeholder(tf.float32,shape=(None,1),name='y-input')
#輸入為兩個維度,即兩個特徵,輸出為一個標籤,宣告資料型別float32,None即一個batch大小
#y_是真實的標籤

a = tf.matmul(x,w1)
y = tf.matmul(a,w2)
#定義神經網路前向傳播過程

cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y,1e-10,1.0)))
train_step = tf.train.AdamOptimizer(0.001).minimize(cross_entropy)
#定義損失函式和反向傳播演算法

rdm = RandomState(1)
dataset_size = 128
#產生128組資料
X = rdm.rand(dataset_size,2)
Y = [[int(x1+x2 < 1)] for (x1,x2) in X]
#將所有x1+x2<1的樣本視為正樣本,表示為1;其餘為0

#建立會話來執行TensorFlow程式
with tf.Session() as sess:
    init_op = tf.global_variables_initializer()
    #初始化變數
    sess.run(init_op)

    print(sess.run(w1))
    print(sess.run(w2))
    #打印出訓練網路之前網路引數的值

    STEPS = 5000
    #設定訓練的輪數
    for i in range(STEPS):
        start = (i * batch_size) % dataset_size
        end = min(start+batch_size,dataset_size)
	#每次選取batch_size個樣本進行訓練
    
        sess.run(train_step,feed_dict={x:X[start:end],y_:Y[start:end]})
	#通過選取的樣本訓練神經網路並更新引數
    
        if i%1000 == 0:
            total_cross_entropy = sess.run(cross_entropy,feed_dict={x:X,y_:Y})
            print("After %d training step(s),cross entropy on all data is %g" % (i,total_cross_entropy))
	#每隔一段時間計算在所有資料上的交叉熵並輸出,隨著訓練的進行,交叉熵逐漸變小

    print(sess.run(w1))
    print(sess.run(w2))
    #打印出訓練之後神經網路引數的值

執行結果如下:


結果說明:

首先是打印出訓練之前的網路引數,也就是隨機產生的引數值,然後將訓練過程中每隔1000次的交叉熵輸出,發現交叉熵在逐漸減小,說明分類的效能在變好。最後是訓練網路結束後網路的引數。

分享一個圖形化神經網路訓練過程的網站:點這裡,可以自己定義網路引數的大小,層數以及學習速率的大小,並且訓練過程會以很直觀的形式展示出來。比如:


                                                                  

以上對於神經網路訓練過程可以有一個很深刻的理解。

最後,再補充一些TensorFlow相關的知識:

1.TensorFlow計算模型-計算圖
       Tensor表示張量,可以簡單的理解為多維資料結構;Flow則體現了它的計算模型。Flow翻譯過來是“流”,它直觀地表達了張量之間通過計算相互轉換的過程。TensorFlow中的每一個計算都是計算圖上的一個節點,而節點之間的邊描述了計算之間的依賴關係。

指定GPU方法,命令如下:
import tensorflow as tf
a = tf.constant([1.0,2.0],name=“a”)
b = tf.constant([3.0,4.0],name=“b”)
g = tf.Graph()
with g.device(/gpu:0):
result = a + b
sess = tf.Session()
sess.run(result)

2.TensorFlow資料模型-張量
      張量是管理資料的形式。零階張量表示標量,第一階張量為向量,也就是一維陣列,一般來說,第n階張量可以理解為一個n維陣列。張量本身不儲存運算的結果,它只是得到對結果的一個引用。可以使用tf.Session().run(result)語句來得到計算結果。


3.TensorFlow執行模型-會話
      我們使用session來執行定義好的運算。
      主要有以下兩種方式,第一種會產生記憶體洩漏,第二種不會有這種問題。
#建立一個會話
sess = tf.Session()
sess.run(…)
#關閉會話使得本次執行中使用的資源得到釋放
sess.close()
    
      第二種方式是通過Python的上下文資源管理器來使用會話。
with tf.Session() as sess:
sess.run(…)
此種方式自動關閉和自動進行資源的釋放


4.TensorFlow-神經網路例子
使用神經網路解決分類問題可以分為以下四個步驟:
①提取問題中實體的特徵向量作為輸入。
②定義神經網路的結構,並定義如何從神經網路的輸入得到輸出。這個過程就是神經網路的前向傳播演算法。
③通過訓練資料來調整神經網路中引數的設定,這就是訓練網路的過程。
④使用訓練好的神經網路來預測未知的資料
 
      在TensorFlow中宣告一個2*3的矩陣變數的方法:
weight = tf.Variable(tf.random_normal([2,3],stddev=2))
      即表示為方差為0、標準差為2的正態分佈


    在TensorFlow中,一個變數的值在被使用之前,這個變數的初始化過程需要被明確呼叫。一下子初始化所有的變數
sess = tf.Session()
init_op = tf.initialize_all_variables()
或者換成init_op = tf.global_variables_initializer()也可
sess.run(init_op)