人工智慧-Tensorflow 中 Scope命名方法

在Tensorflow中,有兩個scope, 一個是name_scope一個是variable_scope。而Tensorflow 當中也有兩種途徑生成變數 variable,一種是 tf.get_variable(),另一種是tf.variable()。
  • tf.name_scope:

                                        
                                                                                                                                                    圖1 tf.name_scope宣告變數

                                                                                                                                                      
                                                                                                                                                                     圖2 程式結果

    在tf.name_scope()中使用tf.variable()定義變數的時候,雖然name都一樣,但是為了不重複變數名,Tensorflow輸出的變數名並不是一樣的。所以,本質上var2、var21、var22並不是一樣的變數。而另一方面,使用tf.get_variable()定義的變數不會被tf.name_scope()當中的名字所影響,相當於tf.name_scope()對tf.get_variable()是無效的。

  • tf.variable_scope()

       如果想要達到重複利用變數的效果, 我們就要使用tf.variable_scope(), 並搭配tf.get_variable()。這種方式產生和提取變數,不像tf.Variable()每次都會產生新的變數,tf.get_variable() 如果遇到了同樣名字的變數時, 它會單純的提取這個同樣名字的變數(避免產生新變數), 當在重複使用相同變數名字的時候, 一定要在程式碼中強調 scope.reuse_variables() ,否則系統將會報錯, 以為你只是不小心重複使用到了一個已經使用過的變數。


                                              

                                                                                                                                                      圖3 tf.variable_scope 宣告變數
                                                                                                                                               

                                                                                                                                                                     圖4 程式結果
上面結果中,var3和var3_reuse是同一個變數,而var4和var4_reuse是不同的變數。

       在tf.variable_scope()中,使用tf.get_variable()方法建立變數時,如果這個變數已經存在,想直接使用這個變數,加上scope.reuse_variables()即可;如果沒有加上scope.reuse_variables(),Tensorflow會報重複使用變數的錯誤。

不管是在tf.name_scope還是在tf.variable_scope()中,tf.Variable()都是在建立新的變數。如果這個變數存在,則字尾會增加0、1、2等數字編號予以區別。

結論:
tf.name_scope()可以簡單的理解為為了更好的管理命名空間的方法。且只會影響tf.Variable()定義的變量的name。
tf.variable_scope()則可以影響到tf.get_variable()創建的對象的name。因此可以與tf.get_variable()一同使用,完成變量共享的目的,同時對命名空間進行管理。

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論