首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >注意层抛出TypeError: Permute层不支持Keras中的掩蔽

注意层抛出TypeError: Permute层不支持Keras中的掩蔽
EN

Stack Overflow用户
提问于 2017-08-15 11:09:14
回答 2查看 1.3K关注 0票数 15

为了在我的帖子模型上实现注意层,我一直在跟踪这个LSTM

attention layer的代码

代码语言:javascript
复制
INPUT_DIM = 2
TIME_STEPS = 20
SINGLE_ATTENTION_VECTOR = False
APPLY_ATTENTION_BEFORE_LSTM = False

def attention_3d_block(inputs):
    input_dim = int(inputs.shape[2])
    a = Permute((2, 1))(inputs)
    a = Reshape((input_dim, TIME_STEPS))(a)
    a = Dense(TIME_STEPS, activation='softmax')(a)
    if SINGLE_ATTENTION_VECTOR:
        a = Lambda(lambda x: K.mean(x, axis=1), name='dim_reduction')(a)
        a = RepeatVector(input_dim)(a)
    a_probs = Permute((2, 1), name='attention_vec')(a)
    output_attention_mul = merge(
        [inputs, a_probs],
        name='attention_mul',
        mode='mul'
    )
    return output_attention_mul

我所犯的错误:

文件"main_copy.py",第244行,在model = create_model(X_vocab_len,X_max_len,y_vocab_len,y_max_len,HIDDEN_DIM,LAYER_NUM)文件“main_copy.py”中,第189行,在create_model attention_mul = attention_3d_block(temp) File“main_copy.py”中,第124行,在attention_3d_block a=Permute(2,(1)(输入)文件"/root/.virtualenvs/keras_tf/lib/python3.5/site-packages/keras/engine/topology.py",行597,在call output_mask = self.compute_mask(inputs,previous_mask) File "/root/.virtualenvs/keras_tf/lib/python3.5/site-packages/keras/engine/topology.py",第744行中,在compute_mask str(掩码)TypeError中: Layer permute_1不支持掩蔽,但是传入了一个input_mask:张量(“merge_2/All:0”,shape=(?,15),dtype=bool)。

我读过这个线程,上面写着:

这是Keras源代码中的一个小改动(将Lambda层中的supports_masking类变量设置为True而不是False)。否则就没有办法做到这一点。不过,掩蔽并不是必要的。

在哪里可以将supports_masking变量设置为True?还有什么其他的解决办法吗?

EN

回答 2

Stack Overflow用户

发布于 2018-03-16 13:55:48

我想说的是:不要用伪装。

这个实现非常奇怪,它试图将Dense层应用到变量维度(TIME_STEPS)。

这将需要层中可变数量的权重,这是根本不可能的。(使用掩蔽,您会告诉我们,对于每个不同的样本,都应该忽略一些权重)。

我想说的是,您应该在输入中有一个标记/单词,告诉您“这是句子/电影/序列的结尾”,并用这个标记填充剩余的长度。然后,在模型中使用掩蔽的地方关闭或删除掩蔽(声明嵌入层或实际掩蔽层时的参数)。

试图更改keras本机代码可能会导致不稳定行为和错误结果(如果不是错误的话)。

在这样的层中不支持掩蔽是有原因的,大部分原因类似于上面关于密集层的解释。如果你改变了,谁知道会出什么问题?不要乱搞源代码,除非你真的很确定它可能带来的后果。

如果您想使用掩蔽,我在其中找到了一些复杂的解决方案(但没有进行测试),例如:MaskEatingLambda层:

票数 0
EN

Stack Overflow用户

发布于 2022-10-11 01:36:13

我是这个包裹的作者之一。

你应该使用最新版本。

以前的版本有一些概念上的问题。

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

https://stackoverflow.com/questions/45691644

复制
相关文章

相似问题

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