注意图层抛出TypeError:Permute图层不支持Keras

时间:2017-08-15 11:09:15

标签: python tensorflow keras lstm attention-model

我一直在关注此post,以便在我的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行,in       model = create_model(X_vocab_len,X_max_len,y_vocab_len,y_max_len,HIDDEN_DIM,LAYER_NUM)文件" main_copy.py",第189行,in   create_model       attention_mul = attention_3d_block(temp)文件" main_copy.py",第124行,注意力集中在_3d_block       a = Permute((2,1))(输入)File" /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),   D型=布尔)

我经历了thread,其中说:

  

这是Keras源代码中的一个小变化(将Lambda图层中的supports_masking类变量设置为True而不是False)。否则,没有办法做到这一点。尽管如此,掩蔽并不是必需的。

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

1 个答案:

答案 0 :(得分:0)

我会说:不要使用遮蔽。

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

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

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

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

有理由在这些层中不支持屏蔽,大多数原因与上面关于Dense层所解释的类似。如果你改变了,谁知道什么可能出错?除非你真的确定它可能带来的所有后果,否则不要乱用源代码。

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