【本文摘自網絡,僅供學習使用】node
官網上對TensorFlow的介紹是,一個使用數據流圖(data flow graphs)技術來進行數值計算的開源軟件庫。數據流圖中的節點,表明數值運算;節點節點之間的邊,表明多維數據(tensors)之間的某種聯繫。咱們能夠在多種設備(含有CPU或GPU)上經過簡單的API調用來使用該系統的功能。python
TensorFlow包含構建數據流圖與計算數據流圖等基本步驟,圖中的節點表示數學操做,圖中連結各節點的邊表示多維數組,即:tensors(張量)。 張量是TensorFlow最核心的組件,全部運算和優化都是基於張量進行的。張量是基於向量和矩陣的推廣,能夠將標量看爲零階張量,矢量看作一階張量,矩陣看作二階張量(後面詳細介紹)。算法
數據流圖是描述有向圖中的數值計算過程。有向圖中的節點一般表明數學運算,但也能夠表示數據的輸入、輸出和讀寫等操做;有向圖中的邊表示節點之間的某種聯繫,它負責傳輸多維數據(Tensors)。圖中這些tensors的flow也就是TensorFlow的命名來源。數組
將計算流程表示成圖;網絡
經過Sessions來執行圖計算;session
將數據表示爲tensors;數據結構
使用Variables來保持狀態信息;框架
分別使用feeds和fetches來填充數據和抓取任意的操做結果;機器學習
上面代碼中,首先導入TensorFlow,而後tf.placeholder("float")定義a和b兩個浮點類型的變量,tf.multiply(a,b)表示兩個變量相乘操做,經常使用的算術還有:分佈式
Operation | Description |
tf.add | sum |
tf.subtract | substraction |
tf.multiply | multiplication |
tf.div | division |
tf.mod | module |
tf.abs | return the absolute value |
tf.neg | return negative value |
tf.sign | return the sign |
tf.inv | returns the inverse |
tf.square | calculates the square |
tf.round | returns the nearest integer |
tf.sqrt | calculates the square root |
tf.pow | calculates the power |
tf.exp | calculates the exponential |
tf.log | calculates the logarithm |
tf.maximum | returns the maximum |
tf.minimum | returns the minimum |
tf.cos | calculates the cosine |
tf.sin | calculates the sine |
若是兩種不一樣類型計算時會報錯,須要tf.cast()轉換類型,例如:
上面代碼需改成:
tf.subtract(tf.cast(tf.constant(3.0), tf.int32), tf.constant(1))
另外,還會用到的矩陣計算方法:
Operation | Description |
tf.diag | returns a diagonal tensor with a given diagonal values |
tf.transpose | returns the transposes of the argument |
tf.matmul | returns a tensor product of multiplying two tensors listed as arguments |
tf.matrix_determinant | returns the determinant of the square matrix specified as an argument |
tf.matrix_inverse | returns the inverse of the square matrix specified as an argument |
接下來 tf.Session()語句表示建立一個session,這是最重要的一步,它用來計算生成的符號表達式。到這一步TensorFlow代碼尚未真正被執行, 而調用run()方法後算法才真正被執行。能夠看出,TensorFlow既是一個表示機器學習算法的接口,又是對機器學習算法的實現。
爲了抓取輸出結果,在執行session的run函數後,經過print函數打印狀態信息。
填充(Feeds):
TensorFlow提供的機制:先建立特定數據類型的佔位符(placeholder),以後再進行數據的填充("feed_dict= ");若是不對placeholder()的變量進行數據填充,將會引起錯誤。
數據類型 | Python 類型 | 描述 |
---|---|---|
DT_FLOAT |
tf.float32 |
32 位浮點數. |
DT_DOUBLE |
tf.float64 |
64 位浮點數. |
DT_INT64 |
tf.int64 |
64 位有符號整型. |
DT_INT32 |
tf.int32 |
32 位有符號整型. |
DT_INT16 |
tf.int16 |
16 位有符號整型. |
DT_INT8 |
tf.int8 |
8 位有符號整型. |
DT_UINT8 |
tf.uint8 |
8 位無符號整型. |
DT_STRING |
tf.string |
可變長度的字節數組.每個張量元素都是一個字節數組. |
DT_BOOL |
tf.bool |
布爾型. |
DT_COMPLEX64 |
tf.complex64 |
由兩個32位浮點數組成的複數:實數和虛數. |
DT_QINT32 |
tf.qint32 |
用於量化Ops的32位有符號整型. |
DT_QINT8 |
tf.qint8 |
用於量化Ops的8位有符號整型. |
DT_QUINT8 |
tf.quint8 |
用於量化Ops的8位無符號整型. |
TensorFlow用張量表示全部的數據,張量可當作一個n維的數組或列表,在圖中的節點之間流通。張量的維數稱爲階,注:張量的階和矩陣的階不是同一個概念。下面的張量(使用Python的list定義)是2階:
t = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
階 | 數學實例 | Python 例子 |
---|---|---|
0 | 純量 (只有大小) | s = 1 |
1 | 向量(大小和方向) | v = [1, 2, 3] |
2 | 矩陣(數據表) | m = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] |
3 | 3階張量 (數據立體) | t = [[[2], [4], [6]], [[8], [10], [12]], [[14], [16], [18]]] |
n | n階 | .... |
TensorFlow使用三種記號描述張量的維度:階,形狀及維數,它們之間的關係:
階 | 形狀 | 維數 | 實例 |
---|---|---|---|
0 | [ ] | 0-D | 一個 0維張量. 一個純量. |
1 | [D0] | 1-D | 一個1維張量的形式[5]. |
2 | [D0, D1] | 2-D | 一個2維張量的形式[3, 4]. |
3 | [D0, D1, D2] | 3-D | 一個3維張量的形式 [1, 4, 3]. |
n | [D0, D1, ... Dn] | n-D | 一個n維張量的形式 [D0, D1, ... Dn]. |
張量的一些經常使用操做:
Operation | Description |
tf.shape | To find a shape of a tensor |
tf.size | To find the size of a tensor |
tf.rank | To find a rank of a tensor |
tf.reshape | To change the shape of a tensor keeping the same elements contained |
tf.squeeze | To delete in a tensor dimensions of size 1 |
tf.expand_dims | To insert a dimension to a tensor |
tf.slice | To remove a portions of a tensor |
tf.split | To divide a tensor into several tensors along one dimension |
tf.tile | To create a new tensor replicating a tensor multiple times |
tf.concat | To concatenate tensors in one dimension |
tf.reverse | To reverse a specific dimension of a tensor |
tf.transpose | To transpose dimensions in a tensor |
tf.gather | To collect portions according to an index |
例如,將一個2維張量擴展爲3維:
print (expanded_vectors.get_shape())
執行上面這句,能夠獲得擴展後張量的維度。
有了張量和基於張量的各類操做,以後須要將各類操做整合起來,輸出結果。但不幸的是,隨着操做種類和數量的增多,有可能引起各類意想不到的問題,包括多個操做之間應該並行仍是順次執行,如何協同各類不一樣的底層設備,以及如何避免各類類型的冗餘操做等等。這些問題有可能拉低整個深度學習網絡的運行效率或者引入沒必要要的Bug,計算圖正是爲解決這一問題產生的。
論文《Learning Deep Architectures for AI》做者用不一樣的佔位符(*,+,sin)構成操做結點,以字母x、a、b構成變量結點,以有向線段將這些結點鏈接起來,組成一個表徵運算邏輯關係的清晰明瞭的「圖」型數據結構,這就是最初的計算圖。
計算圖的引入可讓開發者從宏觀上俯瞰整個神經網絡的內部結構,就好像編譯器能夠從整個代碼的角度決定如何分配寄存器那樣,計算圖也能夠從宏觀上決定代碼運行時的GPU內存分配,以及分佈式環境中不一樣底層設備間的相互協做方式。除此以外,如今也有許多深度學習框架將計算圖應用於模型調試,能夠實時輸出當前某一操做類型的文本描述。
node1和node2是constant,常量不可改變,其輸出結果:
Tensor("Const_2:0", shape=(), dtype=float32) Tensor("Const_3:0", shape=(), dtype=float32)
上面並無直接輸出3.0和4.0,而是輸出能夠生成3.0和4.0的兩個張量,若是想要獲得3.0和4.0,須要上面介紹的session和run操做:
計算圖是將節點列到一個圖中的一系列操做,其輸入是節點(nodes),輸出也是node。或者更復雜一點,操做也是node:
輸出結果爲:
爲了使算法容易理解,TensorFlow中的可視化工具Tensorboard包含了一些debug函數與優化程序,能夠察看不一樣類型的參數統計結果與圖中的計算細節(這部分之後參照實例學習一下)。
輸入能夠是任意量,例如構建模型:y=w*x+b,w和b必定時,x是可變量:
W和b是Variable,執行上面的語句,W和b並無被初始化,若是執行程序,須要下面的初始化語句:
init = tf.global_variables_initializer()
完整實例以下:
輸出結果爲:[ 0. 0.5 1. 1.5]
assign只是一個函數,而且不須要初始化,可是assign_add()和assign_sub()須要初始化。