我正在构建一个模型,该模型在运行时不应考虑填充的零。我知道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时,由
Embedding
或Masking
层生成的掩码将通过网络传播到能够使用它们的任何层(例如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, b, input_length=max_length, mask_zero=True)
inp1 = Input(shape=(c.shape[0],))
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)
更多一般性问题: