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

我正在学习在Pytorch中实现因子分解机(Factorization Machine)。其中应该有一些特征交叉操作。例如,我有三个特征[A,B,C],经过嵌入后,它们变为[vA,vB,vC],所以特征交叉是“[vA·vB], [vA·vC], [vB·vc]”。

我知道这个操作可以通过以下方式简化:enter image description here

它可以通过矩阵运算来实现。但这只给出了一个最终结果,即一个单一的值。

问题是,如何在不使用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))

Related Posts

关于k折交叉验证的直观问题

我在使用交叉验证检查预测能力时遇到了一些直观问题,我认…

调整numpy数组大小以使用sklearn的train_test_split函数?

我正在尝试使用sklearn中的test_train_…

如何转换二维张量和索引张量以便用于torch.nn.utils.rnn.pack_sequence

我有一组序列,格式如下: sequences = to…

模型预测值的含义是什么?

我在网上找到一个数字识别器的CNN模型并进行了训练,当…

锯齿张量作为LSTM的输入

了解锯齿张量以及如何在TensorFlow中使用它们。…

如何告诉SciKit的LinearRegression模型预测值不能小于零?

我有以下代码,尝试根据非价格基础特征来估值股票。 pr…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注