首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Keras中的注意力:如何在keras密集层中添加不同的注意力机制?

Keras中的注意力:如何在keras密集层中添加不同的注意力机制?
EN

Stack Overflow用户
提问于 2019-04-10 01:43:46
回答 1查看 836关注 0票数 0

我是Keras的新手,我正在尝试用keras构建一个简单的自动编码器,并带有关注层:

下面是我尝试过的:

代码语言:javascript
复制
data = Input(shape=(w,), dtype=np.float32, name='input_da')
noisy_data = Dropout(rate=0.2, name='drop1')(data)

encoded = Dense(256, activation='relu',
            name='encoded1', **kwargs)(noisy_data)
encoded = Lambda(mvn, name='mvn1')(encoded)

encoded = Dense(128, activation='relu',
            name='encoded2', **kwargs)(encoded)

encoded = Lambda(mvn, name='mvn2')(encoded)
encoded = Dropout(rate=0.5, name='drop2')(encoded)


encoder = Model([data], encoded)
encoded1 = encoder.get_layer('encoded1')
encoded2 = encoder.get_layer('encoded2')


decoded = DenseTied(256, tie_to=encoded2, transpose=True,
            activation='relu', name='decoded2')(encoded)
decoded = Lambda(mvn, name='new_mv')(decoded)


decoded = DenseTied(w, tie_to=encoded1, transpose=True,
            activation='linear', name='decoded1')(decoded)

它看起来像这样:

代码语言:javascript
复制
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
data (InputLayer)            (None, 2693)              0         
_________________________________________________________________
drop1 (Dropout)              (None, 2693)              0         
_________________________________________________________________
encoded1 (Dense)             (None, 256)               689664    
_________________________________________________________________
mvn1 (Lambda)                (None, 256)               0         
_________________________________________________________________
encoded2 (Dense)             (None, 128)               32896     
_________________________________________________________________
mvn2 (Lambda)                (None, 128)               0         
_________________________________________________________________
drop2 (Dropout)              (None, 128)               0         
_________________________________________________________________
decoded2 (DenseTied)         (None, 256)               256       
_________________________________________________________________
mvn3 (Lambda)                (None, 256)               0         
_________________________________________________________________
decoded1 (DenseTied)         (None, 2693)              2693      
=================================================================

在这个模型中我可以在哪里添加关注层?我应该在第一个encoded_output之后和第二个编码输入之前添加吗?

代码语言:javascript
复制
encoded = Lambda(mvn, name='mvn1')(encoded)

    Here?

encoded = Dense(128, activation='relu',
            name='encoded2', **kwargs)(encoded)

我还浏览了这个漂亮的lib:

https://github.com/CyberZHG/keras-self-attention

他们已经实现了各种类型的注意机制,但它是针对顺序模型的。我如何才能在我的模型中添加这些注意力?

我试着用非常简单的注意力:

代码语言:javascript
复制
encoded = Dense(256, activation='relu',
        name='encoded1', **kwargs)(noisy_data)


encoded = Lambda(mvn, name='mvn1')(encoded)

attention_probs = Dense(256, activation='softmax', name='attention_vec')(encoded)
attention_mul = multiply([encoded, attention_probs], name='attention_mul')
attention_mul = Dense(256)(attention_mul)

print(attention_mul.shape)

encoded = Dense(128, activation='relu',
        name='encoded2', **kwargs)(attention_mul)

它在正确的位置吗?我可以在这个模型中添加任何其他注意力机制吗?

EN

回答 1

Stack Overflow用户

发布于 2019-06-17 09:41:32

我猜你所做的是一种增加注意力的正确方式,因为注意力本身什么都不是,而是可以被可视化为密集层的权重。此外,我认为在编码器之后立即应用注意力是正确的做法,因为它会将注意力应用于任务所需的数据分布中最“信息量”的部分。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55598427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档