使用相同的RNN两次

时间:2018-03-10 18:18:52

标签: python tensorflow machine-learning graph recurrent-neural-network

我想在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,即共享权重)。 在类似的帖子中,我使用reuse_variables()找到了类似的解决方案:Running the same RNN over two tensors in tensorflow

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

1 个答案:

答案 0 :(得分:1)

<强>更新

在我仔细检查1.6中的源代码之后,我发现早期版本中的记忆不再是实际的(所以感谢你提出来了!)。你的代码确实重用了单元格变量,因为单元格是懒惰地初始化而只是(参见RNNCell.build()方法,它实际上创建了内核和偏差)。在构建单元格之后,在下一次调用时,它重建。这意味着,在您手动重置built状态之前,无论在不同网络中使用多长时间,单个单元实例始终保持相同的变量。这就是reuse参数不再重要的原因。

原始答案(不再有效):

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