Tensorflow(0)

Tensorflow(0)

 

總體認識:

  1. tensor,即張量,也就是高維數組;flow,即流,表示着張量的關係以及運算;tensorflow就是張量間的計算。
  2. 張量之間的計算是在圖(graph)中實現的

圖:

  1. 圖是由幾點與邊組成的。
  2. 節點,即操作(operation);操作可以是加減乘除的運算,也可以是對常量、變量的初始化。
  3. 邊連接着節點,表示着節點之間的數據傳遞以及控制依賴;並在圖中以實線表示常規邊,即相連節點只進行數據傳遞;以虛線表示特殊表,即相連節點存在前後執行的依賴關係。
  4. node1 = tf.constant(3.0, tf.float32, name='node1')
    node2 = tf.constant(4.0, tf.float32, name='node1')
    node3 = tf.add(node1, node2)
    

    建立如上的計算關係,將得到對應的graph;

  5. 注意直接打印node3,將不會顯示7.0,而是 Tensor("Add:0", shape=(), dtype=float32);即返回一個Tensor值,其中包括節點名,形狀以及類型;要想顯示node3的具體值,需要在會話中進行,TF中只有執行Session時,才能提供數據與顯示結果。

張量

  1. TF中所有數據均爲張量;本質上張量是數組:零階張量就是一個數、一階張量就是一個向量一個一維數組、n階張量就是n維數組;但是張量不是直接表保存一個數組,保存的是計算過程。
  2. Tensor("Add:0", shape=(), dtype=float32),其中:第一項爲名字,冒號前表示具體名字,比如此處是加法的意思,冒號之後是序號,表示這是第幾個加法計算;第二項是維度,默認爲空,表示此時是一個標量;第三項是類型,類型極其重要,類型匹配是計算的前提。
  3. Tensor("Add:0", shape=(), dtype=float32)中的shape:一個張量有幾維shape的括號裏有幾個數(通過數中括號對數確定),並逐內在每維度取元素數放在括號裏;如: [1,2,3]->shape(3)一維且第一維有三個元素;[[1,2,3],[4,5,6]]->shape(2,3)二維且第一維兩個元素第二維3個元素。
  4. tensor可以像數組一樣的取值,如二階tensor,可以用t[i,j]的形式獲取元素,同樣的下標是從0開始到。
  5. 張量的類型是可以缺省的,程序會根據所填入得值自行判斷。若傳入的值無小數點,則判斷爲int32;若傳入的值有小數點,將判斷爲float32;由於缺省的存在,一定要注意計算時先確定類型匹配,否則程序很容易出現各種錯誤。
  6. 定義張量時雖然名字可以缺省,但是最好是帶上,因爲這樣在Tensorboard上可以有更好的可讀性。

操作

  1. 操作在計算圖中表示爲一個節點。
  2. 操作可以是加減乘除的運算,也可以是對常量、變量的初始化。
  3. 操作可以綁定於不同設備上,這爲cpu結合gpu或者多gpu計算提供可能。

會話

  1. 會話用以整合TF程序運行的所用資源,TF所有的數據計算以及結果顯示均在會話中實現,但是注意在程序結束後應及時關閉會話,防止內存泄漏。
  2. tens0 = tf.constant([1,2.3])
    sess = tf.Session()
    print(sess.run(tens0))
    sess.close()
    引入會話可如上;但是上述代碼存在問題,一旦在會話關閉語句之前產生異常,程序中途停止,會話將無法正常釋放。
  3. tens0 = tf.constant([1,2.3])
    sess = tf.Session()
    try:
        print(sess.run(tens0))
    except:
        print('Eception!')
    finally:
        sess.close()
    可利用python處理異常的語句改善會話引進的代碼。上述代碼在何種情況下均會執行會話關閉的操作。
  4. tens0 = tf.constant([1,2.3])
    with  tf.Session() as sess:
        print(sess.run(tens0))
    
    更一般的可以用python的上下文管理器引入會話。此形勢下,無論何種方式離開此區域,會話總會正常釋放。
  5. sess = tf.Session()
    with sess.as_default():
        print(tensor.eval())
    TF運行時會產生默認的graph,但是不會產生默認的Session;可以利用語句指定程序在默認會話下進行。在默認會話下,利用tensor.eval()計算張量的值,其效果與sess.run(tensor)一致,但是非默認會話下使用eval函數時錯誤的。
  6. sess = tf.InteractiveSession()
    在python中,引入默認會話可以用一個語句實現。

