tensorflow裏建立變量(tf.Variable,tf.get_variable,tf.name_scope,f.variable_scope)

 

 一、

      對於使用tf.Variable來說,tf.name_scope和 tf.variable_scope功能一樣,都是給變量加前綴,相當於分類管理。這樣在不同的scope中就可以給變量取相同的名字也不會衝突。

二、

       對於tf.get_variable來說,tf.name_scope對其無效,只有在 tf.variable_scope中纔可以建立共享變量。爲什麼需要共享變量呢?因爲如果使用Variable 的話每次都會新建變量,但是大多數時候我們是希望一些變量重用的,所以就用到了get_variable()。它會去搜索變量名,然後沒有就新建,有就直接用。

       scope.reuse_variables()  # 設置共享變量

三、

      tf.Variable()同名變量指向兩個不同變量實體,而tf.get_variable ()同名變量則指向同一個變量實體。所以tf.Variable()的變量名稱是可選參數,而tf.get_variable()的變量名稱是必填參數。

四、

     tf.variable_scope()和tf.get_variable()必須要搭配使用。tf.Variable()可以單獨使用,也可以搭配tf.name_scope()使用,使變量名自動加前綴。tf.Variable()和tf.variable_scope()搭配使用語法過關但是很奇怪,不是設計者的初衷。

代碼例子:


import tensorflow as tf

with tf.name_scope('name_scope_x'):
    var1 = tf.get_variable(name='var1', shape=[1], dtype=tf.float32)
    var3 = tf.Variable(name='var2', initial_value=[2], dtype=tf.float32)
    var4 = tf.Variable(name='var2', initial_value=[2], dtype=tf.float32)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print(var1.name, sess.run(var1))
    print(var3.name, sess.run(var3))
    print(var4.name, sess.run(var4))
# 輸出結果:
# var1:0 [-0.30036557]   可以看到前面不含有指定的'name_scope_x'
# name_scope_x/var2:0 [ 2.]
# name_scope_x/var2_1:0 [ 2.]  可以看到變量名自行變成了'var2_1',避免了和'var2'衝突

如果要共享變量,則需要使用tf.variable_scope()和 tf.get_variable()

import tensorflow as tf

with tf.variable_scope('variable_scope_y') as scope:
    var1 = tf.get_variable(name='var1', shape=[1], dtype=tf.float32)
    scope.reuse_variables()  # 設置共享變量
    var1_reuse = tf.get_variable(name='var1')
    var2 = tf.Variable(initial_value=[2.], name='var2', dtype=tf.float32)
    var2_reuse = tf.Variable(initial_value=[2.], name='var2', dtype=tf.float32)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print(var1.name, sess.run(var1))
    print(var1_reuse.name, sess.run(var1_reuse))
    print(var2.name, sess.run(var2))
    print(var2_reuse.name, sess.run(var2_reuse))
# 輸出結果:
# variable_scope_y/var1:0 [-1.59682846]
# variable_scope_y/var1:0 [-1.59682846]   可以看到變量var1_reuse重複使用了var1
# variable_scope_y/var2:0 [ 2.]
# variable_scope_y/var2_1:0 [ 2.]

代碼例子來源於:   作者:Cyril     地址: https://www.zhihu.com/question/54513728/answer/181819324

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