Tensorflow 快速上手
系統版本 : Ubuntu 16.04LTS
Python版本 : 3.6.1
Tensorflow 版本 : 1.0.1
本文依據教程 TensorFlow Tutorial: 10 minutes Practical TensorFlow lesson for quick learners的內容編寫…
實現了教程中的所有指令,內容進行了不完整的翻譯,僅供參考
Part 1 Basics of Tensorflow
Tensorflow 中,數據 通過 圖(graph) 流動 (flow) .
數據 用 n 維數組表示,叫做 Tensors
圖 由 數據(Tensors) 和 數學運算 組成
- 圖的節點(nodes)代表 數學運算
- 圖的邊緣(edges)代表 各種數學運算中流動的數據(tensors)
Tensorflow 與 一般編程語言很大不同的一點是: - 在Tensorflow 中,要先將整個程序結構構建出來,也就是將 graph 設計好,在這個過程中,所有變量都沒有賦值
- 完整的 graph 設計好後,需要在 session 中運行,在這個運行過程中,各個變量纔會被賦值
在Python編程環境下,首先,導入 Tensorflow,如下
import tensorflow as tf
(i)Graph in Tensorflow
Graph 是 Tensorflow 的骨幹結構,所有的 計算/操作/變量 都離不開 graph.
Tensorflow 提供的默認 graph 可以通過以下命令獲得
graph = tf.get_default_graph()
運行以下指令可以 查看並輸出所有 圖 中的操作(operations)
for op in graph.get_operations():
print(op.name)
會發現輸出爲空,在之後添加了 操作 內容後,再次運行上述命令,就可以查看到 圖 中的所有操作.
同時創建多個 圖 也是可以的,當下暫且不提
(ii)Tensorflow session
Graph 用來定義 操作 ,而所有 操作 只有在 session 中才能運行
Graph 和 session 之間是相互獨立的
如果說 graph 是建築的設計圖, session 就是建築的施工工地
設計好的 graph 中沒有變量,當我們在 session 中運行 graph 時,纔會給予有值的變量
創建session兩種方法:
- [1]
sess=tf.Session()
... your code ...
... your code ...
sess.close()
每次 open 一個 session 都一定要有對應的 close
- [2]
with tf.Session() as sess:
sess.run(f)
使用 with block 更加方便,每次 with clock 運行完後都會自動關閉 session ,推薦這種寫法
(iii)Tensors in Tensorflow
a)常量
定義方式如下:
a = tf.constant(1.0)
print(a)
Tensor("Const:0", shape=(), dtype=float32)
顯示常量 a ,結果如上.可以發現,與一般語言不同,在 session 外是無法顯示出常量的值的.
在 session 中運行一下顯示指令,可以發現常量值就可以直接輸出來了
with tf.Session() as sess:
print(sess.run(a))
1.0
b)變量
變量定義方式如下:
b = tf.Variable(2.0,name ="test.var")
b
<tensorflow.python.ops.variables.Variable at 0x7f1a8189eac8>
變量沒有一個固定的取值,需要 初始化 操作.
每個變量分別初始化效率很低,Tensorflow 提供了同時初始化所有變量的指令
在version0.12 以後的版本,初始化指令如下:
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init_op)
print(sess.run(b))
2.0
session 中運行,初始化並輸出變量,可以看到 定義的變量 b ,被賦值爲2 .
c)Placeholders
Placeholder 是 等待被 初始化 或 fed 的 tensors ,
只有當 代碼 真正在 session 中被運行時,數據纔會被 feed 給 placeholders,
提供給 placeholders 的 數據叫做 feed_dict
Feed_dict are key value pairs for holding data
a = tf.placeholder("float")
b = tf.placeholder("float")
y = tf.multiply(a,b)
feed_dict={a:2,b:3}
with tf.Session() as sess:
print(sess.run(y,feed_dict))
6.0
(iv) Device in TensorFlow
Tensorflow 支持 cpu gpu gpu羣 ,我們可以選擇代碼運行的計算硬件
整個 Tensorflow 的工作結構如下圖所示
Part 2 Tensorflow tutorial with simple example
1.創建隨機正態分佈:
w = tf.Variable(tf.random_normal([784,10],stddev = 0.01))
2.均值 reduce_mean
b = tf.Variable([20,30,40,45,3,5,67],name = 'b')
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(sess.run(tf.reduce_mean(b)))
30
3.Argmax
a = [[0.1,0.4,0.3],[10,20,30]]
b = tf.Variable(a,name = 'a')
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(sess.run(tf.argmax(b,1)))
[1 2]
4.線性迴歸練習
import numpy as np #之前已經導入了tensorflow
a) 訓練數據生成
trainX 在 -1 到 1 之間取值
trainY 是 trainX 的三倍 加上一個隨機干擾值
trainX = np.linspace(-1,1,101)
trainY = 3 * trainX + np.random.randn(*trainX.shape) * 0.33
b) placeholders 定義
X = tf.placeholder("float")
Y = tf.placeholder("float")
c)建模(Modeling)
線性迴歸模型 是
初始化
cost function 定義爲 (Y-y_model)的平方
Tensorflow 提供了很多 optimizer ,在每個循環更新梯度,最小化cost
我們定義的訓練操作是 使用 GradientDescentOptimizer ,以 0.01 的學習率 最小化 cost
在循環中運行訓練操作
w = tf.Variable(0.0, name="weights")
y_model = tf.multiply(X, w)
cost = (tf.pow(Y-y_model, 2))
train_op = tf.train.GradientDescentOptimizer(0.01).minimize(cost)
d)訓練(Training)
現在,我們定義好了 graph ,但我們沒進行任何運算
在創建 session 前,我們先定義好 初始化所有變量的指令 init
在 session 中, 首先運行 init ,完成初始化
然後,進行循環,在循環中,運行 graph 中定義好的訓練操作 train_op
最終,輸出得到的 w =3.03938,與預期相符
注意: session 結束後,所有的變量又會恢復沒有值的狀態
init= tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
for i in range(100):
for (x, y) in zip(trainX, trainY):
sess.run(train_op, feed_dict={X: x, Y: y})
print(sess.run(w))
3.03938