Tensorflow叠层GRU电池

Tensorflow叠层GRU电池,tensorflow,rnn,gated-recurrent-unit,Tensorflow,Rnn,Gated Recurrent Unit,我正在尝试在tensorflow中使用MultiRNNCell和GRUCell实现一个堆叠RNN 从GRUCell的默认实现可以看出,GRUCell的“输出”和“状态”是相同的: class GRUCell(RNNCell) ... def call(self, inputs, state): ... new_h = u * state + (1 - u) * c return new_h, new_h 这是有道理的,因为它与定义一致。但是,当我们将它们与Mul

我正在尝试在tensorflow中使用MultiRNNCell和GRUCell实现一个堆叠RNN

从GRUCell的默认实现可以看出,GRUCell的“输出”和“状态”是相同的:

class GRUCell(RNNCell)
  ...
  def call(self, inputs, state):
    ...
    new_h = u * state + (1 - u) * c
    return new_h, new_h
这是有道理的,因为它与定义一致。但是,当我们将它们与MultiRNNCell堆叠时,MultiRNNCell的定义如下:

class MultiRNNCell(RNNCell):
  ...
  def call(self, inputs, state):
    ...
    cur_inp = inputs
    new_states = []
    for i, cell in enumerate(self._cells):
      # set cur_state = states[i] ...
      cur_inp, new_state = cell(cur_inp, cur_state)
      new_states.append(new_state)
    return cur_inp, new_states
(代码已压缩以突出显示相关位)

在这种情况下,不是第一个GRUCell的任何GRUCell都会收到“输入”和“状态”的相同值。本质上,它是在单个输入上运行的,这是前一层的输出

由于重置/更新门的值取决于两个输入值(输入/状态)的比较,这难道不是一个冗余操作,它将直接从第一层传递值吗

似乎MultiRNNCell的这种架构主要是针对LSTM单元设计的,因为它们将输出和单元状态分开,但不适用于GRU单元