先貼出參考資料:
1.Tensorflowshe鏈社區ttp://www.tensorfly.cn/
2.<Tensorflow學習指南>(朱小虎 李紫輝翻譯)
3.莫煩tensorflow:https://morvanzhou.github.io/tutorials/machine-learning/tensorflow/
DeepLearning簡單學了一遍簡化數學知識體系後,決定下一步學會實踐使用,再回過頭再去詳細得啃那本花書。接下來抽時間更新DeepLearning的學習日誌,用以鞏固知識體系,也用以自我督促。
使用 TensorFlow, 你必須明白的幾個概念:
- 使用計算圖 (graph) 來表示計算任務.
- 在被稱之爲會話(Session)的上下文 (context) 中執行圖.
- 使用 tensor 表示數據.
- 通過變量(Variables)維護狀態.
- 使用 feed 和 fetch 可以爲任意的操作(arbitrary operation) 賦值或者從其中獲取數據.
1 圖graph
使用tensorflow的過程可以概括爲兩個主要步驟:構建圖和使用圖。
例如,通常在構建階段創建一個圖來表示和訓練神經網絡, 然後在執行階段反覆執行圖中的訓練 op。
1.1 什麼是計算圖,節點
先說官方一些的解釋:圖是相互連接的實體的集合。通常稱爲節點node或者certice,這些節點通過邊edgexian相互連接。在數據流圖zh中,邊edge可以讓數據從一個節點根據指定方向流向另一個節點。
通俗一點解釋給大家:自從導入tensorflow後:
import tensorflow as tf
我們就已經經構建了一個空白的默認圖了。隨後我們在之後敲下的操作語句,比如使用tf創建一個常量:
matrix1 = tf.constant([[3,3]]) # constant是在tf中表示常量
這個操作稱之爲節點op(operation 的縮寫)。
1.2 Tensor
tensorflow中數據都是用tensor來表示,每個 Tensor 是一個類型化的多維數組,所有節點(操作)都會產生0個及以上的tensor。
1.3 Session
官方一些的解釋:TensorFlow 圖描述了計算的過程.,爲了進行計算,,圖必須在會話session裏被啓動。會話session將圖的 op 分發到諸如 CPU 或 GPU上,同時提供執行 op 的方法.。這些方法執行後,將產生的 tensor 返回。在 Python 語言中,返回的 tensor 是 numpy的ndrrary對象。
通俗點兒說:我們在tensorflow圖中敲下的所有操作語句,比如兩個矩陣相加。都需要用加載到會話Session中才能執行操作,比如:
matrix1 = tf.constant([[3,3]]) # constant是在tf中表示常量
matrix2 = tf.constant([[2],
[2]])
product = tf.matmul(matrix1,matrix2) # 矩陣乘法, 相當於np中 np.dot(m1,m2)
sess = tf.Session() # 創建一個會話session
result = sess.run(product) # 使用會話執行某個op
print(result2)
2 常量,隨機量變量
2.1常量constant
上面已經提到了tf.constantyong用於創建chan常量,當然也可以用numpy去創建常量矩陣。
2.1隨機量random與變量Variable
a = tf.Variable(tf.random_normal([size1,size2]))
3 placehloder與feed
TensorFlow 還提供了 feed 機制,該機制 可以臨時替代圖中的任意操作中的 tensor 。
feed 使用一個 tensor 值臨時替換一個操作的輸出結果. 你可以提供 feed 數據作爲 run()
調用的參數. feed 只在調用它的方法內有效, 方法結束, feed 就會消失. 最常見的用例是將某些特殊的操作指定爲 "feed" 操作, 標記的方法是使用 tf.placeholder() 爲這些操作創建佔位符.
這兩個操作通常使用,相當於於先用placeholder去創建一個待使用的數據,用某名稱表示,以方便我們創建某些歌op時使用,當用會話去執行某個op操作的時候,去用feed操作去對其賦值。例如:
input1 = tf.placeholder(tf.float32) # placeholder爲佔個空位的操作
input2 = tf.placeholder(tf.float32)
output = tf.multiply(input1, input2)
with tf.Session() as sess:
print (sess.run([output], feed_dict={input1:[7], input2:[2]}))
其中input1,input2shiy使用placeholder佔位操作,創建待賦值的空位,用以在隨後的op中表示被操作的數據。
在實際操作執行階段,用feed操作,爲其賦值。
4 fetch
爲了取回操作的輸出內容,可以在使用 Session
對象的 run()
去執行op時,定義一些 tensor, 這些 tensor 會幫助你取回結果. 在下面的兩個小例子中,第一個我們只取回了單個節點 state,第二個一次
可以取回多個 tensor。
# 創建一個變量,命名爲‘counter’ 初始化爲標量 0.
state = tf.Variable(0, name="counter")
# 創建一個 op, 其作用是使 state 增加 1
one = tf.constant(1)
new_value = tf.add(state, one)
update = tf.assign(state, new_value)
# 啓動圖後, 變量必須先經過`初始化` (init) op 初始化,
# 首先必須增加一個`初始化` op 到圖中.
init_op = tf.initialize_all_variables()
# 啓動圖, 運行 op
with tf.Session() as sess:
# 運行 'init' op
sess.run(init_op)
# 打印 'state' 的初始值
print sess.run(state)
# 運行 op, 更新 'state', 並打印 'state'
for _ in range(3):
sess.run(update)
print sess.run(state)
input1 = tf.constant(3.0)
input2 = tf.constant(2.0)
input3 = tf.constant(5.0)
intermed = tf.add(input2, input3)
mul = tf.mul(input1, intermed)
with tf.Session():
result = sess.run([mul, intermed])
print result
5 例子
最後貼上tensorflow社區裏的一段對完整包括以上基礎內容的程序。
import tensorflow as tf
import numpy as np
# 使用 NumPy 生成假數據(phony data), 總共 100 個點.
x_data = np.float32(np.random.rand(2, 100)) # 隨機輸入
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))
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss)
# 初始化變量
init = tf.initialize_all_variables()
# 啓動圖 (graph)
sess = tf.Session()
sess.run(init)
# 擬合平面
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]