[英]Tensorflow tf.layers, tf.contrib.layers not working with variable scope
我開始使用TensorFlow進行一些簡單的Q學習,但是在嘗試將可變范圍與使用tf.layers
和tf.contrib.layers
構造的層一起使用時遇到了麻煩。 簡而言之,我想將相同的圖層應用於不同的輸入張量(例如,保存當前和下一個Q值)。 這是使用tf.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)
期間會失敗,但以下情況除外:
ValueError: Variable foo/bar/kernel already exists, disallowed.
Did you mean to set reuse=True in VarScope?
不幸的是,使用tf.contrib.layers
時會發生類似的錯誤。
我的問題是:有沒有辦法使tf.layers
在可變范圍內工作? 我知道我可以分別定義權重和偏差,但是最好保留tf.layers
給出的抽象。 非常感謝!
我的設置是在Windows 10上運行Python 3.6.1的TensorFlow 1.3.0(CPU)(通過pip安裝在64位Anaconda 4.4.0上)。
PS我在本演示文稿的第17頁上發現了對層使用可變范圍。
有兩個錯誤是不同的:第一個錯誤發生在process(inp1)
,它試圖找到存在的變量,但是沒有找到; 第二個發生在process(inp2)
,其中存在具有相同名稱的變量,但是它試圖創建一個具有相同名稱的新變量,不允許這樣做。
我想您想重用這些變量進行Q學習。 因此解決方案非常簡單:第一次定義這些變量時,不要使用reuse
,然后可以設置reuse=True
。
在您的演示文稿中,我想它們之前已經定義了變量。
本指南將為您提供更多幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.