PyTorch矩阵分解嵌入错误

时间:2019-10-01 15:33:12

标签: python pytorch embedding matrix-factorization

我正在尝试使用单个隐藏层NN进行矩阵分解。总的来说,我试图求解张量V,尺寸为[9724x300],其中库存9724个项目,而300个是任意数量的潜在特征。

我拥有的数据是[9724x9724]矩阵X,其中的行和列表示相互喜欢的次数。 (例如X [0,1]代表同时喜欢项目0和项目1的用户总数。对角线条目并不重要。

我的目标是使用MSE损失,以使V [i ,:]在V [j ,:]上的点积非常非常接近X [i,j]。

下面是我从下面的链接改编的代码。

https://blog.fastforwardlabs.com/2018/04/10/pytorch-for-recommenders-101.html

import torch
from torch.autograd import Variable

class MatrixFactorization(torch.nn.Module):
    def __init__(self, n_items=len(movie_ids), n_factors=300):
        super().__init__()

        self.vectors = nn.Embedding(n_items, n_factors,sparse=True)


    def forward(self, i,j):
        return (self.vectors([i])*torch.transpose(self.vectors([j]))).sum(1)

    def predict(self, i, j):
        return self.forward(i, j)

model = MatrixFactorization(n_items=len(movie_ids),n_factors=300)
loss_fn = nn.MSELoss() 
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

for i in range(len(movie_ids)):
    for j in range(len(movie_ids)):
    # get user, item and rating data
        rating = Variable(torch.FloatTensor([Xij[i, j]]))
        # predict
#         i = Variable(torch.LongTensor([int(i)]))
#         j = Variable(torch.LongTensor([int(j)]))
        prediction = model(i, j)
        loss = loss_fn(prediction, rating)

        # backpropagate
        loss.backward()

        # update weights
        optimizer.step()

返回的错误是:

TypeError: embedding(): argument 'indices' (position 2) must be Tensor, not list

我对嵌入技术很陌生。我曾尝试将嵌入替换为简单的浮点张量,但是我定义的MatrixFactorization类无法将张量识别为要优化的模型参数。

对我要去哪里出错了吗?

1 个答案:

答案 0 :(得分:1)

您正在将列表传递到self.vectors

return (self.vectors([i])*torch.transpose(self.vectors([j]))).sum(1)

在调用self.vectors()之前尝试将其转换为张量