1. 程式人生 > >Tensorflow實戰-完整神經網路樣例

Tensorflow實戰-完整神經網路樣例

import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

#Numpy是一個科學計算的工具包,這裡通過Numpy工具包生成模擬資料集,也可以從已有的檔案中匯入資料
from numpy.random import  RandomState

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

#定義神經網路的引數,這裡還是沿用上一篇博文中給出的神經網路結構。
w1 = tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))
w2 = tf.Variable(tf.random_normal([3,1],stddev=1,seed=1))

#在shape的一個維度上使用None可以方便使用不同的batch大小。在訓練時需要把資料分
#成比較小的batch,但是在測試時,可以一次性使用全部的資料。當資料集比較小時這樣比較
#方便測試,當資料集比較大時,將大量資料放入一個batch可能會導致記憶體溢位。
x = tf.placeholder(tf.float32,shape=(None,2),name='x-input')
y_ = tf.placeholder(tf.float32,shape=(None),name='y-input')

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

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

#通過隨機數生成一個模擬資料集。
rdm = RandomState(1)
dataset_size = 128
X = rdm.rand(dataset_size,2)
#定義規則來給出樣本的標籤。在這裡所有x1+x2<1的樣本都被認為是正樣本(比如零件合格),
#而其他為負樣本(比如零件不合格)。和TensorFlow遊樂場中的表示法不大一樣的地方是,
#在這裡使用0來表示負樣本,1來表示正樣本。大部分解決分類問題的神經網路都會採用
#0和1的表示方法。
Y = [[int(x1+x2 < 1) for (x1,x2) in X]]

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

    print (sess.run(w1))
    print (sess.run(w2))
    '''
    在訓練之前神經網路引數的值;
    w1 = [[-0.81131882,1.48459876,0.06532937]
            [-2.44270396,0.0992484,0.59122431]]
    w2 = [[-0.81131822],[1.48459876],[0.06532937]]
    '''

    #設定訓練輪數。
    STEPS = 5000
    for i in range(STEPS):
        #每次選取batch_size個樣本進行訓練。
        start = (i * batch_size) % dataset_size
        end = min(start+batch_size,dataset_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))
        '''
        輸出結果:
        After 0 training step(s),cross entropy on all data is 0.266366
        After 1000 training step(s),cross entropy on all data is 0.152499
        After 2000 training step(s),cross entropy on all data is 0.0942591
        After 3000 training step(s),cross entropy on all data is 0.0633092
        After 4000 training step(s),cross entropy on all data is 0.044765
        
        通過這個結果可以發現隨著訓練的進行,交叉熵是逐漸變小的。交叉熵越小說明預測的結果和真實的結果差距越小。
        '''

    print (sess.run(w1))
    print (sess.run(w2))
    '''
    在訓練之後神經網路引數的值:
    w1 = [[-1.748612    2.3798532   1.3092258 ]
            [-3.3741107   0.99000514  1.8207425 ]]
    w2 = [  [-1.6792505]
            [ 2.474878 ]
            [ 1.1113052]]
    
    可以發現這兩個引數的取值已經發生了變化,這個變化就是訓練的結果。
    它使得這個神經網路能更好地你和提供的訓練資料。
    '''

 TensofFlow提供了placeholder機制用於提供輸入資料,placeholder相當於定義了一個位置,這個位置中的資料在程式執行時再指定。這樣在程式中就不需要生成大量常量來提供輸入資料,而只需要將資料通過placeholder傳入TensofFlow計算圖。