是否可以将原生tf Attention层与keras的Sequential API一起使用?
我希望使用这个特定类。我找到了像这个这样的自定义实现。我真正想要的是使用这个特定类与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()) # 这样做行不通model.add(tf.keras.layers.Dense(1, activation='sigmoid'))
回答:
我最终使用了在这个仓库中由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'])
请注意,这是所谓的“软注意力”或“带加权平均的注意力”,如“Show, Attend and Tell: Neural Image Caption Generation with Visual Attention”中所述。更多细节可以在这里找到