2016-07-07 14 views
18

訓練された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) 
+2

[Tensorflow、RNNの状態を保存するための最良の方法?](http://stackoverflow.com/questions/37969065/tensorflow-best-way-to-save-state-in-rnns) –

答えて

17

プレースホルダ内のすべてのレイヤーの状態全体を保存するのが最も簡単だったことが分かりました。

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に渡す:state

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) 

- 変数は、次に、プレースホルダとして次のバッチにfeededします。

6

Tensorflow、RNNsに状態を保存する最も良い方法はありますか?実際に私の元の質問だった。コードは、私がどのように状態タプルを使用するかを示しています。

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_cell.LSTMStateTupleを使用するのではなく、うまく動作するリストのリストを作成するだけです。この例では、状態を保存していません。しかし、あなたは簡単に変数から状態を作り出し、代入を使って値を保存することができます。

関連する問題