【问题标题】:LSTMStateTuple vs cell.zero_state() for RNN in TensorflowTensorflow 中 RNN 的 LSTMStateTuple 与 cell.zero_state()
【发布时间】:2017-04-03 19:30:12
【问题描述】:

我对在 Tensorflow 中为 RNN 使用初始状态张量的正确方法是什么感到困惑。使用LSTMStateTuplecell.zero_state 的教程之间几乎有50/50 的比例。

这两个是一样的吗?如果有,为什么有两种方式?

在一个示例中,他们使用tf.nn.rnn_cell.LSTMStateTuple 来设置初始状态,而在另一个示例中,他们使用cell.zero_state()

为什么有两种方法?什么时候更喜欢其中一个?设置state_is_tuple时只能使用LSTMStateTuple吗?如果是这样,cell.zero_state() 不再起作用了吗?

【问题讨论】:

  • 两者是不同的东西。 state_is_tuple 用于 LSTM 单元,因为 LSTM 单元的状态是一个元组。 cell.zero_state 是所有 RNN 单元状态的初始化器。
  • 查看这个关于为什么 LSTM 状态是一个元组的解释:colah.github.io/posts/2015-08-Understanding-LSTMs
  • 是的,但是如果您查看我提供的两个示例,它们使用两种不同的方法来设置初始状态。
  • 第一个更明确。 cell.zero_state 将根据 RNN 单元初始化正确的状态类(state_is_tuple 为真或假)。这行init_state = tf.nn.rnn_cell.LSTMStateTuple(cell_state, hidden_state) 可以与cell.zero_state(batch_size) 互换,其中单元格之前定义为cell = tf.nn.rnn_cell.BasicLSTMCell(state_size, state_is_tuple=True)

标签: machine-learning tensorflow deep-learning


【解决方案1】:

两者是不同的东西。 state_is_tuple 用于 LSTM 单元,因为 LSTM 单元的状态是一个元组。 cell.zero_state 是所有 RNN 单元状态的初始化器。

您通常更喜欢cell.zero_state 函数,因为它会根据state_is_tuple 是否为真来初始化所需的状态类。

请参阅this GitHub 问题,您可以在其中看到推荐的cell.zero_state -“在单元格对象上使用 zero_state 函数”。

您可能需要cell.zero_state 的另一个原因是它与单元的类型(LSTM、GRU、RNN)无关,您可以执行以下操作:

if type == 'GRU':
   cell = BasicGRUCell
else:
   cell = BasicLSTMCell(state_is_tuple=True)

init_state = cell.zero_state(batch_size)

初始状态设置正常。

LSTMStateTuple 仅适用于状态为元组的单元格。

何时使用 LSTMStateTuple?

当您使用自定义值(由培训师传递)初始化您的状态时,您需要使用LSTMStateTuplecell.zero_state() 将返回所有值等于 0.0 的状态。

如果您想在批次之间保持状态,则必须在每个批次之后获取它并将其添加到您的 feed_dict 下一个批次。

请参阅this,了解为什么 LSTM 状态是一个元组。

【讨论】:

  • 在批次之间保持状态不是使用 LSTMStateTuple 的理由吗?我也可以用 cell.zero_state() 做到这一点...?
  • 你是对的。您也可以使用cell.zero_state() 来做到这一点,这就是为什么在大多数情况下建议使用 cell.zero_state 的原因。仍然可以选择在批次之间传递 LSTMStateTuple。
猜你喜欢
  • 2019-07-26
  • 2017-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
相关资源
最近更新 更多