9

我想在 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)作为更新隐藏状态的输入?

4

3 回答 3

2

y(t-1) 是最后一个输入还是输出?在这两种情况下,它都不是直接适合 TensorFlow RNN 单元抽象。如果您的 RNN 很简单,您可以自己编写循环,然后您就可以完全控制。我会使用的另一种方法是预处理您的 RNN 输入,例如,执行以下操作:

处理输入[t] = tf.concat(输入[t], 输入[t-1])

然后用 processes_input 调用 RNN 单元并在那里拆分。

于 2016-02-03T01:34:02.590 回答
0

一种可能性是使用tf.nn.raw_rnn我在本文中找到的。检查我对这个相关帖子的回答。

于 2018-03-15T15:00:38.707 回答
0

我将您所描述的称为“自回归 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。之后,当前时间步的输出是下一个时间步的输入。

于 2019-02-04T03:04:56.813 回答