【问题标题】:How to use the result of embedding with mask_zero=True in keras如何在 keras 中使用 mask_zero=True 嵌入的结果
【发布时间】:2018-10-02 08:29:51
【问题描述】:

在 keras 中,我想计算非零嵌入输出的平均值。 我想知道嵌入层中 mask_zero=True 或 False 有什么区别。 我尝试了下面的代码:

input_data = Input(shape=(5,), dtype='int32', name='input')
embedding_layer = Embedding(1000, 24, input_length=5,mask_zero=True,name='embedding')
out = word_embedding_layer(input_data)
def antirectifier(x):
    x = K.mean(x, axis=1, keepdims=True)
    return x
def antirectifier_output_shape(input_shape):
    shape = list(input_shape)
    return tuple(shape)
out = Lambda(antirectifier, output_shape=antirectifier_output_shape,name='lambda')(out)

但结果似乎是所有元素的平均值,我如何才能计算所有非零输入的平均值?

【问题讨论】:

    标签: keras embedding masking


    【解决方案1】:

    来自function's doc:

    如果这是真的,那么模型中的所有后续层都需要 支持屏蔽

    您的 lambda 函数不支持屏蔽。例如 Keras 中的循环层支持遮罩。如果您在嵌入中设置 mask_zero=True,那么您提供给嵌入层的所有 0 索引都将作为“屏蔽”传播,并且能够理解“屏蔽”信息的后续层将使用它们。

    基本上,如果您构建一个“平均”层来抓取掩码并仅计算非掩码值的平均值,那么您将获得所需的结果。

    您可以find here 一种方法来构建支持屏蔽的 lambda 层

    希望对你有帮助。

    【讨论】:

    • 如果我使用 mask_zero=True,这意味着我必须在整个网络中使用支持 mask 的层?但是我有一些不支持 mask 的密集层。那我该如何处理?我可以使用 lambda 而不是返回掩码
    • 如果你仔细想想,它是有道理的:一个密集层不能处理一个掩码并传播它,因为它在每个输入神经元上训练一个权重并对总和进行一些计算......它不清楚在屏蔽输入的情况下该怎么做。如果你使用掩码,下一层应该能够处理它,例如 LSTM 将完成这项工作并计算输出,同时跳过掩码值......在那之后你可以放置密集层。
    猜你喜欢
    • 2018-10-14
    • 2020-02-12
    • 2019-09-07
    • 2018-01-18
    • 2018-05-09
    • 2020-10-27
    • 1970-01-01
    • 2020-04-17
    • 2020-05-14
    相关资源
    最近更新 更多