qq_34517375 2020-10-31 09:26 采纳率: 0%
浏览 434

tensforflow下,multihot编码如何进行embedding

当前面临一个场景,每一个时间步内接受了若干个输入(数量不定),我想将这些输入的对应embedding值求和用作当前时刻的输入。

我做的是,将输入数据表示成为这样的格式:[batch_size, sequence_len, max_input_size]。其中第二维表示每个序列,第三维表示序列中的每个时间步的输入。由于每个序列的时间步数不同,且每一步的输入数量不同,以0值做padding。
之后,将输入进行tf.keras.layers.Embedding并对最后一维求和。

这样做我是很心虚的,因为我发现即使Embedding层的mask_zero设为True,0值做embedding后并不为0。

所以想求教,更好的对multihot进行embedding的方法。

  • 写回答

2条回答 默认 最新

  • 码农阿豪@新空间 新星创作者: 前端开发技术领域 2024-07-24 22:46
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    针对您当前的问题,有一个更好的方法可以处理multihot输入并进行embedding。一种更常见且有效的方法是使用tf.keras.layers.Masking层来处理多个时间步中的变长序列,并确保在输入数据中使用0填充时不会对Embedding产生影响。 首先,您可以将每个时间步的多个输入表示为一个稀疏矩阵,并将整个序列表示为一个稀疏张量。然后,可以使用tf.keras.layers.Embedding层将这个稀疏张量转换为稠密表示,并在最后一个维度上对它们进行求和以获得当前时刻的输入表示。 以下是一个示例代码,展示了如何使用Masking层和Embedding层来处理multihot输入并进行embedding:
    import tensorflow as tf
    # 定义输入数据
    input_data = tf.constant([[1, 3, 5], [2, 0, 0], [4, 6, 0]])  # 示例输入数据
    # 定义Embedding大小和维度
    embedding_dim = 2
    vocab_size = 7
    # 创建Masking层
    masking_layer = tf.keras.layers.Masking(mask_value=0)
    # 创建Embedding层
    embedding_layer = tf.keras.layers.Embedding(input_dim=vocab_size, output_dim=embedding_dim)
    # 应用Masking和Embedding层
    masked_input = masking_layer(input_data)
    embedded_input = embedding_layer(masked_input)
    # 对最后一个维度进行求和
    summed_input = tf.reduce_sum(embedded_input, axis=-2)
    # 打印输出结果
    print(summed_input)
    

    在这个示例中,我们使用了Masking层来处理输入数据中的0填充值,并使用Embedding层将稀疏矩阵转换为稠密表示。最后,我们对最后一个维度进行求和以获得当前时刻的输入表示。这种方法可以确保在处理多个时间步中的变长序列时,不会受到填充值的影响。希望这个解答对您有帮助!

    评论

报告相同问题?