1. gzyueqian
      13352868059

      Tensorflow學習: 變量及共享變量-Python人工智能

      更新時間: 2018-09-06 17:55:24來源: java培訓瀏覽量:5928

          TensorFlow中變量主要用來表示機器學習模型中的參數,變量通過 tf.Variable 類進行操作。tf.Variable 表示張量,通過運行 op 可以改變它的值。與 tf.Tensor 對象不同,tf.Variable 存在于單個 session.run 調用的上下文之外。
          在內部,tf.Variable 存儲持久張量。具體 op 允許您讀取和修改此張量的值。這些修改在多個 tf.Session 之間是可見的,因此對于一個 tf.Variable,多個工作器可以看到相同的值。
          1. tf.Variable 創建變量
          tf.Variable的初始化函數如下所示
          其中參數
          initial_value 表示初始化值,用Tensor表示
          trainable 表示變量是否被訓練,如果被訓練,將加入到tf.GraphKeys.TRAINABLE_VARIABLES集合中,TensorFlow將計算其梯度的變量
          collections 表示一個graph collections keys的集合,這個創建的變量將被添加到這些集合中,默認集合是[GraphKeys.GLOBAL_VARIABLES].
          name: 變量的命名,默認是'Variable'
          dtype 表示類型
          例如我們創建一個變量,并且查看其name和shape
          可以看到在命名的時候,如果指定的name重復,那么w2就會被命名為"name_1:0" 這樣累加下去。
          2. 變量集合 collections
          默認情況下,每個tf.Variable都放置在以下兩個集合中:*tf.GraphKeys.GLOBAL_VARIABLES- 可以在多個設備共享的變量,*tf.GraphKeys.TRAINABLE_VARIABLES- TensorFlow 將計算其梯度的變量。
          2.1 查看集合變量列表
          要查看放置在某個集合中的所有變量的列表,可以采用如下方式
          可以看到輸出結果是所有變量的列表
          2.2 創建變量集合
          如果您不希望變量被訓練,可以將其添加到 tf.GraphKeys.LOCAL_VARIABLES 集合中。例如,以下代碼段展示了如何將名為 my_local 的變量添加到此集合中:
          或者,您可以指定 trainable=False 為 tf.get_variable 的參數:
          我們測試效果如下所示,可以看到b2的trainable=False,那么輸出collection沒有b2
          您也可以使用自己的集合。集合名稱可為任何字符串,且您無需顯式創建集合。創建變量(或任何其他對象)后,要將其添加到集合,請調用 tf.add_to_collection。例如,以下代碼將名為 my_local 的現有變量添加到名為     my_collection_name 的集合中:
          3. 共享變量
          我們查看下面的代碼,表示一個卷積神經網絡,其中包括conv1_weights, conv1_biases, conv2_weights, conv2_biases四個參數,也就是4個變量
          假設我們利用這個函數對兩張圖片進行相同的操作,也就是調用兩次,那么每次都會創建4個變量,假設我們在函數內對變量進行了優化求解,那么每次都會重新創建變量,這樣就無法復用參數,導致訓練過程無效
          TensowFlow通過變量范圍(variable scope)和tf.get_variable方法解決了共享變量(參數)的問題。
          3.1 tf.variable_scope和tf.get_variable
          tf.Variable()方法每次被調用都會創建新的變量,這樣就無法解決共享變量的問題,而tf.get_variable結合作用域即可表明我們是想創建新的變量,還是共享變量,變量作用域允許在調用隱式創建和使用變量的函數時控制變量重用。作用域還允許您以分層和可理解的方式命名變量。tf.get_variable()的機制跟tf.Variable()有很大不同,如果指定的變量名已經存在(即先前已經用同一個變量名通過get_variable()函數實例化了變量),那么get_variable()只會返回之前的變量,否則才創造新的變量。我們舉例進行說明。
          例如上面的例子中有兩個卷積層,我們先來編寫一個函數創建一個卷積/relu層,這個函數使命的變量名稱是'weights'和'biases'

          在真實模型中需要多個卷積層,我們通過變量域來區分不同層的變量,不同的變量域下的變量名車為:scope_name/variable_name, 如下所示,個卷積層的變量名稱是'conv1/weights', 'conv1/biases', 第二個卷積層的變量名稱是 'conv2/weights', 'conv2/biases'。

          但即便這樣,如果多次調用該函數,也會拋出異常,
          因為用get_variable()創建兩個相同名字的變量是會報錯的,默認上它只是檢查變量名,防止重復,如果要變量共享,就需要指定在哪個域名內可以共享變量。
          開啟共享變量有兩種方式
          方法1
          采用scope.reuse_variables()觸發重用變量,如下所示
          方法2
          使用reuse=True 創建具有相同名稱的作用域
          理解變量域的工作機理非常重要,我們對其進行梳理,當我們調用tf.get_variable(name, shape, dtype, initializer)時,這背后到底做了什么
          首先,TensorFlow 會判斷是否要共享變量,也就是判斷 tf.get_variable_scope().reuse 的值,如果結果為 False(即你沒有在變量域內調用scope.reuse_variables()),那么 TensorFlow 認為你是要初始化一個新的變量,緊接著它會判斷這個命名的變量是否存在。如果存在,會拋出 ValueError 異常,否則,就根據 initializer 初始化變量:
          而如果 tf.get_variable_scope().reuse == True,那么 TensorFlow 會執行相反的動作,就是到程序里面尋找變量名為 scope name + name 的變量,如果變量不存在,會拋出 ValueError 異常,否則,就返回找到的變量:
          變量域可以多層重疊,例如,下面的變量上有兩層的變量域,那么變量名是'foo/var/v:0'
          在同一個變量域中,如果需要調用同名變量,那么需要重用變量即可,例如v1和v兩個變量時相同的,因為變量名都是'foo/v'
          總結:
          tf.get_variable()默認上它只檢查變量名,如果變量名重復,那么就會報錯;tf.Variable()每次被調用都創建相應的變量,即便變量名重復,也會創建新的變量,因此無法共享變量名。
          如果scope中開啟共享變量,那么調用tf.get_variable()就會查找相同變量名的變量,如果有,就直接返回該變量,如果沒有,就創建一個新的變量;
          如果scope沒有開啟共享變量(默認模式),那么 調用tf.get_variable()發現已有相同變量名的變量,就會報錯,如果沒有,就創建一個新的變量。
          要重用變量,需要在scope中開啟共享變量,有兩種方法,推薦種

      免費預約試聽課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 综合色桃花久久亚洲 | 日本亚洲欧洲中文字幕 | 最新亚洲国产AV | 亚洲国产精品悠悠久久琪琪 | 亚洲欧美人与动人物在线 | 久久国产精品湿香蕉网 |