????????记录下,用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))
|