【问题标题】:Tensorflow creates a new set of already existing variables each session run?Tensorflow 在每次会话运行时都会创建一组新的现有变量?
【发布时间】:2016-11-27 20:48:34
【问题描述】:

我终于使用我的 LSTM 模型来预测事物了。但是,我遇到了一个我不太了解的新问题。如果我尝试使用

sess.run(pred, feed_dict={x: xs})

第一次预测效果很好,但任何后续预测都会抛出错误:

ValueError: 变量 weight_def/weights 已经存在,不允许。您的意思是在 VarScope 中设置 reuse=True 吗?

现在,关于这方面的话题有很多——而且大多数都可以通过按照它的要求轻松解决——只需在有问题的行周围创建一个变量范围,并使变量重用成为真的。现在,如果我这样做,我会收到以下错误:

ValueError:变量 rnn_def/RNN/BasicLSTMCell/Linear/Matrix 不存在,或者不是使用 tf.get_variable() 创建的。您的意思是在 VarScope 中设置 reuse=None 吗?

这让我很头疼。我一遍又一遍地阅读Tensorflow Variable Sharing 文档,但我终其一生都无法弄清楚我做错了什么。这里有问题的行

with tf.variable_scope("rnn_def"):
            outputs, states = rnn.rnn(self.__lstm_cell,
                                      self.__x,
                                      dtype=tf.float32)
            self.__outputs = outputs
            self.__states = states

我将此代码嵌套在一个更大的类中,该类仅包含图表的其余部分。为了训练它,我只是一遍又一遍地调用我的“训练”方法。这似乎工作正常,问题最终是预测

所以我的问题有两个:

  1. 为什么我只在 first 预测之后才需要某种变量共享,但第一次调用没有失败?我需要什么来修复此代码,以便我可以多次预测而不会导致错误?

  2. 什么时候变量共享有用,为什么我每次运行 Tensorflow 时都会创建新变量?我怎样才能防止这种情况(我想防止这种情况吗?)?

谢谢!

【问题讨论】:

  • 你在 jupiter notebook 中运行吗?如果您使用默认图表,则每次运行单元格时,它都会将变量再次添加到图表中。
  • @fabrizioM 我不是,我只是从命令行调用它。

标签: python variables scope tensorflow prediction


【解决方案1】:

向该代码块添加打印语句。我怀疑它被多次调用。或者,也许您正在创建该类的多个实例,其中每个类都应该有自己的范围名称。

回答您的问题。

为什么我只在第一次之后才需要某种变量共享 预测但第一次通话不会失败?我需要什么来解决这个问题 代码,这样我就可以多次预测而不会导致错误?

不,你没有。创建 RNN 的代码块可能被意外调用了多次。

变量共享何时有用,为什么 TensorFlow 会创建新的 每次我运行它的变量?我怎样才能防止这种情况(我想 防止它?)?

这在以下情况下很有用,根据是训练还是预测,我的部分图表有不同的输入源。

x_train, h_train = ops.sharpen_cell(x_train, h_train, 2, n_features, conv_size, n_convs, conv_activation, 'upsampler')
self.cost += tf.reduce_mean((x_train - y_train) ** 2)

level_scope.reuse_variables()

x_gen, h_gen = ops.sharpen_cell(x_gen, h_gen, 2, n_features, conv_size, n_convs, conv_activation, 'upsampler')
self.generator_outputs.append(tf.clip_by_value(x_gen, -1, 1))

在此示例中,重复使用了由训练器训练的生成器的变量。如果您想在循环中展开和 RNN,它也很有用。比如这种情况……

y = #initial value
state = #initial state
rnn = #some sort of RNN cell
with tf.variable_scope("rnn") as scope:
  for t in range(10):
    y, state = rnn(y, state)
    scope.reuse_variabled()

在这种情况下,它将在时间步长之间重用 rnn 权重,这是 RNN 所需的行为。

【讨论】:

  • 嘿,这很棒!我现在有同样的问题,除了它现在发生在重量范围内。它似乎集中在每次我调用 run 它尝试创建一个新变量时。这是否是重用变量的情况,因为它现在试图预测而不是训练?
  • 我想我现在困惑的地方是预测和训练之间的区别,以及为什么当我在预测器上调用 run 时它会尝试重新创建具有不同权重/偏差/等的图形,而不是而不是在优化器上调用运行。如果您可以在此处添加解释,我很乐意将此标记为完全正确的答案。
  • 不应该。在调用 rnn.rnn 的地方直接放置一个 print 语句。我敢打赌,这段代码被调用了两次。
  • 确实如此,似乎所有变量块在我的代码中都被调用了两次,但我只调用了一次图形创建函数。会话运行肯定会触发多个调用。从检查点文件加载数据有帮助吗?
  • 你是调用阻塞两次而不是 tensorflow 的人。
猜你喜欢
  • 2014-04-25
  • 2014-01-15
  • 1970-01-01
  • 2013-04-24
  • 2016-02-03
  • 2013-04-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-04
相关资源
最近更新 更多