Keras求Mask后的Embedding均值

15 篇文章 1 订阅
4 篇文章 0 订阅

        记录下,用tensorflow很容易实现,但Keras稍微麻烦点,基本思路就是先标记出输入序列中0和非0得到这样的序列:mask=[0,0,1,1,1],其中0代表padding或者需要排除计算的位置,然后用这个序列跟Embedding结果进行乘积,将Embedding对应输入为0的向量置0,最后统计非0 位置向量的和除以mask的和即可。代码如下:

import numpy as np
import keras.backend as K
from keras.layers import Input, Embedding, Reshape, Lambda
from keras.models import Model


def build_model(seq_len, vocab_size=100, embed_dim=4):
    # 输入序列
    input_layer = Input(shape=(seq_len,), dtype='int32')
    # Embedding
    embedding_layer = Embedding(input_dim=vocab_size, output_dim=embed_dim)(input_layer)
    # 计算mask,得到[0,0,1,1,1]这样的序列
    mask = Lambda(lambda x: K.cast(K.greater(x, 0), 'float32'))(input_layer)
    # 将mask序列转换为[[0],[0], [1], [1],[1]]
    mask_reshape = Reshape((seq_len, 1))(mask)
    # 得到新的Embedding
    mask_embedding = Lambda(lambda x: x[0] * x[1])([embedding_layer, mask_reshape])
    # 求Embedding的均值
    mean = Lambda(lambda x: K.sum(x, axis=1)/K.sum(mask))(mask_embedding)
    model = Model(inputs=input_layer, outputs=mean)
    return model

data = np.array([[0, 0, 0, 2, 5]])
model = build_model(seq_len=5)
print(model.predict(data))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值