訓練されたLSTMモデルが与えられているので、以下の例では1つのタイムステップ、つまりseq_length = 1
の推論を実行します。各タイムステップの後、次の 'バッチ'のために内部LSTM(メモリと隠し)状態を記憶する必要があります。推論の冒頭では、内部LSTM状態init_c, init_h
が入力を考慮して計算されます。これらは、LSTMStateTuple
オブジェクトに格納され、LSTMに渡されます。トレーニング中、この状態はタイムステップごとに更新されます。しかし、推論のために、state
をバッチ間に保存したい、すなわち、最初の状態を最初から計算する必要があり、その後、各「バッチ」(n = 1)の後にLSTM状態を保存する必要があります。TensorFlow:次のバッチ(ステートフルLSTM)のLSTM状態を覚えている
この関連するStackOverflow質問:Tensorflow, best way to save state in RNNs?が見つかりました。しかし、これは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 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の状態を保存するための最良の方法?](http://stackoverflow.com/questions/37969065/tensorflow-best-way-to-save-state-in-rnns) –