簡體   English   中英

Tensorflow tf.layers,tf.contrib.layers不適用於可變范圍

[英]Tensorflow tf.layers, tf.contrib.layers not working with variable scope

我開始使用TensorFlow進行一些簡單的Q學習,但是在嘗試將可變范圍與使用tf.layerstf.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM