有没有办法将原生 tf 注意层与 keras Sequential API 一起使用?

Waj*_*ini 5 machine-learning deep-learning keras tensorflow attention-model

有没有办法将原生 tf 注意层与 keras Sequential API 一起使用?

我正在寻找使用这个特定的类。我找到了自定义实现,例如this one。我真正想要的是将这个特定的类与 Sequential API 一起使用

这是我正在寻找的代码示例

model = tf.keras.models.Sequential()

model.add(tf.keras.layers.Embedding(vocab_length,
                          EMBEDDING_DIM, input_length=MAX_SEQUENCE_LENGTH,
                          weights=[embedding_matrix], trainable=False))

model.add(tf.keras.layers.Dropout(0.3))

model.add(tf.keras.layers.Conv1D(64, 5, activation='relu'))
model.add(tf.keras.layers.MaxPooling1D(pool_size=4))

model.add(tf.keras.layers.CuDNNLSTM(100))
model.add(tf.keras.layers.Dropout(0.4))

model.add(tf.keras.layers.Attention()) # Doesn't work this way

model.add(tf.keras.layers.Dense(1, activation='sigmoid'))
Run Code Online (Sandbox Code Playgroud)

Waj*_*ini 0

我最终使用了tsterbak在此存储库中找到的自定义类。这是 AttentionWeightedAverage 类。它与 Sequential API 兼容这是我的模型供参考:

model = Sequential()

model.add(Embedding(input_dim=vocab_length,
                    output_dim=EMBEDDING_DIM, input_length=MAX_SEQUENCE_LENGTH,
                    weights=[embedding_matrix], trainable=False))
model.add(Conv1D(64, 5, activation='relu'))
model.add(MaxPooling1D(pool_size=4))

model.add(Bidirectional(GRU(100, return_sequences=True)))

model.add(AttentionWeightedAverage())
model.add(Dense(1, activation='sigmoid'))

model.compile(loss='binary_crossentropy', optimizer="adam", metrics=['accuracy'])

Run Code Online (Sandbox Code Playgroud)

请注意,这就是所谓的“软注意力”或“加权平均注意力”,如“Show、Attend and Tell:Neural Image Caption Generation with Visual Attention”中所述。这里的细节更容易理解