两次使用相同的 RNN

Use same RNN twice

我想 运行 在 Tensorflow 中的两个输入上使用相同的 RNN 单元。 我的代码:

    def lstm_cell():
        return tf.contrib.rnn.BasicLSTMCell(self.hidden_size, forget_bias=1.0, state_is_tuple=True)

    self.forward_cell = tf.contrib.rnn.MultiRNNCell([lstm_cell() for _ in range(layers)], state_is_tuple=True)
    self.initial_state = self.forward_cell.zero_state(self.batch_size, tf.float32)

    outputs1, state1 = tf.nn.dynamic_rnn(self.forward_cell, input1, initial_state=self.initial_state)

    outputs2, state2 = tf.nn.dynamic_rnn(self.forward_cell, input2, initial_state=self.initial_state)

我现在的问题是,这是执行我想要的操作的正确代码吗(在两个输入上使用相同的 RNN,即共享权重)。 在类似的 post 上,我使用 reuse_variables() 找到了类似的解决方案:

我会这样做,但使用我当前的解决方案,我没有收到重用错误,这让我感到困惑。当我打印我的变量时,它似乎也很好。 你能解释一下为什么在我的案例中没有重用错误吗?如果这是正确的?

更新:

我仔细检查了1.6的源代码后,发现我对早期版本的记忆已经不真实了(谢谢你提出来!)。您的代码确实重用了单元变量,因为单元 延迟初始化并且仅初始化一次 (请参阅 RNNCell.build() 方法,它实际上创建了内核和偏差)。构建单元格后,它不会在下一次调用时重建。这意味着单元格的单个实例始终包含相同的变量,无论它在不同网络中使用的频率如何,直到您手动重置 built 状态。这就是 reuse 参数不再重要的原因。

原答案(不再有效):

您当前的代码创建了两个独立的 RNN 层(每个层都很深),具有相同的初始状态。这意味着它们具有不同的权重矩阵、图中的不同节点等。Tensorflow 没有什么可抱怨的,因为它不知道它们是要共享的。这就是为什么你应该在调用 tf.dynamic_rnn 之前指定 reuse=True 正如你提到的问题所暗示的那样,这将导致 tensorflow 共享所有单元格的内核。