在 TensorFlow 2.0 中添加一个 Concatenated 层(使用 Attention)

Adding a Concatenated layer to TensorFlow 2.0 (using Attention)

在构建使用 TensorFlow 2.0 Attention 的模型时,我遵循了 TF 文档中给出的示例。 https://www.tensorflow.org/api_docs/python/tf/keras/layers/Attention

示例中的最后一行是

input_layer = tf.keras.layers.Concatenate()(
    [query_encoding, query_value_attention])

然后例子有注释

# Add DNN layers, and create Model.
# ...

所以这样做似乎合乎逻辑

model = tf.keras.Sequential()
model.add(input_layer)

这会产生错误

TypeError: The added layer must be an instance of class Layer.
Found: Tensor("concatenate/Identity:0", shape=(None, 200), dtype=float32)

更新(@thushv89 回复后)

我最后想做的是在下面的模型中添加一个注意力层,效果很好(或将其转换为注意力模型)。

model = tf.keras.Sequential()
model.add(layers.Embedding(vocab_size, embedding_nodes, input_length=max_length))
model.add(layers.LSTM(20))
#add attention here?
model.add(layers.Dense(1, activation='sigmoid'))
model.compile(loss='mean_squared_error', metrics=['accuracy'])

我的数据是这样的

4912,5059,5079,0
4663,5145,5146,0
4663,5145,5146,0
4840,5117,5040,0

前三列是输入,最后一列是二元的,目标是分类。数据的准备与此示例类似,目的类似,即二元分类。 https://machinelearningmastery.com/use-word-embedding-layers-deep-learning-keras/

所以,首先是 Keras 在创建模型时有三个 API。

  • 顺序 -(这就是你在这里所做的)
  • 功能性 -(这是我在解决方案中使用的)
  • 子类化 - 创建 Python 类 来表示自定义 models/layers

本教程中创建模型的方式不适用于顺序模型,而是来自函数API 的模型。所以你必须做以下事情。请注意,我冒昧地使用任意参数定义了密集层(例如,输出数量 类,您可以根据需要进行更改)。

import tensorflow as tf

# Variable-length int sequences.
query_input = tf.keras.Input(shape=(None,), dtype='int32')
value_input = tf.keras.Input(shape=(None,), dtype='int32')

# ... the code in the middle

# Concatenate query and document encodings to produce a DNN input layer.
input_layer = tf.keras.layers.Concatenate()(
    [query_encoding, query_value_attention])

# Add DNN layers, and create Model.
# ...
dense_out = tf.keras.layers.Dense(50, activation='relu')(input_layer)
pred = tf.keras.layers.Dense(10, activation='softmax')(dense_out)

model = tf.keras.models.Model(inputs=[query_input, value_input], outputs=pred)
model.summary()