我一直在关注这个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行,在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)
我经历了这个thread,其中说:
这是Keras源代码中的一个小变化(将Lambda层中的supports_masking类变量设置为True而不是False) . 否则就没有办法做到这一点 . 但是,遮蔽并不是必需的 .
我在哪里可以将 supports_masking
变量设置为True?另外,还有其他解决方案吗?
1 回答
我会说:不要使用遮蔽 .
尝试将
Dense
图层应用于变量维度(TIME_STEPS)的实现有一些非常奇怪的地方 .这将需要在层中具有可变数量的权重,这是不可能的 . (通过屏蔽,你会告诉每个不同的样本应该忽略一些权重) .
我会说你应该在输入中有一个令牌/单词,告诉“这是句子/电影/序列的结尾”并用这个标记填充剩余的长度 . 然后在模型中使用它时关闭或移除遮罩(当您声明嵌入图层或实际遮罩图层时参数) .
尝试更改keras本机代码可能会导致行为不稳定和错误的结果(如果不是错误) .
在这些层中没有支持掩蔽是有原因的,大多数原因与上面关于密集层所解释的类似 . 如果你改变了,谁知道什么可能出错?除非你真的确定它可能带来的所有后果,否则永远不要乱用源代码 .
如果即使你想使用掩蔽,我发现有一些复杂的解决方案(但没有测试),例如:
MaskEatingLambda
layer:在这里查看@sergeyf的评论:https://github.com/keras-team/keras/issues/1579
在此处查看自定义图层:https://gist.github.com/sergeyf/a95de7d089668b41decad343ee30b89e