我們現在需要拟合一條直線,通常我們會選用最小二乘的方法,通過程式設計優化實作,現在我們先用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會被自動的優化。