Comment utiliser multicouche bidirectionnel LSTM dans Tensorflow?
Je veux savoir comment utiliser multicouche bidirectionnel LSTM dans Tensorflow.
J'ai déjà mis en œuvre le contenu de la bidirectionnel LSTM, mais j'ai envie de comparer ce modèle avec le modèle ajouté multi-couches.
Comment dois-je ajouter un peu de 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))
OriginalL'auteur Gi Yeon Shin | 2017-09-13
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser deux approches différentes pour appliquer multicouche bilstm modèle:
1) utilisation en dehors de la précédente bilstm la couche d'entrée à la prochaine bilstm. Au début, vous devriez créer des tableaux avec en avant et en arrière des cellules de longueur num_layers. Et
2) Aussi mérite un coup d'oeil à une autre approche empilés bilstm.
OriginalL'auteur Taras Khakhulin
C'est essentiellement la même que la première réponse, mais avec un peu de variation de l'utilisation du nom de l'étendue et de décrochage des wrappers. Il s'occupe aussi de l'erreur de la première réponse donne sur la portée des variables.
output = tf.reshape(tf.concat(output,1), [-1, 2 * rnn_size])
et la dimension est désormais (Batch_size X échéances, 2*rnn_size). Quand je l'ai passer au travers d'une couche dense en utilisantlogits=tf.matmul(output, weight) + bias
, ma dimension devient (Batch_size X échéances, num_classes). Ce sont mes logits. Comment puis-je trouver de la perte par l'utilisation detf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=Y))
? cause de la forme de l'espace réservé Y est [None, num_classes].Vous ne pouvez pas directement. Vous devez éliminer timestep dimension. Est-il une raison particulière d'utiliser la sortie de toutes les échéances? Généralement, nous prenons la sortie du dernier pas de temps seulement. Vous pouvez le faire en retournant
output = output[:,-1,:]
. Maintenant logits serait[batch_size,num_classes]
merci beaucoup pour votre réponse rapide. Pour être honnête, c'est comment j'ai appris LSTM. Comme dans cet exemple elles s'aplatissent la sortie et les utiliser pour calculer des logits, de ne pas éliminer les échéances. Je suis un peu confus maintenant.
Il a fait cela parce qu'il l'aide
tf.contrib.seq2seq.sequence_loss
dont on attend la time_step dimension. Notez qu'une fois logits sont calculés, il a de nouveau remodelé il à la forme d'origine. Dans votre cas, vous souhaitez utilisertf.nn.softmax_cross_entropy_with_logits
qui ne prendra pas cette forme. Il faudra la dernière time_step seulement.Oh, je comprends.donc, vous dites que, avant de couche dense et softwax, je devrais choisir la dernière fois que les étapes de points de données et à partir de là?
OriginalL'auteur mnis
Sur le dessus de Taras réponse. Voici un autre exemple à l'aide de seulement 2 couches Bidirectionnel RNN avec GRU cellules
BTW, n'oubliez pas d'ajouter un autre champ nom. Espérons que cette aide.
OriginalL'auteur Ekkalak Thongthanomkul
@Taras souligné, vous pouvez utiliser:
(1)
tf.nn.bidirectional_dynamic_rnn()
(2)
tf.contrib.rnn.stack_bidirectional_dynamic_rnn()
.Toutes les réponses précédentes ne capturer (1), donc, je donne quelques détails sur (2), en particulier puisqu'elle surpasse généralement (1). Pour une intuition sur les différentes connectivités
voir ici.
Disons que vous voulez créer une pile de 3 BLSTM couches, chacune avec 64 nœuds:
Dans ce cas, j'utilise la finale des états de la pile de biRNN plutôt que les états, à toutes les échéances (enregistré dans
all_states
), depuis que j'ai été en utilisant un codage décodage régime, où le code ci-dessus n'était que le codeur.OriginalL'auteur dopexxx