【发布时间】:2016-11-09 12:46:39
【问题描述】:
给定一个训练有素的 LSTM 模型,我想对单个时间步执行推理,即以下示例中的 seq_length = 1。在每个时间步之后,需要为下一个“批次”记住内部 LSTM(内存和隐藏)状态。在推理的最开始,给定输入计算内部 LSTM 状态init_c, init_h。然后将它们存储在传递给 LSTM 的 LSTMStateTuple 对象中。在训练期间,每个时间步都会更新此状态。但是,对于推理,我希望将state 保存在批次之间,即只需要在开始时计算初始状态,然后在每个“批次”(n = 1)之后保存 LSTM 状态。
我发现了这个相关的 StackOverflow 问题:Tensorflow, best way to save state in RNNs?。然而,这只适用于state_is_tuple=False,但这种行为很快就会被 TensorFlow 弃用(参见rnn_cell.py)。 Keras 似乎有一个很好的包装器来使 stateful LSTMs 成为可能,但我不知道在 TensorFlow 中实现这一点的最佳方法。 TensorFlow GitHub上的这个issue也和我的问题有关:https://github.com/tensorflow/tensorflow/issues/2838
对于构建有状态 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)
【问题讨论】:
标签: python tensorflow lstm recurrent-neural-network stateful