两次使用相同的 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 共享所有单元格的内核。
我想 运行 在 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 共享所有单元格的内核。