我开始使用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?
我了解在reuse=True
中设置tf.layers.dense()
会使其尝试查找已定义的图层,但可能无法执行此操作。但是如果我将调用更改为tf.layers.dense(inp, 12, name="bar")
,那么它将失败并出现相同的异常。
如果我在reuse=None
中设置了tf.variable_scope()
,则后一版本在调用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)(通过64位Anaconda 4.4.0上的pip安装)。
P.S。我在this presentation的第17页上找到了对图层使用变量作用域。
答案 0 :(得分:2)
两个错误是不同的:第一个错误发生在process(inp1)
,它试图找到现有的变量,但没有;第二个发生在process(inp2)
,其中存在具有相同名称的变量,但它尝试创建一个具有相同名称的新变量,不允许。
我想您希望将这些变量重用于Q-learning。所以解决方案很简单:第一次定义这些变量时,不要使用reuse
,那么你可以设置reuse=True
。
在你给出的演示文稿中,我猜他们之前已经定义了变量。
此guide可以为您提供更多帮助。