代码之家  ›  专栏  ›  技术社区  ›  Ilya

在keras/tf中定制多热嵌入层

  •  0
  • Ilya  · 技术社区  · 6 年前

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

    作为输入,我会为每个示例传递一个可变数量的整数(索引,我想从中生成一个固定大小的向量)。这种嵌入的numpy版本(批量大小=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版本的这一层应该是可能的,但我不确定如何让它工作,以及我需要考虑什么,因为它必须应用于小批量阵列,而不是单个阵列。

    谢谢

    伊利亚

    编辑:

    输入示例:

    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 回复  |  直到 6 年前
        1
  •  3
  •   Ilya    6 年前

    我找到了答案

    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)