如何在 PYTORCH 中做 2 层嵌套的 FOR 循环?
How to do 2-layer nested FOR loop in PYTORCH?
我正在学习在 Pytorch 中实现分解机。
并且应该有一些特征交叉操作。
比如我有3个特征[A,B,C],embedding后为[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)
你可以
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))
我正在学习在 Pytorch 中实现分解机。 并且应该有一些特征交叉操作。 比如我有3个特征[A,B,C],embedding后为[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)
你可以
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))