2

Ich versuche ein bidirektionales RNN mit Aufmerksamkeitsmechanismus für die Sequenzklassifikation zu bauen. Ich habe einige Probleme, die Hilfsfunktion zu verstehen. Ich habe gesehen, dass der, der für das Training verwendet wird, die Decodereingänge benötigt, aber da ich ein einzelnes Etikett aus der ganzen Sequenz haben möchte, weiß ich nicht genau, welche Eingabe ich hier geben soll. Das ist die Struktur, die ich bisher gebaut habe:Aufmerksamkeitsmechanismus für die Sequenzklassifizierung (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) 

Meine Eingabe ist eine Folge [batch_size, sequence_length, n_features] und meine Ausgabe ist ein einzelner Vektor mit N möglichen Klassen [batch_size, n_classes].

Wissen Sie, was fehlt mir hier oder wenn seq2seq für Sequenzklassifizierung verwendet werden kann?

Antwort

1

Ein Seq2Seq-Modell ist per Definition nicht für eine Aufgabe wie diese geeignet. Wie der Name schon sagt, konvertiert er eine Sequenz von Eingaben (die Wörter in einem Satz) in eine Sequenz von Etiketten (die Teile der Sprache der Wörter). In Ihrem Fall suchen Sie nach einem einzelnen Label pro Sample, nicht nach einer Sequenz.

Glücklicherweise haben Sie alles, was Sie dafür brauchen, da Sie nur die Ausgänge oder Zustände des Encoders (RNN) benötigen.

Der einfachste Weg, um einen Klassifikator zu erstellen, ist die Verwendung des Endzustands des RNN. Fügen Sie eine vollständig verbundene Ebene darüber mit shape [n_hidden, n_classes] hinzu. Auf diesem können Sie eine Softmax-Schicht und einen Verlust trainieren, der die endgültige Kategorie vorhersagt.

Im Prinzip enthält dies keinen Aufmerksamkeitsmechanismus. Wenn Sie jedoch einen hinzufügen möchten, können Sie dies tun, indem Sie jeden Ausgang des RNN mit einem gelernten Vektor abwiegen und dann die Summe nehmen. Dies ist jedoch nicht garantiert, um die Ergebnisse zu verbessern. Zur weiteren Bezugnahme implementiert https://arxiv.org/pdf/1606.02601.pdf diese Art von Aufmerksamkeitsmechanismus, wenn ich mich nicht irre.

Verwandte Themen