Machine learning 如何在PYTORCH中实现两层嵌套FOR循环?

Machine learning 如何在PYTORCH中实现两层嵌套FOR循环?,machine-learning,deep-learning,pytorch,recommendation-engine,matrix-factorization,Machine Learning,Deep Learning,Pytorch,Recommendation Engine,Matrix Factorization,我正在学习在Pytorch中实现因子分解机。 应该有一些特征交叉操作。 例如,我有三个特性[A,B,C],在嵌入之后,它们是[vA,vB,vC],所以特性交叉点是“[vA.vB],[vA.vC],[vB.vC]” 我知道可以通过以下方式简化此操作: 它可以通过矩阵运算来实现。 但这只会给出一个最终结果,比如说,一个值 问题是,如何在不执行FOR循环的情况下获得以下所有交叉向量: 注:“特征\u emb”的大小为[批量大小x特征长度x嵌入大小] g_feature = 0 fo

我正在学习在Pytorch中实现因子分解机。 应该有一些特征交叉操作。 例如,我有三个特性[A,B,C],在嵌入之后,它们是[vA,vB,vC],所以特性交叉点是“[vA.vB],[vA.vC],[vB.vC]”

我知道可以通过以下方式简化此操作:

它可以通过矩阵运算来实现。 但这只会给出一个最终结果,比如说,一个值

问题是,如何在不执行FOR循环的情况下获得以下所有交叉向量: 注:“特征\u emb”的大小为[批量大小x特征长度x嵌入大小]

    g_feature = 0 
    for i in range(self.featurn_len):
        for j in range(self.featurn_len):
            if j <= i: continue
            cross_vec = feature_emb[:,i,:] * feature_emb[:,j,:]       
            g_feature += torch.sum(cross_vec, dim=1)
g_功能=0
对于范围内的i(自特性):
对于范围内的j(自特性):
如果j你可以

cross_vec = (feature_emb[:, None, ...] * feature_emb[..., None, :]).sum(dim=-1)
这将为您提供形状
(批次大小、特征、特征)的
corss\u-vec

或者,您可以使用


请不要发布截图,而是复制粘贴文本。因此无法在屏幕截图中索引文本。
A
vA
或您的
feature\u emb
cross\u vec
?A:batch\u size x feature\u len vA:batch\u size x feature\u len x embedding\u size您的解决方案会给出“点”结果。我有“如果j@JinyangLiu输出矩阵
corss\u vec
是对称的,你可以简单地取矩阵的上/下正则部分。太好了!然后使用
cross\u vec[:,torch.triu(torch.ones(feature\u len,feature\u len),diagonal=1,:]
,我得到了我想要的!!!还有一个问题!如果我想得到答案,也就是说,得到```(批量大小,(特征长度*(特征长度-1))/2,嵌入大小*2)``作为结果。
cross_vec = torch.bmm(feature_emb, feature_emb.transpose(1, 2))