Tensorflow 10分鐘快速上手

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)

線性迴歸模型 是 y=wx 我們需要通過模型計算出 w
初始化 w 爲 0
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
發佈了30 篇原創文章 · 獲贊 63 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章