2

J'essaye de construire un RNN bidirectionnel avec mécanisme d'attention pour la classification de séquence. J'ai quelques problèmes à comprendre la fonction d'aide. J'ai vu que celui utilisé pour la formation a besoin des entrées du décodeur, mais comme je veux une seule étiquette de la séquence entière, je ne sais pas exactement quelle entrée je devrais donner ici. C'est la structure que j'ai construit jusqu'à présent:Mécanisme d'attention pour la classification de séquence (seq2seq tensorflow r1.1)

# Encoder LSTM cells 
lstm_fw_cell = rnn.BasicLSTMCell(n_hidden) 
lstm_bw_cell = rnn.BasicLSTMCell(n_hidden) 

# Bidirectional RNN 
outputs, states = tf.nn.bidirectional_dynamic_rnn(lstm_fw_cell, 
        lstm_bw_cell, inputs=x, 
        sequence_length=seq_len, dtype=tf.float32) 

# Concatenate forward and backward outputs 
encoder_outputs = tf.concat(outputs,2) 

# Decoder LSTM cell 
decoder_cell = rnn.BasicLSTMCell(n_hidden) 

# Attention mechanism 
attention_mechanism = tf.contrib.seq2seq.LuongAttention(n_hidden, encoder_outputs) 
attn_cell = tf.contrib.seq2seq.AttentionWrapper(decoder_cell, 
      attention_mechanism, attention_size=n_hidden) 
      name="attention_init") 

# Initial attention 
attn_zero = attn_cell.zero_state(batch_size=tf.shape(x)[0], dtype=tf.float32) 
init_state = attn_zero.clone(cell_state=states[0]) 

# Helper function 
helper = tf.contrib.seq2seq.TrainingHelper(inputs = ???) 

# Decoding 
my_decoder = tf.contrib.seq2seq.BasicDecoder(cell=attn_cell, 
      helper=helper, 
      initial_state=init_state) 

decoder_outputs, decoder_states = tf.contrib.seq2seq.dynamic_decode(my_decoder) 

Mon entrée est une séquence [batch_size, sequence_length, n_features] et ma sortie est un vecteur unique avec N classes possibles [de batch_size, n_classes]. Savez-vous ce qui me manque ici ou s'il est possible d'utiliser seq2seq pour la classification des séquences?

Répondre

1

Un modèle Seq2Seq n'est par définition pas adapté à une tâche comme celle-ci. Comme son nom l'indique, il convertit une séquence d'entrées (les mots d'une phrase) en une séquence d'étiquettes (les parties du discours des mots). Dans votre cas, vous recherchez une seule étiquette par échantillon, pas une séquence d'entre eux. Heureusement, vous avez déjà tout ce dont vous avez besoin, car vous n'avez besoin que des sorties ou des états de l'encodeur (le RNN).

La manière la plus simple de créer un classificateur en utilisant ceci est d'utiliser l'état final du RNN. Ajoutez un calque entièrement connecté par-dessus avec shape [n_hidden, n_classes]. Sur ce, vous pouvez former une couche softmax et la perte qui prédit la catégorie finale.

En principe, cela n'inclut pas un mécanisme d'attention. Cependant, si vous voulez en inclure un, vous pouvez le faire en pesant chacune des sorties du RNN par un vecteur appris, puis en prenant la somme. Cependant, ceci n'est pas garanti pour améliorer les résultats. Pour plus de référence, https://arxiv.org/pdf/1606.02601.pdf implémente ce type de mécanisme d'attention si je ne me trompe pas.