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]]
[原文鏈接](https://blog.csdn.net/NFMSR/article/details/78236508)