說明:本文實例使用Python版本爲3.5.6,Tensorflow版本爲2.0前端
Tensorflow是Google推出的機器學習開源神器,對Python有着良好的語言支持,支持CPU,GPU和Google TPU等硬件,而且已經擁有了各類各樣的模型和算法。目前,Tensorflow已被普遍應用於文本處理,語音識別和圖像識別等多項機器學習和深度學習領域。python
分爲三層:應用層、接口層和核心層git
應用層github
提供了機器學習相關的訓練庫、預測庫和針對Python、C++和Java等變成語言的編程環境,相似於web系統的前端,主要實現了對計算圖的構造。web
接口層算法
對Tensorflow功能模塊的封裝,便於其它語言平臺的調用。編程
核心層數組
最重要的部分,包括設備層、網絡層、數據操做層和圖計算層,執行應用層的計算。網絡
包括Tensorflow在不一樣硬件設備上的實現,主要支持CPU、GPU和Mobile等設備,在不一樣硬件設備上實現計算命令的轉換,給上層提供統一的接口,實現程序的跨平臺功能。session
網絡層主要包括RPC和RDMA通訊協議,實現不一樣設備之間的數據傳輸和更新,這些協議都會在分佈式計算中用到。
以tensor爲處理對象,實現tensor的各類操做和計算。
包括分佈式計算圖和本地計算圖的實現,實現圖的建立、編譯、優化和執行等。
能夠將Tensorflow理解爲一張計算圖中「張量的流動」,其中,Tensor(張量)表明了計算圖中的邊,Flow(流動)表明了計算圖中節點所作的操做而造成的數據流動。
其設計理念是以數據流爲核心,當構建相應的機器學習模型後,使用訓練數據在模型中進行數據流動,同時將結果以反向傳播的方式反饋給模型中的參數,以進行調參,使用調整後的參數對訓練數據再次進行迭代計算。
有兩個編程特色:
在tensorflow中,須要預先定義各類變量,創建相關的數據流圖,在數據流圖中建立各類變量之間的計算關係,完成圖的定義,須要把運算的輸入數據放進去後,纔會造成輸出值。
tensorflow的相關計算在圖中進行定義,而圖的具體運行壞境在會話(session)中,開啓會話後,才能開始計算,關閉會話就不能再進行計算了。
舉個例子:
import tensorflow as tf tf.compat.v1.disable_eager_execution() a = 3 b = 4 c = 5 y = tf.add(a*b, c) print(y) a = tf.constant(3, tf.int32) b = tf.constant(4, tf.int32) c = tf.constant(5, tf.int32) y = tf.add(a*b, c) print(y) session = tf.compat.v1.Session() print(session.run(y)) session.close()
能夠看出,在圖建立後,並在會話中執行數據計算,最終輸出結果。
設計的好處就是:學習的過程當中,消耗最多的是對數據的訓練,這樣設計的話,當進行計算時,圖已經肯定,計算就只剩下一個不斷迭代的過程。
張量,是tensorflow中最主要的數據結構,張量用於在計算圖中進行數據傳遞,建立了張量後,須要將其賦值給一個變量或佔位符,以後纔會將該張量添加到計算圖中。
會話,是Tensorflow中計算圖的具體執行者,與圖進行實際的交互。一個會話中能夠有多個圖,會話的主要目的是將訓練數據添加到圖中進行計算,也能夠修改圖的結構。
調用模式推薦使用with語句:
with session: session.run()
變量,表示圖中的各個計算參數,經過調整這些變量的狀態來優化機器學習算法。建立變量應使用tf.Variable(),經過輸入一個張量,返回一個變量,變量聲明後需進行初始化才能使用。
舉例說明:
import tensorflow as tf tf.compat.v1.disable_eager_execution() tensor = tf.ones([1, 3]) test_var = tf.Variable(tensor) # 初始化變量 init_op = tf.compat.v1.global_variables_initializer() session = tf.compat.v1.Session() with session: print("tensor is ", session.run(tensor)) # print("test_var is ", session.run(test_var)) session.run(init_op) print("after init, test_var is", session.run(test_var))
佔位符,用於表示輸入輸出數據的格式,聲明瞭數據位置,容許傳入指定類型和形狀的數據,經過會話中的feed_dict參數獲取數據,在計算圖運行時使用獲取的數據進行計算,計算完畢後獲取的數據就會消失。
舉例說明:
x = tf.compat.v1.placeholder(tf.int32) y = tf.compat.v1.placeholder(tf.int32) z = tf.add(x, y) session = tf.compat.v1.Session() with session: print(session.run([z], feed_dict={x: [1, 2], y: [2, 3]}))
操做,是圖中的節點,輸入輸出都是Tensor,做用是完成各類操做,包括:
隊列,圖中有狀態的節點。包含入列(endqueue)和出列(dequeue)兩個操做,入列返回計算圖中的一個操做節點,出列返回一個tensor值。
其中,隊列有兩種:
1. FIFOQueue
按入列順序出列的隊列,在須要讀入的訓練樣本有序時使用。舉個例子:
fifo_queue = tf.compat.v1.FIFOQueue(10, 'int32') init = fifo_queue.enqueue_many(([1, 2, 3, 4, 5, 6], )) with tf.compat.v1.Session() as session: session.run(init) queue_size = session.run(fifo_queue.size()) for item in range(queue_size): print('fifo_queue', session.run(fifo_queue.dequeue()))
2. RandomShuffleQueue
以隨機順序出列的隊列,讀入的訓練樣本無序時使用。舉個例子:
rs_queue = tf.compat.v1.RandomShuffleQueue(capacity=5, min_after_dequeue=0, dtypes='int32') init = rs_queue.enqueue_many(([1, 2, 3, 4, 5], )) with tf.compat.v1.Session() as session: session.run(init) queue_size = session.run(rs_queue.size()) for i in range(queue_size): print('rs_queue', session.run(rs_queue.dequeue()))
代碼參考:my github
以上。