【问题标题】:Adding a Concatenated layer to TensorFlow 2.0 (using Attention)在 TensorFlow 2.0 中添加 Concatenated 层(使用 Attention)
【发布时间】:2020-03-19 13:49:36
【问题描述】:

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

【问题讨论】:

    标签: python tensorflow keras deep-learning attention-model


    【解决方案1】:

    首先,Keras 在创建模型时拥有三个 API。

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

    本教程中创建模型的方式不适用于顺序模型,而是来自功能 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()
    

    【讨论】:

    • 谢谢,这很有帮助,但又增加了一个问题。我得到了要编译的模型,并且摘要接近于我正在寻找的内容,但是为什么有两个输入数组,它们是什么?我根据您的回答修改了我的问题。我正在做类似于以下链接的事情,并且我只有一个输入数组。 machinelearningmastery.com/…
    • 这不是典型的注意力层。但它被设计为用作 Transformer 模型中的注意力模块,这是完全不同的。我不确定这种注意力是否可用于在 NLP 模型中实现注意力类型。
    • @greco.roamin 其实应该可以用作典型的注意力层。我会调查并相应地更新我的答案。
    • @greco.roamin 所以经过一些研究,我认为你不能使用这个注意力层来解决你的问题。这种关注是针对编码器-解码器模型的。但是话虽如此,您应该能够为这个问题实现一个“注意”层(尽管对于非编码器 - 解码器模型这样做并不常见 - 我已经看到了)。如果你想沿着这条路继续前进,请告诉我。
    • 据我所知,它正在工作。我得到了一些有趣的结果,它训练得又快又好。这是纯粹的实验,以查看注意力对未专门设计的数据的影响。我现在需要做的是删除嵌入式层的整个概念,以获得通用的注意力解决方案。我不希望现在就解决这个问题,但我感谢您在此过程中这一步的洞察力和帮助。谢谢。
    猜你喜欢
    • 2021-09-17
    • 1970-01-01
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-12
    • 2020-02-19
    • 1970-01-01
    相关资源
    最近更新 更多