我开始使用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给出的抽象。非常感谢!
我的安装程序是TensorFlow 1.3.0 (CPU),在Windows10上运行Python3.6.1(通过64位Anaconda4.4.0上的PIP4.4.0安装)。
我在这份报告的第17页上发现了对层使用可变作用域。
发布于 2017-09-18 15:18:22
两个错误是不同的:第一个错误发生在process(inp1)中,它试图查找存在的变量,但没有;第二个错误发生在process(inp2)中,其中存在同名变量,但它试图创建同名的新变量,这是不允许的。
我想你想要重用这些变量来进行Q学习。因此,解决方案非常简单:第一次定义这些变量时,不要使用reuse,然后可以设置reuse=True。
在您所做的演示中,我想他们之前已经定义了变量。
这个指南将帮助您在更多。
https://stackoverflow.com/questions/46259715
复制相似问题