我发现在占位符中保存所有层的整个状态是最容易的。
init_state = np.zeros((num_layers, 2, batch_size, state_size))
...
state_placeholder = tf.placeholder(tf.float32, [num_layers, 2, batch_size, state_size])
然后解压缩它并创建一个LSTMStateTuples元组,然后再使用本机tensorflow RNN Api。
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)
的state
-那么变量将被feeded下一批作为占位符。
0
给定训练有素的LSTM模型,我想对单个时间步执行推断,即在下面的示例中
seq_length = 1
。在每个时间步之后,需要记住下一个“批”的内部LSTM(内存和隐藏)状态。对于推论的开始,内部LSTM状态init_c, init_h
在给定输入的情况下进行计算。然后将它们存储在传递给LSTM的LSTMStateTuple
对象中。在训练期间,此状态会在每个时间步更新。但是,为了进行推断,我希望state
在批次之间保存,即,仅需要在最开始时计算初始状态,然后在每个“批次”(n = 1)之后保存LSTM状态。我发现了这个与StackOverflow相关的问题: Tensorflow,在RNN中保存状态的最佳方法吗? 。但是,这仅在
state_is_tuple=False
,但是TensorFlow很快将弃用此行为(请参见rnn_cell.py )。 Keras似乎有一个很好的包装器,可以使有状态的 LSTM成为可能,但是我不知道在TensorFlow中实现这一目标的最佳方法。 TensorFlow GitHub上的这个问题也与我的问题有关: https : //github.com/tensorflow/tensorflow/issues/2838有人建议建立有状态的LSTM模型吗?