Python TensorFlow:记住下一批的LSTM状态(有状态LSTM)

Python TensorFlow:记住下一批的LSTM状态(有状态LSTM),python,tensorflow,lstm,recurrent-neural-network,stateful,Python,Tensorflow,Lstm,Recurrent Neural Network,Stateful,给定一个经过训练的LSTM模型,我想对单个时间步执行推断,即下面示例中的seq_length=1。在每个时间步之后,需要为下一个“批处理”记住内部LSTM(内存和隐藏)状态。对于推断的最开始,在给定输入的情况下,计算内部LSTM状态init_c,init_h。然后将它们存储在传递给LSTM的LSTMStateTuple对象中。在培训期间,此状态会在每个时间步更新。然而,为了进行推断,我希望在批之间保存状态,即只需要在最开始时计算初始状态,然后在每个“批”(n=1)之后保存LSTM状态 我发现了这

给定一个经过训练的LSTM模型,我想对单个时间步执行推断,即下面示例中的
seq_length=1
。在每个时间步之后,需要为下一个“批处理”记住内部LSTM(内存和隐藏)状态。对于推断的最开始,在给定输入的情况下,计算内部LSTM状态
init_c,init_h
。然后将它们存储在传递给LSTM的
LSTMStateTuple
对象中。在培训期间,此状态会在每个时间步更新。然而,为了进行推断,我希望在批之间保存
状态
,即只需要在最开始时计算初始状态,然后在每个“批”(n=1)之后保存LSTM状态

我发现了这个相关的StackOverflow问题:。然而,这仅在
状态为\u tuple=False时有效,但TensorFlow很快就会反对这种行为(请参阅)。Keras似乎有一个很好的包装器来实现有状态的LSTM,但我不知道在TensorFlow中实现这一点的最佳方法。TensorFlow GitHub上的这个问题也与我的问题有关:

有没有关于构建有状态LSTM模型的好建议

inputs  = tf.placeholder(tf.float32, shape=[None, seq_length, 84, 84], name="inputs")
targets = tf.placeholder(tf.float32, shape=[None, seq_length], name="targets")

num_lstm_layers = 2

with tf.variable_scope("LSTM") as scope:

    lstm_cell  = tf.nn.rnn_cell.LSTMCell(512, initializer=initializer, state_is_tuple=True)
    self.lstm  = tf.nn.rnn_cell.MultiRNNCell([lstm_cell] * num_lstm_layers, state_is_tuple=True)

    init_c = # compute initial LSTM memory state using contents in placeholder 'inputs'
    init_h = # compute initial LSTM hidden state using contents in placeholder 'inputs'
    self.state = [tf.nn.rnn_cell.LSTMStateTuple(init_c, init_h)] * num_lstm_layers

    outputs = []

    for step in range(seq_length):

        if step != 0:
            scope.reuse_variables()

        # CNN features, as input for LSTM
        x_t = # ... 

        # LSTM step through time
        output, self.state = self.lstm(x_t, self.state)
        outputs.append(output)

Tensorflow,在RNN中保存状态的最佳方法?这其实是我最初的问题。下面的代码是如何使用状态元组

with tf.variable_scope('decoder') as scope:
    rnn_cell = tf.nn.rnn_cell.MultiRNNCell \
    ([
        tf.nn.rnn_cell.LSTMCell(512, num_proj = 256, state_is_tuple = True),
        tf.nn.rnn_cell.LSTMCell(512, num_proj = WORD_VEC_SIZE, state_is_tuple = True)
    ], state_is_tuple = True)

    state = [[tf.zeros((BATCH_SIZE, sz)) for sz in sz_outer] for sz_outer in rnn_cell.state_size]

    for t in range(TIME_STEPS):
        if t:
            last = y_[t - 1] if TRAINING else y[t - 1]
        else:
            last = tf.zeros((BATCH_SIZE, WORD_VEC_SIZE))

        y[t] = tf.concat(1, (y[t], last))
        y[t], state = rnn_cell(y[t], state)

        scope.reuse_variables()

我没有使用
tf.nn.rnn\u cell.LSTMStateTuple
而是创建了一个列表列表,它可以正常工作。在本例中,我没有保存状态。但是,您可以轻松地从变量中创建状态,只需使用assign来保存值。

我发现在占位符中保存所有图层的整个状态是最简单的

init_state = np.zeros((num_layers, 2, batch_size, state_size))

...

state_placeholder = tf.placeholder(tf.float32, [num_layers, 2, batch_size, state_size])
然后在使用本机tensorflow RNN Api之前,将其解压缩并创建一个LSTMStateTuples元组

l = tf.unpack(state_placeholder, axis=0)
rnn_tuple_state = tuple(
[tf.nn.rnn_cell.LSTMStateTuple(l[idx][0], l[idx][1])
 for idx in range(num_layers)]
)
RNN在API中传递:

cell = tf.nn.rnn_cell.LSTMCell(state_size, state_is_tuple=True)
cell = tf.nn.rnn_cell.MultiRNNCell([cell]*num_layers, state_is_tuple=True)
outputs, state = tf.nn.dynamic_rnn(cell, x_input_batch, initial_state=rnn_tuple_state)
状态
-变量将作为占位符输入下一批

可能重复的