tensorflow 為何方聖物??
TensorFlow是谷歌基於DistBelief進行研發的第二代人工智慧學習系統,也就是說,整個系統,在google公司的很多應用場景是有效的,那其實對一般的企業來說,是很值得學習使用的。個人比較喜歡的原因在於:
- 基於python (python是世界上最好的語言)。
- 能夠生成顯示網路拓撲結構和性能的可視化圖 (酷)。
- 社區發展非常迅速並且活躍。(不會那麼容易死掉)。
TensorFlow 拆開來看, tensor flow,也就是說系統的設計理念跟張量和流有著莫大的關係。系統以有向圖來表示計算任務,節點通常代表數學運算,邊表示節點之間的某種聯繫,它負責傳輸多維數據(Tensors)。節點可以被分配到多個計算設備上,可以非同步和並行地執行操作。因為是有向圖,所以只有等到之前的所有的入度節點的計算狀態完成後,當前節點才能執行操作。
知道了以上原理以後,如何用代碼實現呢?我們來看看tensorflow的使用方式:
- 將計算流程表示成圖;
- 通過Sessions來執行圖計算;
- 將數據表示為tensors;
- 使用Variables來保持狀態信息;
- 分別使用feeds和fetches來填充數據和抓取任意的操作結果;
那我們先用tensorflow實現一個簡單的矩陣相乘吧:
import tensorflow as tfnn# 構造圖nmatrix1=tf.constant([[4,6,]])nmatrix2=tf.constant([[2],[8]])nproduct=tf.matmul(matrix1,matrix2)nn# 在會話裡面啟動圖nnsess=tf.Session()#啟動會話nresult=sess.run(product)nprint resultnsess.close()#關閉會話n
運行結果
[[ 56]]n
躍躍欲試的我,勵志要用tensorflow來實現簡單的線性回歸:
首先我們構造好數據:
import numpy as npnpoints=200ndata=[]nfor i in xrange(points):n x=np.random.normal(0.0,1.0)n y=x*0.2+0.1+np.random.normal(0.0,0.12)n data.append([x,y])nnx_data=[i[0] for i in data]ny_data=[i[1] for i in data]n
然後構造 tensorflow 中的圖:
W=tf.Variable(tf.random_uniform([1],-1.0,2.0))#變數nb=tf.Variable(tf.zeros([1]))#變數ny=W*x_data+b#線性模型nloss=tf.reduce_mean(tf.square(y-y_data))#損失函數nopentimizer=tf.train.GradientDescentOptimizer(0.2)#梯度下降方法ntrain=opentimizer.minimize(loss)#對loss使用梯度下降方法n
然後是在對話裡面啟動圖:
init=tf.initialize_all_variables()nsess=tf.Session()nsess.run(init)nfor step in xrange(10):n sess.run(train)n print (step,sess.run(W),sess.run(b))n print (step,sess.run(loss))n
運行結果:
(0, array([-0.21745068], dtype=float32), array([ 0.03338348], dtype=float32))n(0, 0.22034645)n(1, array([-0.02642272], dtype=float32), array([ 0.05309083], dtype=float32))n(1, 0.07767038)n(2, array([ 0.07806898], dtype=float32), array([ 0.06473869], dtype=float32))n(2, 0.034903441)n(3, array([ 0.13522482], dtype=float32), array([ 0.07163084], dtype=float32))n(3, 0.022080192)n(4, array([ 0.16648796], dtype=float32), array([ 0.07571331], dtype=float32))n(4, 0.01823386)n(5, array([ 0.18358801], dtype=float32), array([ 0.0781339], dtype=float32))n(5, 0.017079644)n(6, array([ 0.19294107], dtype=float32), array([ 0.07957046], dtype=float32))n(6, 0.016733103)n(7, array([ 0.19805673], dtype=float32), array([ 0.08042374], dtype=float32))n(7, 0.016628992)n(8, array([ 0.20085467], dtype=float32), array([ 0.08093099], dtype=float32))n(8, 0.016597692)n(9, array([ 0.20238495], dtype=float32), array([ 0.08123275], dtype=float32))n(9, 0.016588271)n
如果我們把每個階段的直線在坐標中畫出來,能更加直觀的看到參數的變化:
很神奇是不是,通過簡單的代碼編寫,可以看到模型在每個階段的輪廓,這是一個神奇的能力。
認真看以上代碼的同學,應該發現了一個很大的問題,對,沒有錯,有一個位置很陌生:
loss=tf.reduce_mean(tf.square(y-y_data))#損失函數nopentimizer=tf.train.GradientDescentOptimizer(0.2)#梯度下降方法ntrain=opentimizer.minimize(loss)#對loss使用梯度下降方法n
何為損失函數?何為梯度下降演算法?下一篇文章將會圍繞著損失函數去展開。
今天就先到這裡,晚安。
推薦閱讀:
※TensorFlow 訓練好模型參數的保存和恢復代碼
※深度學習利器:分散式TensorFlow及實例分析
※FaceRank-人臉打分基於 TensorFlow 的 CNN 模型,這個妹子顏值幾分? FaceRank 告訴你!
※tf.get_variable
TAG:TensorFlow |