Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 注意层抛出类型错误:置换层不支持Keras中的掩蔽_Python_Tensorflow_Keras_Lstm_Attention Model - Fatal编程技术网

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的评论:
  • 在此处查看其自定义图层: