TensorFlow變數管理

marsjhao發表於2020-04-06

一、TensorFlow變數管理

1. TensorFLow還提供了tf.get_variable函式來建立或者獲取變數,tf.variable用於建立變數時,其功能和tf.Variable基本是等價的。tf.get_variable中的初始化方法(initializer)的引數和tf.Variable的初始化過程也類似,initializer函式和tf.Variable的初始化方法是一一對應的,詳見下表。

tf.get_variable和tf.Variable最大的區別就在於指定變數名稱的引數。對於tf.Variable函式,變數名稱是一個可選的引數,通過name=”v”的形式給出,對於tf.get_variable函式,變數名稱是一個必填的引數,tf.get_variable會根據這個名稱去建立或者獲取變數。

2. 通過tf.variable_scope函式可以控制tf.get_variable函式的語義。當tf.variable_scope函式的引數reuse=True生成上下文管理器時,該上下文管理器內的所有的tf.get_variable函式會直接獲取已經建立的變數,如果變數不存在則報錯;當tf.variable_scope函式的引數reuse=False或者None時建立的上下文管理器中,tf.get_variable函式則直接建立新的變數,若同名的變數已經存在則報錯。

3. 另tf.variable_scope函式是可以巢狀使用的。巢狀的時候,若某層上下文管理器未宣告reuse引數,則該層上下文管理器的reuse引數與其外層保持一致。

4.tf.variable_scope函式提供了一個管理變數名稱空間的方式。在tf.variable_scope中建立的變數,名稱.name中名稱前面會加入名稱空間的名稱,並通過“/”來分隔名稱空間的名稱和變數的名稱。tf.get_variable("foou/baru/u", [1]),可以通過帶名稱空間名稱的變數名來獲取其名稱空間下的變數。

二、TensorFlow程式設計演示

import tensorflow as tf

# 在名字為foo的名稱空間內建立名字為v的變數
with tf.variable_scope("foo"):
    v = tf.get_variable("v", [1], initializer=tf.constant_initializer(1.0))

'''
# 因為名稱空間foo內已經存在變數v,再次建立則報錯
with tf.variable_scope("foo"):
    v = tf.get_variable("v", [1])
# ValueError: Variable foo/v already exists, disallowed.
# Did you mean to set reuse=True in VarScope?
'''
# 將引數reuse引數設定為True,則tf.get_variable可直接獲取已宣告的變數
with tf.variable_scope("foo", reuse=True):
    v1 = tf.get_variable("v", [1])
    print(v == v1) # True

'''
# 當reuse=True時,tf.get_variable只能獲取指定名稱空間內的已建立的變數
with tf.variable_scope("bar", reuse=True):
    v2 = tf.get_variable("v", [1])
# ValueError: Variable bar/v does not exist, or was not created with
# tf.get_variable(). Did you mean to set reuse=None in VarScope?
'''

with tf.variable_scope("root"):
    # 通過tf.get_variable_scope().reuse函式獲取當前上下文管理器內的reuse引數取值
    print(tf.get_variable_scope().reuse) # False

    with tf.variable_scope("foo1", reuse=True):
        print(tf.get_variable_scope().reuse) # True

        with tf.variable_scope("bar1"):
            # 巢狀在上下文管理器foo1內的bar1內未指定reuse引數,則保持與外層一致
            print(tf.get_variable_scope().reuse) # True

    print(tf.get_variable_scope().reuse) # False

# tf.variable_scope函式提供了一個管理變數名稱空間的方式
u1 = tf.get_variable("u", [1])
print(u1.name) # u:0
with tf.variable_scope("foou"):
    u2 = tf.get_variable("u", [1])
    print(u2.name) # foou/u:0

with tf.variable_scope("foou"):
    with tf.variable_scope("baru"):
        u3 = tf.get_variable("u", [1])
        print(u3.name) # foou/baru/u:0

    u4 = tf.get_variable("u1", [1])
    print(u4.name) # foou/u1:0

# 可直接通過帶名稱空間名稱的變數名來獲取其名稱空間下的變數
with tf.variable_scope("", reuse=True):
    u5 = tf.get_variable("foou/baru/u", [1])
    print(u5.name)  # foou/baru/u:0
    print(u5 == u3) # True
    u6 = tf.get_variable("foou/u1", [1])
    print(u6.name)  # foou/u1:0
    print(u6 == u4) # True


相關文章