我一直在遵循这个post,以便在我的LSTM
模型上实现 attention layer。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,隐藏尺寸,层编号)文件“main_copy.py”,第189行,在创建模型中(临时)文件“main_copy.py”,第124行,在attention_3d_block中,a =置换((2,1))(输入)文件“/root/.virtualenvs/keras_tf/lib/python3.5/站点包/keras/引擎/topology.py“,第597行,在calloutput_mask = self.计算掩码(输入,先前的掩码)文件“/root/.virtualenvs/keras_tf/lib/python3.5/站点包/keras/引擎/topology.py“中,第744行,在计算掩码字符串(掩码)中)类型错误:层permute_1不支持掩码,但传递了input_mask:Tensor(“合并_2/全部:0”,形状=(?,15),数据类型=bool)
我看了一下thread,上面写着:
这是Keras源代码中的一个小变化(将Lambda层中的supports_masking类变量设置为True而不是False)。否则就没有办法做到这一点。不过遮罩并不是真正必要的。
我可以在哪里将supports_masking
变量设置为True?还有,对此有没有其他解决方案?
2条答案
按热度按时间bnl4lu3b1#
我会说:不要使用掩蔽。
尝试将
Dense
层应用于可变维(TIME_STEPS)的实现非常奇怪。这需要在层中使用可变数量的权重,而这是不可能的。(使用遮罩时,您会告诉您,对于每个不同的样本,某些权重应该被忽略)。
我建议您在输入中使用一个标记/单词来表示“这是句子/电影/序列的结尾”,并用这个标记填充剩余的长度,然后在模型中任何使用它的地方关闭或移除遮罩(无论是声明嵌入层时的参数还是实际的遮罩层)。
尝试更改keras本机代码可能会导致不稳定的行为和错误的结果(如果不是错误)。
在这样的层中不支持屏蔽是有原因的,大多数原因类似于上面关于Dense层的解释。如果你改变了它,谁知道会出什么问题呢?永远不要弄乱源代码,除非你真的很确定它可能会产生的所有后果。
如果即使你想使用掩蔽,我也发现了一些复杂的解决方案(但没有测试),例如:
MaskEatingLambda
层:6tr1vspr2#
我是这个包的作者。
您应该使用最新版本。
以前的版本有一些概念上的问题。