天天看點

關于tensorflow中variable以及optimizer的初始化問題

關于tensorflow中variable的初始化問題

因為一個Progressive Neural Networks的程式遇到了各種關于變量初始化的問題,在這做一個記錄和總結。

1.首先最基本的,最簡單的方式,将全部變量初始化。

session.run(tf.global_variables_initializer())

或者

session.run(tf.initialize_all_variables())

2.如果隻想初始化單個變量

session.run(my_variable.initializer)

或者

session.run(tf.variables_initializer([var_a,var_b]))

3.查詢哪些變量尚未初始化

print(session.run(tf.report_uninitialized_variables()))

4.預設情況下,tf.global_variables_initializer 不會指定變量的初始化順序。是以,如果變量的初始值取決于另一變量的值,那麼很有可能會出現錯誤。任何時候,如果在并非所有變量都已初始化的上下文中使用某個變量值(例如在初始化某個變量時使用另一變量的值),最好使用 variable.initialized_value(),而非 variable:

v = tf.get_variable(“v”, shape=(), initializer=tf.zeros_initializer())

w = tf.get_variable(“w”, initializer=v.initialized_value() + 1)

5.以上可以解決大部分變量初始化問題了,但是如果自定義了Optimizer函數,問題就變的麻煩了。如加入了以下優化函數:

optimizer = tf.train.AdamOptimizer(learning_rate=1e-4, epsilon=1e-3)

這時如果隻初始化其他變量a,b等就會出現如下錯誤。使用了未初始化的變量值,這是因為自己定義的optimizer會生成新的variables,但是并沒有初始化,是以無法通路,會報錯。

FailedPreconditionError (see above for traceback): Attempting to use uninitialized value worker_0/beta1_power

解決方法如下:

a = tf.Variables(0, dtype=tf.int32, name=‘a’, trainable=False)

temp = set(tf.all_variables())

b = tf.Variables(…)

c = tf.Variables(…)

#definition of my optimizer

optimizer = tf.train.AdamOptimizer(learning_rate=1e-4, epsilon=1e-3)

init = tf.variables_initializer(set(tf.all_varialbles())-temp)

sess.run(init)

temp将該行之前所有已初始化已指派的變量存儲在temp中,然後定義其他變量以及optimizer,最後全部初始化時減去之前已初始化的temp變量。

6.以上方法可用于指派變量在optimizer之前定義的情況,但我遇到的問題比較棘手,需要指派的變量和optimizer均被多次定義和調用,(使用A3C算法多線程計算)。是以不能簡單的全部初始化減去其中幾個變量。但是對于optimizer也有方法單獨初始化:

optimizer = tf.train.AdamOptimizer(learning_rate=1e-4, epsilon=1e-3)

session.run(tf.variables_initializer(optimizer.variables()))

optimizer有variables()這個函數,傳回内部變量清單。需要注意的是因為我用的多線程計算,每個agent都需要一個optimizer的copy,在一開始就初始化optimizer是沒有用的,必須對個optimizer都進行初始化。

參考:

【1】https://blog.csdn.net/chenxicx1992/article/details/56483180

【2】https://www.tensorflow.org/guide/variables?hl=zh_cn#initializing_variables

【3】https://stackoverflow.com/questions/35164529/in-tensorflow-is-there-any-way-to-just-initialize-uninitialised-variables/35618160#35618160