Как сделать 2-слойный вложенный цикл FOR в PYTORCH? - PullRequest
1 голос
/ 07 марта 2019

Я учусь внедрять машину факторизации в Pytorch. И должна быть какая-то особенность операций пересечения. Например, у меня есть три функции [A, B, C], после встраивания они являются [vA, vB, vC], поэтому пересечение функций это "[vA · vB], [vA · vC], [vB · ВК]».

Я знаю, что эту операцию можно упростить с помощью следующего: enter image description here

Может быть реализовано с помощью MATRIX OPERATIONS. Но это дает только конечный результат, скажем, одно значение.

Вопрос в том, как получить все cross_vec в следующем без цикла FOR: примечание: размер "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)

1 Ответ

1 голос
/ 07 марта 2019

Вы можете

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...