Python 注意层抛出类型错误:置换层不支持Keras中的掩蔽
我一直遵循这一点,以便在我的Python 注意层抛出类型错误:置换层不支持Keras中的掩蔽,python,tensorflow,keras,lstm,attention-model,Python,Tensorflow,Keras,Lstm,Attention Model,我一直遵循这一点,以便在我的LSTM模型上实现注意层 注意层的代码: 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
LSTM
模型上实现注意层
注意层的代码:
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=创建模型(X\u vocab\u len、X\u max\u len、y\u vocab\u len、y\u max\u len、HIDDEN\u DIM、LAYER\u NUM)文件“main\u copy.py”,第189行,在
创建模型
attention\u mul=attention\u 3d\u块(临时)文件“main\u copy.py”,第124行,在attention\u 3d\u块中
a=Permute((2,1))(输入)文件“/root/.virtualenvs/keras_tf/lib/python3.5/site packages/keras/engine/topology.py”,
第597行,在呼叫中
output\u mask=self.compute\u mask(输入,前一个\u mask)文件“/root/.virtualenvs/keras\u tf/lib/python3.5/site packages/keras/engine/topology.py”,
第744行,在计算掩码中
str(mask))TypeError:Layer permute_1不支持屏蔽,但传递了一个输入屏蔽:Tensor(“merge_2/All:0”,shape=(?,15),
dtype=bool)
我经历过这样一段话:
这是Keras源代码中的一个小改动(将Lambda层中的supports_masking class变量设置为True而不是False)。否则就没有办法做到这一点。不过,掩蔽并不是真的必要
在哪里可以将
supports\u masking
变量设置为True?还有,还有其他解决办法吗?我会说:不要使用掩蔽
该实现试图将密集的层应用于可变维度(时间步长),这有点奇怪
这将需要层中可变数量的权重,这是根本不可能的。(通过掩蔽,你会发现对于每个不同的样本,一些权重应该被忽略)
我想你应该在输入中有一个标记/单词,告诉你“这是句子/电影/序列的结尾”,并用这个标记填充剩余的长度。然后在模型中使用遮罩的任何位置(声明嵌入层或实际遮罩层时的参数)关闭或移除遮罩
试图更改keras本机代码可能会导致不稳定的行为和错误的结果(如果不是错误的话)
这类层中不支持掩蔽是有原因的,主要原因与上面关于致密层的解释类似。如果你改变了,谁知道会出什么问题?永远不要弄乱源代码,除非你真的确定它可能带来的所有后果
如果您想使用掩蔽,我找到了一些复杂的解决方案(但没有测试),例如:MaskEatingLambda
layer:
- 请参见@sergeyf的评论:
- 在此处查看其自定义图层: