在GlobalAveragePooling1D和其他层中嵌入层之后进行掩膜

问题描述

我正在构建一个模型,该模型在运行时不应考虑填充的零。我知道Embedding层通过mask_zero参数支持屏蔽。我希望随后的图层也忽略填充的零。

embedding = Embedding(vocab_size,b,input_length=max_length,mask_zero=True)

inp1 = Input(shape=(c.shape[0],))
inp2 = Input(shape=(c.shape[0],))

w_embedding_1 = embeddding(inp1)
w_embedding_2 = embeddding(inp2)

c_embedding_1 = GlobalAveragePooling1D()(w_embeddings_1)
c_embedding_2 = GlobalAveragePooling1D()(w_embeddings_2)

out = Subtract()([c_embeddings_1,c_embeddings_2])
out = abs(out)

out = Dense(r,activation='sigmoid')(out)

根据文档here

使用功能性API或顺序性API时,由EmbeddingMasking层生成的掩码将通过网络传播到能够使用它们的任何层(例如RNN)层)。 Keras将自动获取与输入相对应的遮罩,并将其传递给知道如何使用该遮罩的任何层

在嵌入层documentation中,参数mask_zero

mask_zero:布尔值,无论输入值0是否为应屏蔽掉的特殊“填充”值。当使用可能需要可变长度输入的循环图层时,这很有用。 如果为True,则模型中的所有后续层都需要支持屏蔽,否则将引发异常。结果,如果mask_zero设置为True,则无法在词汇表中使用索引0(input_dim应等于词汇表大小+ 1)

现在,当我运行模型时,我没有例外,我也能够使用数据进行训练。这是否意味着GlobalAveragePooling1D,Subtract,abs和Dense都支持屏蔽并在传递数据时将其考虑在内?

在第二种情况下,如果我在Lambda层之后立即使用自定义Embedding层,该如何将其引入屏蔽呢?

embedding = Embedding(vocab_size,))

w_embedding_1 = embeddding(inp1)

def custom_layer(tensor):
    return tf.math.reduce_sum(tensor,axis=1,keepdims=True)

lambda_layer_1 = Lambda(custom_layer)(w_embedding_1)

更多一般性问题:

  1. 如何检查Keras中的现有图层是否支持前一层的蒙版吸收?
  2. 检查掩盖和未掩盖案例输出的好方法是什么?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...