Tensorflow基本概念

【本文摘自網絡,僅供學習使用】node

官網上對TensorFlow的介紹是,一個使用數據流圖(data flow graphs)技術來進行數值計算的開源軟件庫。數據流圖中的節點,表明數值運算;節點節點之間的邊,表明多維數據(tensors)之間的某種聯繫。咱們能夠在多種設備(含有CPU或GPU)上經過簡單的API調用來使用該系統的功能。python

TensorFlow包含構建數據流圖與計算數據流圖等基本步驟,圖中的節點表示數學操做,圖中連結各節點的邊表示多維數組,即:tensors(張量)。 張量是TensorFlow最核心的組件,全部運算和優化都是基於張量進行的。張量是基於向量和矩陣的推廣,能夠將標量看爲零階張量,矢量看作一階張量,矩陣看作二階張量(後面詳細介紹)。算法

數據流圖是描述有向圖中的數值計算過程。有向圖中的節點一般表明數學運算,但也能夠表示數據的輸入、輸出和讀寫等操做;有向圖中的邊表示節點之間的某種聯繫,它負責傳輸多維數據(Tensors)。圖中這些tensors的flow也就是TensorFlow的命名來源。數組

基本使用:

  • 將計算流程表示成圖;網絡

  • 經過Sessions來執行圖計算;session

  • 將數據表示爲tensors;數據結構

  • 使用Variables來保持狀態信息;框架

  • 分別使用feeds和fetches來填充數據和抓取任意的操做結果;機器學習

TensorFlow初識,簡單實例     

  1. import tensorflow as tf
  2. a =tf.placeholder( "float")
  3. b =tf.placeholder( "float")
  4. y = tf.multiply(a,b)
  5. sess = tf.Session() 
  6. print(sess.run(y, feed_dict={a: 3, b: 3}))

上面代碼中,首先導入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()轉換類型,例如:

  1. tf.subtract(tf.constant( 3.0),tf.constant(1))
  2.   """
  3.   TypeError: Input 'y' of 'Sub' Op has type int32 that does not
  4.   match type float32 of argument 'x'.
  5.   """

上面代碼需改成: 

 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維:

  1.  vectors = tf.constant(conjunto_puntos)
  2.  extended_vectors = tf.expand_dims(vectors, 0)

 

print (expanded_vectors.get_shape())

執行上面這句,能夠獲得擴展後張量的維度。

TensorFlow計算圖:

有了張量和基於張量的各類操做,以後須要將各類操做整合起來,輸出結果。但不幸的是,隨着操做種類和數量的增多,有可能引起各類意想不到的問題,包括多個操做之間應該並行仍是順次執行,如何協同各類不一樣的底層設備,以及如何避免各類類型的冗餘操做等等。這些問題有可能拉低整個深度學習網絡的運行效率或者引入沒必要要的Bug,計算圖正是爲解決這一問題產生的。

論文《Learning Deep Architectures for AI》做者用不一樣的佔位符(*,+,sin)構成操做結點,以字母x、a、b構成變量結點,以有向線段將這些結點鏈接起來,組成一個表徵運算邏輯關係的清晰明瞭的「圖」型數據結構,這就是最初的計算圖。

計算圖的引入可讓開發者從宏觀上俯瞰整個神經網絡的內部結構,就好像編譯器能夠從整個代碼的角度決定如何分配寄存器那樣,計算圖也能夠從宏觀上決定代碼運行時的GPU內存分配,以及分佈式環境中不一樣底層設備間的相互協做方式。除此以外,如今也有許多深度學習框架將計算圖應用於模型調試,能夠實時輸出當前某一操做類型的文本描述。

實例1: 

  1.  node1 = tf.constant( 3.0, dtype=tf.float32)
  2.  node2 = tf.constant( 4.0) # also tf.float32 implicitly
  3.  print(node1, node2)

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操做:

  1.  sess = tf.Session()
  2.  print(sess.run([node1, node2]))

計算圖是將節點列到一個圖中的一系列操做,其輸入是節點(nodes),輸出也是node。或者更復雜一點,操做也是node:

實例2: 

  1.  node3 = tf.add(node1, node2)
  2.  print( "node3:", node3)
  3.  print( "sess.run(node3):", sess.run(node3))

輸出結果爲:

  1.  node3: Tensor( "Add_1:0", shape=(), dtype=float32)
  2.  sess.run(node3): 7.0

爲了使算法容易理解,TensorFlow中的可視化工具Tensorboard包含了一些debug函數與優化程序,能夠察看不一樣類型的參數統計結果與圖中的計算細節(這部分之後參照實例學習一下)。

實例3:

輸入能夠是任意量,例如構建模型:y=w*x+b,w和b必定時,x是可變量:

  1.  W = tf.Variable([ .3], dtype=tf.float32)
  2.  b = tf.Variable([ -.3], dtype=tf.float32)
  3.  x = tf.placeholder(tf.float32)
  4.  linear_model = W*x + b

W和b是Variable,執行上面的語句,W和b並無被初始化,若是執行程序,須要下面的初始化語句:

 init = tf.global_variables_initializer()

完整實例以下: 

  1.   import tensorflow as tf
  2.  W = tf.Variable([ .5], dtype=tf.float32)
  3.  b = tf.Variable([ -.5], dtype=tf.float32)
  4.  x = tf.placeholder(tf.float32)
  5.  linear_model = W*x + b
  6.   #print("linear_model:",linear_model)
  7.   
  8.  init = tf.global_variables_initializer()
  9.  sess = tf.Session()
  10.  sess.run(init)
  11.  print(sess.run(linear_model, {x: [ 1, 2, 3, 4]}))

輸出結果爲:[ 0.   0.5  1.   1.5]

實例4:

  1.   import tensorflow as tf
  2.  
  3.  W = tf.Variable( 1)
  4.  assign_W = W.assign( 10)#修改變量方法,assign
  5.   with tf.Session() as sess:
  6.    sess.run(W.initializer)
  7.         print(W.eval())
  8.         sess.run(assign_W)
  9.         print(W.eval())

assign只是一個函數,而且不須要初始化,可是assign_add()和assign_sub()須要初始化。

    1.   import tensorflow as tf
    2.   
    3.  W = tf.Variable( 10)
    4.  sess1 = tf.Session()
    5.  sess2 = tf.Session()
    6.  sess1.run(W.initializer)
    7.  sess2.run(W.initializer)
    8.  print( 'W add 1=',sess1.run(W.assign_add(1)))
    9.  print( 'W sun 2=',sess2.run(W.assign_sub(2)))
    10.  sess1.close()
    11.  sess2.close()
相關文章
相關標籤/搜索