首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不使用可变范围的Tensorflow tf.layers,tf.contrib.layers

不使用可变范围的Tensorflow tf.layers,tf.contrib.layers
EN

Stack Overflow用户
提问于 2017-09-17 00:48:21
回答 1查看 701关注 0票数 0

我开始使用TensorFlow进行一些简单的Q学习,但在尝试使用使用tf.layerstf.contrib.layers构造的层的可变作用域时遇到了麻烦。简而言之,我想将相同的层应用于不同的输入张量(例如,保存当前和下一个q值)。下面是一个使用tf.layers的最小示例

代码语言:javascript
复制
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)

试图执行此代码会出现以下异常:

代码语言:javascript
复制
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)期间会失败,但例外情况是:

代码语言:javascript
复制
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页上发现了对层使用可变作用域。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-18 15:18:22

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

我想你想要重用这些变量来进行Q学习。因此,解决方案非常简单:第一次定义这些变量时,不要使用reuse,然后可以设置reuse=True

在您所做的演示中,我想他们之前已经定义了变量。

这个指南将帮助您在更多。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46259715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档