注意层抛出 TypeError:Permute 层不支持在 Keras 中屏蔽

Attention Layer throwing TypeError: Permute layer does not support masking in Keras

提问人:Saurav-- 提问时间:8/15/2017 最后编辑:InnatSaurav-- 更新时间:4/4/2023 访问量:1490

问:

我一直在关注这篇文章,以便在我的模型上实现注意力层LSTM

代码 :attention layer

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 行,在 型号 = 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) 文件“main_copy.py”,第 124 行,attention_3d_block a = Permute((2, 1))(inputs) 文件 “/root/.virtualenvs/keras_tf/lib/python3.5/site-packages/keras/engine/topology.py”, 第 597 行,在调用中 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(mask)) TypeError:第 permute_1 层不支持屏蔽,但传递了input_mask:Tensor(“merge_2/All:0”, shape=(?, 15), dtype=布尔值)

我浏览了这个线程,上面写着:

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

在哪里可以将变量设置为 True?另外,还有其他解决方案吗?supports_masking

python tensorflow keras lstm 注意力模型

评论


答:

0赞 Daniel Möller 3/16/2018 #1

我会说:不要使用掩蔽。

该实现试图将层应用于可变维度 (TIME_STEPS) 有一些非常奇怪的事情。Dense

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

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


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

此类层不支持遮罩是有原因的,主要是类似于上面关于密集层的解释。如果你改变这一点,谁知道会出什么问题?永远不要弄乱源代码,除非你真的非常确定它可能产生的所有后果。


如果即使你想使用掩码,我发现(但没有测试)一些复杂的解决方案,例如: layer:MaskEatingLambda

0赞 Philippe Remy 10/11/2022 #2

我是该软件包的作者之一。

您应该使用最新版本。 以前的版本存在一些概念问题。