给定训练有素的LSTM模型,我想对单个时间步进行推理,即seq_length = 1
在下面的示例中.在每个时间步之后,需要记住内部LSTM(内存和隐藏)状态以用于下一个"批处理".在推理的最开始,init_c, init_h
给定输入计算内部LSTM状态.然后将它们存储在LSTMStateTuple
传递给LSTM 的对象中.在训练期间,每个时间步都更新此状态.然而,对于推理,我希望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模型的任何好建议吗?
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 …
Run Code Online (Sandbox Code Playgroud) 我目前在tensorflow中有一系列链接在一起的RNN的代码.我没有使用MultiRNN,因为我以后会对每一层的输出做一些事情.
for r in range(RNNS):
with tf.variable_scope('recurent_%d' % r) as scope:
state = [tf.zeros((BATCH_SIZE, sz)) for sz in rnn_func.state_size]
time_outputs = [None] * TIME_STEPS
for t in range(TIME_STEPS):
rnn_input = getTimeStep(rnn_outputs[r - 1], t)
time_outputs[t], state = rnn_func(rnn_input, state)
time_outputs[t] = tf.reshape(time_outputs[t], (-1, 1, RNN_SIZE))
scope.reuse_variables()
rnn_outputs[r] = tf.concat(1, time_outputs)
Run Code Online (Sandbox Code Playgroud)
目前我有固定的时间步数.但是我想把它改成只有一个时间步,但要记住批次之间的状态.因此,我需要为每个图层创建一个状态变量,并为每个图层指定最终状态.像这样的东西.
for r in range(RNNS):
with tf.variable_scope('recurent_%d' % r) as scope:
saved_state = tf.get_variable('saved_state', ...)
rnn_outputs[r], state = rnn_func(rnn_outputs[r - 1], saved_state)
saved_state = tf.assign(saved_state, state)
Run Code Online (Sandbox Code Playgroud)
然后,对于每个层,我需要在sess.run函数中评估已保存的状态以及调用我的训练函数.我需要为每个rnn层执行此操作.这看起来很麻烦.我需要跟踪每个保存的状态并在运行中对其进行评估.此外,运行将需要将状态从我的GPU复制到主机内存,这将是低效且不必要的.有没有更好的方法呢?