Tensorflow tf.layers,tf.contrib.layers不使用变量范围

时间:2017-09-17 00:48:21

标签: python tensorflow

我开始使用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?

我了解在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页上找到了对图层使用变量作用域。

1 个答案:

答案 0 :(得分:2)

两个错误是不同的:第一个错误发生在process(inp1),它试图找到现有的变量,但没有;第二个发生在process(inp2),其中存在具有相同名称的变量,但它尝试创建一个具有相同名称的新变量,不允许。

我想您希望将这些变量重用于Q-learning。所以解决方案很简单:第一次定义这些变量时,不要使用reuse,那么你可以设置reuse=True

在你给出的演示文稿中,我猜他们之前已经定义了变量。

guide可以为您提供更多帮助。