【问题标题】:How to do 2-layer nested FOR loop in PYTORCH?如何在 PYTORCH 中进行 2 层嵌套 FOR 循环?
【发布时间】:2019-07-28 23:58:40
【问题描述】:

我正在学习在 Pytorch 中实现分解机。 并且应该有一些特征交叉操作。 比如我有三个特征[A,B,C],嵌入后是[vA,vB,vC],所以特征交叉是“[vA·vB],[vA·vC],[vB ·vc]"。

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

它可以通过 MATRIX OPERATIONS 来实现。 但这只会给出最终结果,比如一个值。

问题是,如何在不做FOR循环的情况下获取下面所有的cross_vec: 注意:“feature_emb”的大小是 [batch_size x feature_len x embedding_size]

    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)

【问题讨论】:

  • 请不要发布屏幕截图 - 而是复制粘贴文本。 SO 无法索引屏幕截图中的文本。
  • AvA 或您的 feature_embcross_vec 的尺寸是多少?
  • A:batch_size x feature_len vA:batch_size x feature_len x embedding_size

标签: machine-learning deep-learning pytorch recommendation-engine matrix-factorization


【解决方案1】:

你可以

cross_vec = (feature_emb[:, None, ...] * feature_emb[..., None, :]).sum(dim=-1)

这应该给你corss_vec 形状(batch_size, feature_len, feature_len)

或者,您可以使用torch.bmm

cross_vec = torch.bmm(feature_emb, feature_emb.transpose(1, 2))

【讨论】:

  • 您的解决方案给出了“点”结果。我在 for 循环中有“if j
  • @JinyangLiu 输出矩阵corss_vec 是对称的,你可以简单地取矩阵的上/下训练部分。
  • 太棒了!使用cross_vec[:, torch.triu(torch.ones(feature_len, feature_len), diagonal=1) == 1, :],我得到了我想要的!!!
  • 还有一个问题!如果我想得到连接,也就是说,得到``` (batch_size, (feature_len * (feature_len-1))/2, embedding_size * 2) ``` 作为结果。
猜你喜欢
  • 2020-05-28
  • 2017-09-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-28
  • 1970-01-01
  • 2021-02-15
  • 1970-01-01
  • 2020-12-05
相关资源
最近更新 更多