我開始使用TensorFlow進行一些簡單的Q-學習,但在試圖使用變量作用域時使用tf.layers
和tf.contrib.layers
構建的圖層時遇到了麻煩。簡而言之,我想將相同的圖層應用於不同的輸入張量(例如,保存當前和下一個Q值)。下面是使用tf.layers
一個小例子:Tensorflow tf.layers,tf.contrib.layers與變量作用域不起作用
import tensorflow as tf
inp1 = tf.placeholder(tf.float64, (4,1))
inp2 = tf.placeholder(tf.float64, (4,1))
def process(inp):
with tf.variable_scope("foo", reuse=True):
return tf.layers.dense(inp, 12, name="bar", reuse=True)
process(inp1)
process(inp2)
試圖執行該代碼提供了以下異常:
ValueError: Variable foo/bar/kernel does not exist, or was not created with
tf.get_variable(). Did you mean to set reuse=None in VarScope?
我的理解是設置在tf.layers.dense()
reuse=True
使得它試圖找到一個已定義的層,其中它可能無法做到。但是,如果我將呼叫更改爲tf.layers.dense(inp, 12, name="bar")
,則它會因相同的例外而失敗。
如果我在tf.variable_scope()
設置reuse=None
,那麼後一個版本的process(inp2)
進行,除了通話過程中失敗:不幸的是,使用tf.contrib.layers
時發生
ValueError: Variable foo/bar/kernel already exists, disallowed.
Did you mean to set reuse=True in VarScope?
類似的錯誤。
我的問題是:有沒有辦法使tf.layers
工作與變量範圍?我知道我可以分別定義權重和偏差,但最好保留tf.layers
給出的抽象。非常感謝!
我的設置是在Windows 10(通過64位Anaconda 4.4.0上的pip安裝)上運行Python 3.6.1的TensorFlow 1.3.0(CPU)。
P.S.我在this presentation的第17頁找到了圖層的可變範圍的使用。