2016-07-07 19 views
18

Dato un modello LSTM addestrato, desidero eseguire l'inferenza per singoli timestep, ad esempio seq_length = 1 nell'esempio seguente. Dopo ogni timestep, gli stati interni LSTM (memoria e nascosto) devono essere ricordati per il successivo "batch". Per l'inizio della deduzione vengono indicati gli LSTM interni init_c, init_h dato l'input. Questi vengono quindi memorizzati in un oggetto LSTMStateTuple che viene passato all'LSTM. Durante l'allenamento questo stato viene aggiornato ogni volta. Tuttavia, per l'inferenza, voglio che lo state venga salvato tra i lotti, vale a dire che gli stati iniziali devono essere calcolati solo all'inizio e dopo che gli stati LSTM devono essere salvati dopo ogni "batch" (n = 1).TensorFlow: ricordare lo stato LSTM per il batch successivo (stato LSTM)

Ho trovato questa domanda StackOverflow correlata: Tensorflow, best way to save state in RNNs?. Tuttavia, questo funziona solo se state_is_tuple=False, ma questo comportamento è presto deprecato da TensorFlow (vedere rnn_cell.py). Keras sembra avere un buon wrapper per rendere possibili gli LSTM LSTM, ma non conosco il modo migliore per farlo in TensorFlow. Questo problema sul GitHub di TensorFlow è anche relativo alla mia domanda: https://github.com/tensorflow/tensorflow/issues/2838

Qualcuno buoni suggerimenti per la costruzione di un modello LSTM stateful?

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

Possibile duplicato di [Tensorflow, il modo migliore per salvare lo stato negli RNN?] (Http://stackoverflow.com/questions/37969065/tensorflow-best-way-to-save-state-in-rnns) –

risposta

17

Ho scoperto che era più semplice salvare l'intero stato per tutti i livelli in un segnaposto.

init_state = np.zeros((num_layers, 2, batch_size, state_size)) 

... 

state_placeholder = tf.placeholder(tf.float32, [num_layers, 2, batch_size, state_size]) 

Poi scompattarlo e creare una tupla di LSTMStateTuples prima di utilizzare il tensorflow nativo 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 passa 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) 

Il state - variabile sarà poi alimentato al successivo gruppo come segnaposto.

6

Tensorflow, il modo migliore per salvare lo stato negli RNN? era in realtà la mia domanda iniziale. Il codice qui sotto è come uso le tuple di stato.

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() 

Invece di utilizzare tf.nn.rnn_cell.LSTMStateTuple mi basta creare una lista di liste che funziona bene. In questo esempio non sto salvando lo stato. Tuttavia si potrebbe facilmente aver fatto lo stato di variabili e appena usato assegnare per salvare i valori.

Problemi correlati