在keras / tf中创建自定义的multihot嵌入层

时间:2018-08-02 00:59:03

标签: python-3.x tensorflow keras keras-layer

我想在keras中创建一个自定义嵌入层,但不确定如何做。

作为输入,我将为每个示例传递可变数量的整数(索引,我希望根据这些整数生成固定大小的向量)。此嵌入的numpy版本(具有batch_size = 1)将是:

class numpyEmbedding():

    def __init__(self,vocab_size):
        self.vocab_size  = vocab_size
        self.build()


    def build(self):
        self.W = np.eye(self.vocab_size,dtype=np.int8)

    def __call__(self,x):
         return np.sum(self.W[:,x],axis=-1)

我想这层的keras版本应该是可能的,但是我不确定如何使它起作用,我需要考虑什么,因为它必须应用于微型数组而不是单个数组。 / p>

谢谢!

伊利亚

编辑:

示例输入:

vec = np.random.choice(np.arange(10),100).astype(int)
emb=numpyEmbedding(int(10))(vec)

输出:

array([11, 10, 11,  9,  8,  9, 13, 12,  6, 11])

1 个答案:

答案 0 :(得分:0)

我能够弄清楚答案

class MultihotEmbedding(layers.Layer):

    def __init__(self, vocab_size, **kwargs):
        self.vocab_size = vocab_size
        super(MultihotEmbedding, self).__init__(**kwargs)

    def call(self, x):
        self.get_embeddings = K.one_hot(x,num_classes=self.vocab_size)
        self.reduce_embeddings = K.sum(self.get_embeddings,axis = -2)
        return self.reduce_embeddings

    def compute_output_shape(self, input_shape):
        return (input_shape[0], self.vocab_size)