【问题标题】:Avoiding duplicating graph in tensorflow (LSTM model)避免在张量流中重复图形(LSTM 模型)
【发布时间】:2018-03-05 15:50:14
【问题描述】:

我有以下简化代码(实际上是展开的 LSTM 模型):

def func(a, b):
    with tf.variable_scope('name'):
        res = tf.add(a, b)
    print(res.name)
    return res

func(tf.constant(10), tf.constant(20))

每当我运行最后一行时,它似乎都会改变图表。但我不希望图表发生变化。其实我的代码是不同的,是一个神经网络模型,但它太大了,所以我添加了上面的代码。我想在不改变模型图的情况下调用func,但它会改变。我在TensorFlow 中读到了关于变量作用域的内容,但似乎我完全不明白。

【问题讨论】:

  • 是的,tf.add 添加了一个新节点。您是否一直在为新节点拨打func?如果是,则必须更改图表以引入新的操作
  • @Maxim 不,假设 func 是一个计算图。我想在 for 循环中调用它。我不希望它一直在变化。我希望它保持不变。
  • 我不明白你的情况。为什么要循环调用它?
  • @Maxim 实际上这是我的代码的一个非常简化的版本。我正在尝试实现 LSTM 模型。在我展开的 LSTM 版本中,每当我调用包含门操作的函数时,它都会产生新的东西。我希望模型保持不变,但它会一次又一次地制造它们。也感谢昨天帮助我。这真的很有帮助。
  • 不客气!知道了,我会尽力回答的。

标签: python tensorflow while-loop lstm recurrent-neural-network


【解决方案1】:

您应该查看tf.nn.dynamic_rnn 的源代码,特别是_dynamic_rnn_loop 函数python/ops/rnn.py - 它解决了同样的问题。为了不破坏图表,它使用tf.while_loop 为新数据重用相同的图表操作。但是这种方法增加了几个限制,即循环中通过的张量的形状必须是不变的。请参阅tf.while_loop 文档中的示例:

i0 = tf.constant(0)
m0 = tf.ones([2, 2])
c = lambda i, m: i < 10
b = lambda i, m: [i+1, tf.concat([m, m], axis=0)]
tf.while_loop(
    c, b, loop_vars=[i0, m0],
    shape_invariants=[i0.get_shape(), tf.TensorShape([None, 2])])

【讨论】:

  • 如果它应该是不变的,那意味着我不能使用None作为batch size或者时间序列的长度?
  • 它确实接受 'None` 静态,但它不能在任何方向上轻松增长。 TensorFlow 在运行时检查它。如果确实需要增加张量,则必须指定 shape_invariants 并注意身体功能。简而言之,tf.while_loop 很棘手。
猜你喜欢
  • 2017-09-09
  • 2018-02-03
  • 1970-01-01
  • 1970-01-01
  • 2017-12-05
  • 1970-01-01
  • 2011-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多