tf.Variable(), tf.get_variable(), tf.variable_scope(), tf.name_scope()——不同的變量創建方式決定了他們不同的用途

  • tf.get_variable() 創建變量的時候必須要提供 name

  • tf.Variable()創建變量之前不會檢查是否有同樣name的變量,但tf.get_variable() 會。
  • 因爲上一條的原因,所以tf.get_variable() 可以方便共享變量,前提是要配合`tf.variable_scope()`使用。每個在tf.variable_scope()定義的變量命名空間之內創建的變量,都會檢查name是否一樣,若一樣,則採取“變量共享”。但對於tf.Variable(),則是直接創建一個name後面多個“_1”的新變量,變量之間自然也是不共享的
  • tf.variable_scope() & tf.name_scope():
    • tf.name_scope() 主要是用來管理命名空間的,這樣子讓我們的整個模型更加有條理。
    • tf.variable_scope() 的作用是爲了實現變量共享,它和 tf.get_variable() 一起,來完成變量共享的功能。
    • 在tf.name_scope()生成的命名空間內部,對於tf.get_variable()方法產生的變量沒有任何限制能力——也就是說,name_scope定義的name不會顯現在tf.get_variable()方法產生的變量的name上。
  • 總結:
    • tf.name_scope()是tensorflow幫我出了一套命名管理體系,好比你叫王二,你同學叫李四。然後有兩個男人是他倆的爹,你閉着眼都知道王八肯定是王二他爹,李大是李四他爹一樣。。。。。這有2張圖,生動現實了命名空間name_scope的作用:

                                                                                              沒有命名空間 

                                                                                                有命名空間

  • tf.variable_scope()和tf.get_variable()大多數時間是一起使用的,用法爲先用tf.variable_scope()創建變量空間,然後在這個變量空間內用tf.variable_scope()創建可以共享的變量,同時這也要求了變量不可有一樣的name(name一樣你倆就共享了嘛)
  • tf.Variable()創建的變量可以受tf.name_scope()影響。創建的變量也不會被共享,name一樣的話就會自動在name後面加後綴
  • 這樣區分對於tensorflow程序而言,最大的意義是,對於weight和bias這種,每次進行卷積等操作都需要學習、更新的變量而言,變量的複用是必須的,所以weight和bias變量必須共享,否則幾輪梯度下降下來出來了多少個weight和bias,就是去了梯度下降參數更新的意義了。如果用tf.varaible_scope() + tf.get_variable()一起定義共享變量,則每次更新的都是那麼一套weight+bias,這就合理了
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章