在 keras/tf 中制作自定义 multihot 嵌入层
Making custom multihot embedding layer in keras/tf
我想在 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 版本应该是可能的,但我不确定如何让它工作以及我需要考虑什么,因为它必须应用于数组的小批量而不是单个数组.
谢谢!
伊利亚
编辑:
示例输入:
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])
我找到了答案
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)
我想在 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 版本应该是可能的,但我不确定如何让它工作以及我需要考虑什么,因为它必须应用于数组的小批量而不是单个数组.
谢谢!
伊利亚
编辑:
示例输入:
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])
我找到了答案
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)