我想在 Tensorflow 中设计一个单层 RNN,以便最后一个输出(y(t-1))
参与更新隐藏状态。
h(t) = tanh(W_{ih} * x(t) + W_{hh} * h(t) + **W_{oh}y(t - 1)**)
y(t) = W_{ho}*h(t)
如何将最后一个输入y(t - 1)
作为更新隐藏状态的输入?
我想在 Tensorflow 中设计一个单层 RNN,以便最后一个输出(y(t-1))
参与更新隐藏状态。
h(t) = tanh(W_{ih} * x(t) + W_{hh} * h(t) + **W_{oh}y(t - 1)**)
y(t) = W_{ho}*h(t)
如何将最后一个输入y(t - 1)
作为更新隐藏状态的输入?
y(t-1) 是最后一个输入还是输出?在这两种情况下,它都不是直接适合 TensorFlow RNN 单元抽象。如果您的 RNN 很简单,您可以自己编写循环,然后您就可以完全控制。我会使用的另一种方法是预处理您的 RNN 输入,例如,执行以下操作:
处理输入[t] = tf.concat(输入[t], 输入[t-1])
然后用 processes_input 调用 RNN 单元并在那里拆分。
一种可能性是使用tf.nn.raw_rnn
我在本文中找到的。检查我对这个相关帖子的回答。
我将您所描述的称为“自回归 RNN”。这是一个(不完整的)代码片段,展示了如何使用以下代码创建一个tf.nn.raw_rnn
:
import tensorflow as tf
LSTM_SIZE = 128
BATCH_SIZE = 64
HORIZON = 10
lstm_cell = tf.nn.rnn_cell.LSTMCell(LSTM_SIZE, use_peepholes=True)
class RnnLoop:
def __init__(self, initial_state, cell):
self.initial_state = initial_state
self.cell = cell
def __call__(self, time, cell_output, cell_state, loop_state):
emit_output = cell_output # == None for time == 0
if cell_output is None: # time == 0
initial_input = tf.fill([BATCH_SIZE, LSTM_SIZE], 0.0)
next_input = initial_input
next_cell_state = self.initial_state
else:
next_input = cell_output
next_cell_state = cell_state
elements_finished = (time >= HORIZON)
next_loop_state = None
return elements_finished, next_input, next_cell_state, emit_output, next_loop_state
rnn_loop = RnnLoop(initial_state=initial_state_tensor, cell=lstm_cell)
rnn_outputs_tensor_array, _, _ = tf.nn.raw_rnn(lstm_cell, rnn_loop)
rnn_outputs_tensor = rnn_outputs_tensor_array.stack()
在这里,我们用一些向量初始化 LSTM 的内部状态initial_state_tensor
,并将零数组作为输入t=0
。之后,当前时间步的输出是下一个时间步的输入。