tensorflow基礎總結

先貼出參考資料

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]

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章