有没有办法有效地嵌入很多分类功能?我正在做一个推荐系统,一些用户和物品的功能是分类的。最近的博客文章建议嵌入这些,而不是使用一种热编码(参见
here
或
here
)
然而,目前我编写的嵌入层如下所示:
item_input = Input((1,), name='item_id')
user_input = Input((1,), name='user_id')
item_embedding_layer = Embedding(num_items, latent_dim_items, name='item_embeddings', input_length=1)
user_embedding_layer = Embedding(num_users, latent_dim_users, name='user_embeddings', input_length=1)
item_emb = Flatten(name='item_flat')(item_embedding_layer(item_input))
user_emb = Flatten(name='pos_neg_user_flat')(user_embedding_layer(user_input))
all_embed = Concatenate()([item_emb, user_emb])
如果我现在添加分类,我必须创建一个新的
Embedding
每一层。这很快就会变得一团糟。例如,我有一个数据框架,其中包含我认为应该转化为许多嵌入的项特性
category: embedding
{'item_category_level_1': {'n_uniques': 10, 'n_latent': 4}
'item_category_level_2': {'n_uniques': 50, 'n_latent': 10}}
一种方法是在循环中创建层,但这似乎不是一种真正漂亮的方法。尤其是因为我一直在为每个输入定义不同的输入元素。然后,我的数据生成器需要返回一个非常长的列表。
也可以使用更高的级别组合嵌入
input_shape
,但每个输入的潜在_维度是相等的。这也不是我想要的。
我觉得我应该能够创建一个自定义层
EmbedAndConcat
但我不确定这是最好的方式。关于如何做到这一点,有什么想法吗?