J'essaie de comprendre le modèle d'attention et d'en construire un moi-même. Après de nombreuses recherches, je suis tombé sur ce site Web qui avait un modèle d'attention codé en keras et semble également simple. Mais quand j'ai essayé de construire ce même modèle dans ma machine, cela donnait une erreur d'arguments multiples. L'erreur était due à l'argument non concordant passé dans la classe Attention
. Dans la classe d'attention du site Web, il demande un argument, mais il lance l'objet attention avec deux arguments.
import tensorflow as tf
max_len = 200
rnn_cell_size = 128
vocab_size=250
class Attention(tf.keras.Model):
def __init__(self, units):
super(Attention, self).__init__()
self.W1 = tf.keras.layers.Dense(units)
self.W2 = tf.keras.layers.Dense(units)
self.V = tf.keras.layers.Dense(1)
def call(self, features, hidden):
hidden_with_time_axis = tf.expand_dims(hidden, 1)
score = tf.nn.tanh(self.W1(features) + self.W2(hidden_with_time_axis))
attention_weights = tf.nn.softmax(self.V(score), axis=1)
context_vector = attention_weights * features
context_vector = tf.reduce_sum(context_vector, axis=1)
return context_vector, attention_weights
sequence_input = tf.keras.layers.Input(shape=(max_len,), dtype='int32')
embedded_sequences = tf.keras.layers.Embedding(vocab_size, 128, input_length=max_len)(sequence_input)
lstm = tf.keras.layers.Bidirectional(tf.keras.layers.LSTM
(rnn_cell_size,
dropout=0.3,
return_sequences=True,
return_state=True,
recurrent_activation='relu',
recurrent_initializer='glorot_uniform'), name="bi_lstm_0")(embedded_sequences)
lstm, forward_h, forward_c, backward_h, backward_c = tf.keras.layers.Bidirectional \
(tf.keras.layers.LSTM
(rnn_cell_size,
dropout=0.2,
return_sequences=True,
return_state=True,
recurrent_activation='relu',
recurrent_initializer='glorot_uniform'))(lstm)
state_h = tf.keras.layers.Concatenate()([forward_h, backward_h])
state_c = tf.keras.layers.Concatenate()([forward_c, backward_c])
# PROBLEM IN THIS LINE
context_vector, attention_weights = Attention(lstm, state_h)
output = keras.layers.Dense(1, activation='sigmoid')(context_vector)
model = keras.Model(inputs=sequence_input, outputs=output)
# summarize layers
print(model.summary())
Comment puis-je faire fonctionner ce modèle?
Les couches d'attention font désormais partie de l'API Keras de Tensorflow (2.1). Mais il produit le tenseur de même taille que votre tenseur "requête".
Voici comment utiliser l'attention de style Luong:
query_attention = tf.keras.layers.Attention()([query, value])
Et attention à Bahdanau:
query_attention = tf.keras.layers.AdditiveAttention()([query, value])
Consultez le site Web d'origine pour plus d'informations: https://www.tensorflow.org/api_docs/python/tf/keras/layers/Attentionhttps://www.tensorflow.org/api_docs/python/tf/keras/couches/AdditiveAttention