我想在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
我会这样做,但是根据我目前的解决方案,我没有得到重用错误,这让我感到困惑。当我打印我的变量时,它似乎也很好。 你能解释为什么我的情况下没有重用错误,如果这是正确的吗?
答案 0 :(得分:1)
<强>更新强>
在我仔细检查1.6中的源代码之后,我发现早期版本中的记忆不再是实际的(所以感谢你提出来了!)。你的代码确实重用了单元格变量,因为单元格是懒惰地初始化而只是(参见RNNCell.build()
方法,它实际上创建了内核和偏差)。在构建单元格之后,在下一次调用时,它不重建。这意味着,在您手动重置built
状态之前,无论在不同网络中使用多长时间,单个单元实例始终保持相同的变量。这就是reuse
参数不再重要的原因。
原始答案(不再有效):
您当前的代码会创建两个独立的RNN图层(每个图层都很深),具有相同的初始状态。这意味着它们具有不同的权重矩阵,图形中的不同节点等.Tensorflow没有什么可抱怨的,因为它不知道它们是要共享的。这就是为什么你应该在调用reuse=True
之前指定tf.dynamic_rnn
作为你提到的问题表明,这将导致tensorflow共享所有单元格的内核。