1. 程式人生 > >tensorflow入門(簡單神經網路實現)

tensorflow入門(簡單神經網路實現)

tensorflow 詳細的介紹可以看極客學院的tensorflow的官網:

http://wiki.jikexueyuan.com/project/tensorflow-zh/get_started/introduction.html

官網上講解的比較清楚。。。

這裡採用一個簡單的神經網路的實現,來對tensorflow基本語法進行介紹,同時也想讓大家對用tensorflow實現神經網路有個基本的瞭解。

神經網路模式:

輸入層:2個節點,輸入兩個資料

隱藏層:一層,3個節點

輸出層:1個節點

注意:這裡的節點均包括了0節點。

python程式碼實現:(程式碼中有詳細註釋,語法的使用從例項中觀察)

# coding:utf-8
import tensorflow as tf
from numpy.random import RandomState

#BATCH_SIZE這是定義的一個數量,即一次訓練模型,投入的樣例數,按理說應該是一次投入所有訓練資料的
#但是實際操作中一次投入太多資料,會導致電腦宕機,因此只好對投入樣例數,進行限制
BATCH_SIZE=8
#生成模擬資料
#randomState 函式中數字1,相當於一個seed種子,每次產生的隨機數都是相同的
rdm=RandomState(1)
#產生一個128行×2列的隨機矩陣
X=rdm.rand(128,2)
#產生一個布林型結果矩陣128×1
Y=[[int(x0+x1)<1] for(x0,x1)in X]

#定義神經網路的常量,引數,輸入節點,輸出節點,以及前向傳播過程
#Variable定義一個變數,需要呼叫初始化,才能產生值
#random_normal 產生一個正太隨機矩陣,shape=[2,3],stddev是正太分佈的標準差,seed隨機數種子,設定後每次產生的數字都相同
w1=tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))
w2=tf.Variable(tf.random_normal([3,1],stddev=1,seed=1))

#placeholder佔位符,執行時,在通過feed_dict將值傳入,dtype:資料型別,shape:資料形狀,name:名稱
#如果在定義佔位符時,不能確定值的形狀時,用None表示
x=tf.placeholder(tf.float32,shape=(None,2),name="x-input")
y_=tf.placeholder(tf.float32,shape=(None,1),name="y-input")

#前向傳播的過程
#matmul就是矩陣相乘
a=tf.matmul(x,w1)
y=tf.matmul(a,w2)

#定義損失函式及反向傳播演算法
#cross_entropy是交叉熵
#tf.clip_by_value(A, min, max):輸入一個張量A,把A中的每一個元素的值都壓縮在min和max之間。小於min的讓它等於min,大於max的元素的值等於max
cross_entropy=-tf.reduce_mean(y_*tf.log(tf.clip_by_value(y,1e-10,1.0)))
#train_step 就是每次可訓練出一組w就是一次反向傳播
#下面給出裡三種反向傳播的演算法傳入的是學習率
train_step=tf.train.AdamOptimizer(0.001).minimize(cross_entropy)
#train_step=tf.train.GradientDescentOptimizer(0.001).minimize(cross_entropy)
#train_step=tf.train.MomentumOptimizer(0.001,0.9).minimize(cross_entropy)

#建立一個會話來執行Tensorflow程式,反覆執行反向傳播
#tf中執行必須放在session物件中,且執行過後,要關閉session
with tf.Session()as sess:
    #初始化變數,也就是上面的Variable變數
    init_op=tf.initialize_all_variables()
    sess.run(init_op)
    # 輸出目前(未經訓練)的引數取值
    #這裡為何還要使用sess.run(w1)來進行操作?
    #因為此時w1還是個變數,是個物件,直接打印出來是物件的地址
    print "w1:\n",sess.run(w1)
    print "w2:\n",sess.run(w2)
    print "\n"

    #訓練模型
    #訓練步數
    STEPS=5000
    for i in range(STEPS):
        start=(i*BATCH_SIZE)%128
        end=(i*BATCH_SIZE)%128+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 steps,cross entropy on all data is %g" % (i,total_cross_entropy))
    #輸出訓練後的引數模型
    print "\n"
    print "w1:\n",sess.run(w1)
    print "w2:\n",sess.run(w2)

輸出的結果:

w1:
[[-0.81131822  1.48459876  0.06532937]
 [-2.44270396  0.0992484   0.59122431]]
w2:
[[-0.81131822]
 [ 1.48459876]
 [ 0.06532937]]


After 0 training steps,cross entropy on all data is 0.0674925
After 1000 training steps,cross entropy on all data is 0.0163385
After 2000 training steps,cross entropy on all data is 0.00907547
After 3000 training steps,cross entropy on all data is 0.00714436
After 4000 training steps,cross entropy on all data is 0.00578471


w1:
[[-1.9618274   2.58235407  1.68203783]
 [-3.4681716   1.06982327  2.11788988]]
w2:
[[-1.8247149 ]
 [ 2.68546653]
 [ 1.41819501]]