常量與變量

  1. constant_name = tf.constant(value,nmae='constant_name')
    常量定義如上所示,定義時其名字最好與定義的常量名一致;常量一經定義不再改變,且無需進行額外的初始化操作;但是執行相關運算以及輸出其值應在會話中進行。
  2. var_name = tf.Variable(value,nmae='vart_name')
    
    init = tf.global_variables_initializer()
    sess.run(init)
    與常量的定義無異,主要是注意首字母大寫。所有變量使用前要進行初始化操作;並注意變量計算往往存在依賴關係,一定安排好先後計算的次序。
  3. epoch = tf.Variable(0, name='epoch', trainable=False)  # 不更新
    
    update_op = tf.assign(variable_to_be_upadated, newValue)  # 人工輸入值給變量
    神經網絡中,權重是以變量的形式存在的,因爲變量一經定義一般不會再人爲傳值,變量本身會隨着訓練的進行更新;對於不想更新的變量可以如上代碼,將trainable參數置爲False;特殊情況下需要對變量進行賦值,可以利用上文中的tf.assign進行更改,首參數爲待改變的變量,次參數爲要輸入的值。
  4. value = tf.Variable(0, name='value')
    one = tf.constant(1, name='one')
    new_value = tf.add(value, one, name='new_value')
    update_op = tf.assign(value, new_value)
    init = tf.global_variables_initializer()
    
    
    sess = tf.Session()
    with sess.as_default():
        sess.run(init)
        for _ in range(10):
            sess.run(update_op)
            print(sess.run(value))

    上述代碼實現了利用tf.assign賦值,輸出1到10

  5. import tensorflow as tf
    tf.reset_default_graph()
    value = tf.Variable(0, name='value')
    one = tf.constant(1, name='one')
    new_value = tf.add(value, one, name='new_value')
    update_value = tf.assign(value, new_value)
    sum = tf.Variable(0, name='sum')
    new_sum = tf.add(sum, value, name='sum')
    update_sum = tf.assign(sum, new_sum)
    init = tf.global_variables_initializer()
    
    sess = tf.Session()
    with sess.as_default():
        sess.run(init)
        for _ in range(10):
            sess.run(update_value)
            sess.run(update_sum)
            print("value: ", sess.run(value))
            print("sum: ", sess.run(sum))
    
    
    logdir = 'E:/log'
    
    writer = tf.summary.FileWriter(logdir, tf.get_default_graph())
    writer.close()

    上述代碼實現了1+..+10,同樣是利用了tf.assign對變量進行更新。

佔位符

  1. 對於初未知的變量,用佔位符表示;佔位符本質上是一種變量,所以使用前也需要進行初始化;在神經網絡中,輸入數據常以佔位符表示。
  2. x = tf.placeholder(dtype, shape=none, name= none)
    在定義佔位符時,一般可選參數是類型、維度與名字;其中名字、維度是可缺省的,但是最好是將名字寫作佔位符名,來提高可讀性;類型是不可缺省的。
  3. result = sess.run(operation, feed_dict={intput1:a,input2:b ...........})
    若操作依賴於佔位符,在進行操作時,應利用feed_dict來對佔位符對應傳入初始值;傳入時,是以字典的形式實現的。

 

 

Tensorboard

  1. tensorboard是基於tensorflow日誌,進行信息提取的可視化工具;可與tensorflow在不同的進程裏工作。
  2. 1.tf.reset_defualt_garph()  # 清除默認圖中的計算
    2.logdir = 'E:log'  # 在指定路徑下建立日誌文件夾
    3.定義各種計算......
    4.writer = tf.summary_FileWriter(logdir, tf.get_defualt_graph())
      writer.close()
    ******************以上完成了對定義計算圖,並生成日誌************
    
    ******************以下讀取日誌,並可視化***********************
    1. 在adacoinda的prompt中操作
    2.首先切換到日誌所在路徑
    3.使用 tensorboard --logdir==日誌路徑
    4.命令執行後,會最終彈出一個地址,利用這個地址在瀏覽器進入
    實現可視化主要爲上述四步。

 

 

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