Deep learning 在PyTorch中进行多个嵌入的更快方法?
我正在开发一个用于使用表格数据集构建自动编码器的程序 一个重要的特性是学习分类特性的嵌入 然而,在实践中,同时训练多个嵌入层会导致速度减慢。我使用for循环来实现这一点,并且在每次迭代中运行for循环(我认为)是导致速度减慢的原因 构建模型时,我将嵌入层与用户数据集中的每个分类特征相关联:Deep learning 在PyTorch中进行多个嵌入的更快方法?,deep-learning,pytorch,torch,embedding,autoencoder,Deep Learning,Pytorch,Torch,Embedding,Autoencoder,我正在开发一个用于使用表格数据集构建自动编码器的程序 一个重要的特性是学习分类特性的嵌入 然而,在实践中,同时训练多个嵌入层会导致速度减慢。我使用for循环来实现这一点,并且在每次迭代中运行for循环(我认为)是导致速度减慢的原因 构建模型时,我将嵌入层与用户数据集中的每个分类特征相关联: for ft in self.categorical_fts: feature = self.categorical_fts[ft] n_cat
for ft in self.categorical_fts:
feature = self.categorical_fts[ft]
n_cats = len(feature['cats']) + 1
embed_dim = compute_embedding_size(n_cats)
embed_layer = torch.nn.Embedding(n_cats, embed_dim)
feature['embedding'] = embed_layer
然后,通过调用.forward():
然后x
进入密集层
这样就完成了任务,但在每次向前传递期间运行此for循环确实会降低训练速度,尤其是当数据集有数十或数百个分类列时
有人知道这样的矢量化方法吗?谢谢
更新:
为了更清楚,我制作了这个草图,描述了我是如何将分类特征输入网络的。您可以看到,每个分类列都有自己的嵌入矩阵,而数字特征在传递到前馈网络之前直接连接到它们的输出
我们能在不迭代每个嵌入矩阵的情况下做到这一点吗?我也很想知道是否有更高效/更干净的方法来实现这一点,但到目前为止我还没有发现任何东西:(在这种情况下,tensorflow编译的计算图更高效,但我很失望,因为我更喜欢pytorch。
embeddings = []
for i, ft in enumerate(self.categorical_fts):
feature = self.categorical_fts[ft]
emb = feature['embedding'](codes[i])
embeddings.append(emb)
#num and bin are numeric and binary features
x = torch.cat(num + bin + embeddings, dim=1)