1. 程式人生 > >【Tensorflow】Tensorflow入門運算機制

【Tensorflow】Tensorflow入門運算機制

Tensorflow是Google2015年11月9日開源的人工智慧系統,也是適合我們進行機器學習開發的常用開發框架,具備更好的靈活性和可延展性。TensorFlow一大亮點是支援異構裝置分散式計算,它能夠在各個平臺上自動執行模型,從手機、單個CPU / GPU到成百上千GPU卡組成的分散式系統。其命名來源於本身的執行原理。Tensor(張量)意味著N維陣列,Flow(流)意味著基於資料流圖的計算,TensorFlow為張量從流圖的一端流動到另一端計算過程。TensorFlow是將複雜的資料結構傳輸至人工智慧神經網中進行分析和處理過程的系統。

運算機制

正如他的名字Tensorflow一般分為兩個階段:

  • 構造部分,使用tensor表示資料,使用graph來表示計算任務
  • 執行部分,在被稱為Session的context裡執行圖中的計算(使用feed和fetch可以為任意的op賦值或從中獲取資料)

計算圖

Tensorflow在執行時會產生一個計算圖,我們程式中的每一個計算都是計算圖上的一個node,我們可以手動通過程式碼指定,也可以程式碼預設生成,這個計算圖就是我們計算的主要流程。

g = tf.Graph()                 # 建立圖例項(物件)
with g.as_default():
  c = tf.constant(250)

張量

張量的理解十分重要,張量是Tensorflow中的重要部分,他就是我們要喂進流程圖裡面的資料,一個張量主要包含三個屬性 名字、維度、型別。舉個例子

# 純量 只有大小
v0 = 786
# 向量 有資料(123)有大小(3個數字)
v1 = [1,2,3]
# 矩陣 二維矩陣
v2 = [[1, 2, 3],
      [4, 5, 6],
      [7, 8, 9]]
# 三維資料 立體矩陣
v3 = [[[2], [4], [6]], 
      [[8], [10], [12]], 
      [[14], [16], [18]]]

可能再往上寫就不好想象了,我們其實可以這樣理解,一個一階張量就是向量,然後多個向量摞在一起就變成了二階張量也就是二位矩陣,由此可知三階張量就是多個二階張量落在一起,可以想象一下圖片三通道,因為就可以推廣到更高維度。
在圖片作為資料輸入時,常用的shape是 [b, h , w, c] batch_size , height, weight, channel
張量的命名是通過“node:src_output”的形式來給出,node為節點的名稱,src_ouput表示當前張量來自節點的第幾個輸出(編號從0開始)。當計算圖構造完成後,可以通過會話(session)來得到張量的計算結果(或者藉助eval()),如tf.Session().run(result)。

會話

TensorFlow中的會話(session)用來執行定義好的運算。TensorFlow不會自動生成預設的會話,需要我們使用 tf.Session 操作類,去手動執行相當於運算引擎,我們可以使用程式碼sess.run()指定計算計算流圖中的特定節點。

with tf.Session() as sess:
            sess.run(init)
            loss_v, acc = sess.run([loss, accuracy], feed_dict={X: batch_x, Y: batch_y})

placeholder機制

在前面的計算圖中我們說過,tensorflow就是tensor張量在流圖中的計算,既然要計算就要把資料張量放到流圖中,所以placeholder就是用來讓我們把資料放入到圖中,相當於在計算圖裡面定義了個位置,打開了個口子好讓我們把指定型別的資料喂進流圖,一般要在執行時通過feed_dict來指定

x = tf.placeholder(tf.float32, shape=(3, 2), name="input")
sess.run(y, feed_dict={x:[[0.7, 0.9], [0.1, 0.4], [0.5, 0.8]]})

collection集合

在一個計算圖中,可以通過集合(collection)來管理不同類別的資源(可以是張量、變數或者執行Tensorflow程式所需要的佇列資源等)。比如通過tf.add_to_collection函式可以將資源加入一個或多個集合中,然後通過tf.get_collection獲取一個集合裡面的所有資源。 TensorFlow中也自動管理了一些最常用的集合,如:tf.GraphKeys.TRAINABLE_VARIABLES是可學習變數的集合,可通過tf.trainable_variables()獲得。

tf.add_to_collection('losses', mse_loss)
loss = tf.get_collection('losses')