TensorFlow學習筆記_Lecture 1 Overview of Tensorflow

本博客是根據斯坦福大學的一門 tensorflow 課程的課件整理。這是課程地址 CS 20: Tensorflow for Deep Learning Research

1 前言

  • 什麼是 TensorFlow?

    “Open source software library for numerical computation using data flow graphs”

  • 爲什麼用 TensorFlow?

    • 有許多機器學習庫;
    • 具有靈活性和擴展性;
    • 許多人已經在用了,現今很流行,許多聞名的大公司也在用 TensorFlow;
    • ………..
  • 上面這些都不重要,讓我們進入正題。

2 Graphs and Sessions(圖和會話)

  • 什麼是 張量(Tensor)

    所謂的 TensorFlow 中的 TensorFlow 是什麼呢?這個問題其實比較複雜,我們這裏就不細講,就給出一個非常簡單的概念:

    • 0 維張量:標量(scalar)。也就是我們一般意義上的 數字(number)

    • 1 維張量:向量(vector)

    • 2 維張量:矩陣(matrix)

  • TensorFlow separates definition of computations from their execution.

    TensorFlow 將計算的定義和執行分開了。所以我們使用 TensorFlow 計算的步驟應該是:

    1. 定義一張 計算圖(Graphs)
    2. 使用一個 會話(session) 去執行圖中的操作。
  • 假如你在終端輸入下面兩行代碼:

    import tensorflow as tf
    a = tf.add(3, 5)

    上面兩行代碼定義的其實就是:

    1527163941084

    如果你學過神經網絡,會發現這東西很眼熟。就像神經網絡是由很多神經元組成的一樣,TensorFlow 中的計算圖也將由許多如上的結構組成。其中,

    • 節點(Nodes):表示操作,變量或者常亮;
    • 邊(Edges):表示張量(tensors)。
  • 現在我們試着將上面定義的東西打印出來看一下:

    import tensorflow as tf
    a = tf.add(3, 5)
    print(a)

    輸出:

    >> Tensor("Add:0", shape=(), dtype=int32)

    沒有輸出我們期待的 8 ,要怎麼樣能計算出 a 的值呢?答案就是 session.

  • 我們來創建一個 session 試試:

    import tensorflow as tf
    a = tf.add(3, 5)
    sess = tf.Session()
    print(sess.run(a))
    sess.close()

    輸出:

    >> 8

    有了 session,我們就能計算出 a 的值了 。

    但是以防我們忘記關閉 session,所以官方推薦我們這麼寫:

    import tensorflow as tf
    a = tf.add(3, 5)
    with tf.Session() as sess:
          print(sess.run(a))
  • 所以 session 的作用是什麼呢?

    A Session object encapsulates the environment in which Operation objects are executed, and Tensor objects are evaluated.

    Session will also allocate memory to store the current values of variables .

    因爲英語比較渣,所以一直翻譯不通順這兩句話,大概意思就是 session 封裝了一個環境,在這個環境裏,就可以去執行圖中各種操作了,同時 session 還會去分配變量的內存。

  • 我們還可以定義更多節點的圖:

    x = 2
    y = 3
    op1 = tf.add(x, y)
    op2 = tf.multiply(x, y)
    op3 = tf.pow(op2, op1)
    with tf.Session() as sess:
    op3 = sess.run(op3)

    上述代碼定義瞭如下的圖:

    1527165520644

    需要指出的一點是,TensorFlow 並不會自動的去計算圖中所有節點的值,只有這個節點需要被計算出來的時候(比如其他節點的輸出依賴此節點的輸出。或者用戶想要計算這個節點的值),TensorFlow 纔會去計算,因爲並不是每一次計算都需要所有節點的值。

3 分佈式計算

  • tensorFlow 之所以強大,有一個原因是因爲它可以將一張圖分成多個部分並行計算,比如在你的 4 張 GTX 1080Ti 上並行計算。

    1527165872840

    可以自行指定要在哪個CPU 或者 GPU 上執行:

    
    # Creates a graph.
    
    with tf.device('/gpu:2'):
       a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], name='a')
       b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], name='b')
       c = tf.multiply(a, b)
    
    
    # Creates a session with log_device_placement set to True.
    
    sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))
    
    
    # Runs the op.
    
    print(sess.run(c))

4 創建多張圖

  • 建議你不要這麼做,因爲

    • 因爲多張圖意味着要多個 session ,而每個 session 都會努力的搶佔你計算機上的所有資源;
    • 不能在不通過 numpy 的情況下傳遞數據,不然就不能分佈式計算了;
    • 可以通過分開一張圖變成多張子圖來滿足你想要多張圖的需求。

    所以你應該不再想創建多張圖了。

  • 如果你還是堅持的話………….那你自己去找其他資料吧,裏面有很多坑。

5 Why graphs?

  1. 節省計算。只去計算那些你想要求值的子圖。
  2. 分解計算,以便可以實現自動微分。
  3. 促進分佈式計算,將計算過程分佈在 CPUGPUTPU或者你想要的其他設備。
  4. 許多常見的機器學習模型都是可以看成有向圖結構的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章