2017-09-17 77 views
0

我開始使用TensorFlow進行一些簡單的Q-學習,但在試圖使用變量作用域時使用tf.layerstf.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頁找到了圖層的可變範圍的使用。

回答

1

兩個錯誤是不同的:第一個發生在process(inp1),它試圖找到存在的變量,但沒有;第二個發生在process(inp2),其中存在相同名稱的變量,但它嘗試創建一個具有相同名稱的新變量,不允許。

我想你想重用這些變量進行Q學習。所以解決辦法很簡單:第一次定義這些變量時,不要使用reuse,那麼你可以設置reuse=True

在您給出的演示文稿中,我想他們已經在之前定義了變量。

這個guide會幫助你下更多。