【问题标题】:How to fix embedding of zero index to zero vector in tensorflow?如何在张量流中修复零索引到零向量的嵌入?
【发布时间】:2023-03-04 16:29:02
【问题描述】:

我想将零索引嵌入向量固定为零向量。

例如,

embedding layer input: [0, 1, 2, 0, 3]
embedding layer output:
[
  [0, 0, 0, 0, 0],
  [ (some vector) ],
  [ (some vector) ],
  [0, 0, 0, 0, 0],
  [ (some vector) ]
]

我在 Keras 嵌入层中找到了mask_zero 选项,但它不是我想要的...

仅供参考,我这样做的目的是:

  • 输入:张量→形状(batch_size, input_size)
  • 使用输入张量查找嵌入→形状(batch_size, input_size, embedding_size)
  • 对轴 1 进行汇总池 → 形状 (batch_size, 1, embedding_size)

我该如何实现呢?我尝试使用tf.ragged.boolean_mask 屏蔽输入张量,但速度较慢,而且我认为这有点矫枉过正。

【问题讨论】:

    标签: python tensorflow machine-learning keras deep-learning


    【解决方案1】:

    您可以通过将一个简单的函数嵌入到 Lambda 层中来做到这一点。

    def switch_layer(inputs):
        
        inp, emb = inputs
        zeros = tf.zeros_like(inp)
        ones = tf.ones_like(inp)
        
        inp = tf.keras.backend.switch(inp > 0, ones, zeros)
        inp = tf.expand_dims(inp, -1)
        
        return inp * emb
    

    这里是完整模型:

    embedding_size = 4
    X = np.asarray([[0, 1, 2, 0, 3]])
    
    inp = Input((None,))
    x = Embedding(4, embedding_size)(inp)
    x = Lambda(switch_layer)([inp, x])
    
    model = Model(inp, x)
    
    pred = model.predict(X)
    

    'switch function'接收原始整数序列和嵌入映射作为输入。它将嵌入向量转换为零,其中原始输入整数等于 0,否则它什么也不做。

    如您所见,最终输出 (pred) 是一个形状为 (batch_size, input_size, embedding_size) 的张量,其向量在原始输入为 0 的位置为零。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 2023-03-29
      • 1970-01-01
      • 2018-01-17
      • 1970-01-01
      • 2017-10-12
      • 2019-10-17
      相关资源
      最近更新 更多