2017-09-13 3 views
4

Je veux savoir comment utiliser LSTM bidirectionnel multicouche dans Tensorflow.Comment utiliser LSTM bidirectionnel multicouche dans Tensorflow?

J'ai déjà implémenté le contenu de LSTM bidirectionnel, mais je veux comparer ce modèle avec le modèle multi-couches ajouté.

Comment ajouter du code dans cette partie?

x = tf.unstack(tf.transpose(x, perm=[1, 0, 2])) 
#print(x[0].get_shape()) 

# Define lstm cells with tensorflow 
# Forward direction cell 
lstm_fw_cell = rnn.BasicLSTMCell(n_hidden, forget_bias=1.0) 
# Backward direction cell 
lstm_bw_cell = rnn.BasicLSTMCell(n_hidden, forget_bias=1.0) 

# Get lstm cell output 
try: 
    outputs, _, _ = rnn.static_bidirectional_rnn(lstm_fw_cell, lstm_bw_cell, x, 
              dtype=tf.float32) 
except Exception: # Old TensorFlow version only returns outputs not states 
    outputs = rnn.static_bidirectional_rnn(lstm_fw_cell, lstm_bw_cell, x, 
            dtype=tf.float32) 

# Linear activation, using rnn inner loop last output 
outputs = tf.stack(outputs, axis=1) 
outputs = tf.reshape(outputs, (batch_size*n_steps, n_hidden*2)) 
outputs = tf.matmul(outputs, weights['out']) + biases['out'] 
outputs = tf.reshape(outputs, (batch_size, n_steps, n_classes)) 

Répondre

2

Vous pouvez utiliser deux approches différentes pour appliquer le modèle de bilstm multicouche:

1) utiliser de couche bilstm précédente comme entrée à la prochaine bilstm. Au début, vous devez créer les tableaux avec des cellules avant et arrière de longueur num_layers. Et

for n in range(num_layers): 
     cell_fw = cell_forw[n] 
     cell_bw = cell_back[n] 

     state_fw = cell_fw.zero_state(batch_size, tf.float32) 
     state_bw = cell_bw.zero_state(batch_size, tf.float32) 

     (output_fw, output_bw), last_state = tf.nn.bidirectional_dynamic_rnn(cell_fw, cell_bw, output, 
                      initial_state_fw=state_fw, 
                      initial_state_bw=state_bw, 
                      scope='BLSTM_'+ str(n), 
                      dtype=tf.float32) 

     output = tf.concat([output_fw, output_bw], axis=2) 

2) vaut également un coup d'œil à une autre approche stacked bilstm.

+1

J'ai essayé ceci et j'ai eu cette erreur: ValueError: Variable bidirectional_rnn/fw/lstm_cell/kernel existe déjà, non autorisé. Vouliez-vous dire set reuse = True dans VarScope? Pouvez-vous fournir un exemple de travail? – Rahul