在 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()
在构建使用 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()