1. 程式人生 > >tensorflow入門(一)---從一個小程式說起

tensorflow入門(一)---從一個小程式說起

我們現在需要擬合一條直線,通常我們會選用最小二乘的方法,通過程式設計優化實現,現在我們先用tensorflow提供的API來實現這個程式。麻雀雖小五臟俱全,裡面會涉及到很多tensorflow的核心API和思想:

我們隨機生成100個點,然後對這個點進行擬合,通過梯度下降演算法來優化得到引數:
import tensorflow as tf
import numpy as np
import os
# 只使用第一塊GPU來計算,如果不指定的話會呼叫所有可能資源,這樣對伺服器壓力太大
os.environ["CUDA_VISIBLE_DEVICES"] = '0'  

# 使用 NumPy 生成假資料總共 100 個點.
x_data = np.float32(np.random.rand(2, 100))      # 隨機產生100個值為0-1的點
y_data = np.dot([0.100, 0.200], x_data) + 0.300  # 產生標籤,點乘

# 構造一個線性模型
# 
b = tf.Variable(tf.zeros([1]))
W = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0))
y = tf.matmul(W, x_data) + b

# 建立模型與資料之間的關係,最小化方差
loss = tf.reduce_mean(tf.square(y - y_data))
# 設定優化器,傳入的引數是lr
optimizer = tf.train.GradientDescentOptimizer(0.5)
# 確定最小化loss
train = optimizer.minimize(loss)

# 初始化所有變數
init = tf.initialize_all_variables()

# 啟動圖 (graph)
sess = tf.Session()
#初始化變數
sess.run(init)

# 擬合平面
with tf.Session() as sess:
    #這種指定GPU的方法會報錯,因為不是所有的計算GPU都可以完成的,如果非要使用這種方法
	#需要分開返回指令,即進行矩陣乘法運算(MatMul)的時候使用GPU否則使用CPU
	#with tf.device("/gpu:0"):
	for step in xrange(0, 201):      
		sess.run(train)
		if step % 20 == 0:
			print step, sess.run(W), sess.run(b)

# 得到最佳擬合結果 W: [[0.100  0.200]], b: [0.300]

tensorflow可以拆解成兩個詞:tensor(張量)和flow(流)其中tensor是這個深度學習框架的基本資料結構,所有的資料都由tensor承載,tensor是一個多為陣列類似於caffe中的blob。tensorflow通過圖來表示計算任務,圖中的節點被稱為op(operation),一個op獲得0個或者多個的tensor,產生0或者多個tensor。
一個tensorflow圖描述了計算的過程,圖必須在會話中被啟動,在python中圖執行完畢返回的是一個numpy ndarray物件。在使用之前我們還需明確幾個tensorflow的特性:
1. 使用圖(graph)來表示計算任務
2. 在會話(Session)中執行圖
3. 使用tensor表示資料
4. 通過變數維護當前優化狀態
5. 使用feed和fetch為任意操作賦值或者從中獲取資料


使用tensor進行深度學習甚至是機器學習演算法的實現變得更加的簡單:我們只需要構建出關係圖,然後tensorflow提供的優化器會幫我們自動的完成優化工作。即:執行sess.run(loss),和loss相關的整個圖會被執行,其中的Variable會被自動的優化。