15

我一直在关注这篇文章,以便在我的模型上实现注意力层。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 行,在 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) 文件“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) 文件“/root/.virtualenvs/keras_tf/lib/python3.5/site-packages/keras/engine/topology.py”,第 744 行,在 compute_mask str(掩码))类型错误:图层 permute_1 不支持掩码,但传递了一个 input_mask:Tensor("merge_2/All:0", shape=(?, 15), dtype=bool)

我经历了这个线程,它说:

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

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

4

1 回答 1

0

我会说:不要使用掩蔽。

Dense尝试将层应用于可变维度(TIME_STEPS )的实现有一些非常奇怪的地方。

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

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


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

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


如果即使您想使用遮罩,我也找到了一些复杂的解决方案(但没有测试),例如:MaskEatingLambdalayer:

于 2018-03-16T13:55:48.167 回答