Sau*_*v-- 10 python lstm keras tensorflow attention-model
我一直关注这篇文章,以便在我的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
Run Code Online (Sandbox Code Playgroud)
我得到的错误:
文件"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行,注意事项_3d_block a = Permute((2,1))(输入)文件"/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中( mask))TypeError:图层permute_1不支持屏蔽,但是传递了一个input_mask:Tensor("merge_2/All:0",shape =(?,15),dtype = bool)
我通过这个帖子说:
这是Keras源代码中的一个小变化(将Lambda层中的supports_masking类变量设置为True而不是False).否则就没有办法做到这一点.但是,遮蔽并不是必需的.
我在哪里可以将supports_masking变量设置为True?另外,还有其他解决方案吗?
我会说:不要使用掩蔽。
Dense尝试将图层应用于可变维度(TIME_STEPS )的实现有一些非常奇怪的地方。
这将需要层中的权重数量可变,这是根本不可能的。(通过掩蔽,您会发现每个不同样本的一些权重应该被忽略)。
我想说你应该在输入中有一个标记/单词告诉“这是句子/电影/序列的结尾”,并用这个标记填充剩余的长度。然后,您可以在模型中的任何位置关闭或删除遮罩(声明嵌入层或实际遮罩层时的参数)。
尝试更改 keras 本机代码可能会导致不稳定的行为和错误的结果(如果不是错误)。
这些层不支持遮罩是有原因的,主要是类似于上面关于密集层的解释。如果你改变它,谁知道会出什么问题呢?永远不要弄乱源代码,除非您真的确定它可能产生的所有后果。
如果即使您想使用遮罩,我发现(但没有测试)一些复杂的解决方案,例如:层MaskEatingLambda:
| 归档时间: |
|
| 查看次数: |
769 次 |
| 最近记录: |