注意层引发TypeError:置换图层不支持Keras中的遮罩

fzsnzjdm  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(173)

我一直在遵循这个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?还有,对此有没有其他解决方案?

bnl4lu3b

bnl4lu3b1#

我会说:不要使用掩蔽。
尝试将Dense层应用于可变维(TIME_STEPS)的实现非常奇怪。
这需要在层中使用可变数量的权重,而这是不可能的。(使用遮罩时,您会告诉您,对于每个不同的样本,某些权重应该被忽略)。
我建议您在输入中使用一个标记/单词来表示“这是句子/电影/序列的结尾”,并用这个标记填充剩余的长度,然后在模型中任何使用它的地方关闭或移除遮罩(无论是声明嵌入层时的参数还是实际的遮罩层)。
尝试更改keras本机代码可能会导致不稳定的行为和错误的结果(如果不是错误)。
在这样的层中不支持屏蔽是有原因的,大多数原因类似于上面关于Dense层的解释。如果你改变了它,谁知道会出什么问题呢?永远不要弄乱源代码,除非你真的很确定它可能会产生的所有后果。
如果即使你想使用掩蔽,我也发现了一些复杂的解决方案(但没有测试),例如:MaskEatingLambda层:

6tr1vspr

6tr1vspr2#

我是这个包的作者。
您应该使用最新版本。
以前的版本有一些概念上的问题。

相关问题