繁体   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