【问题标题】:PyTorch matrix factorization embedding errorPyTorch 矩阵分解嵌入错误
【发布时间】:2020-01-30 22:38:06
【问题描述】:

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

我拥有的数据是一个 [9724x9724] 矩阵 X,其中的列和行代表相互喜欢的数量。 (例如 X[0,1] 表示同时喜欢 item 0 和 item 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 类没有将张量识别为要优化的模型参数。

对我哪里出错有什么想法吗?

【问题讨论】:

    标签: python pytorch embedding matrix-factorization


    【解决方案1】:

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

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

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

    【讨论】:

    • 那么,return 语句应该改为return (self.vectors(i)*torch.transpose(self.vectors(j))).sum(1) 吗? n_items 也设置为len(movie_ids),它是一个整数;所以 self.vectors 应该收到一个整数,而不是一个列表。没有?
    • 在您发布的博客中,useritem 都是张量,user = Variable(torch.LongTensor([int(user)]))item = Variable(torch.LongTensor([int(item)]))。所以你可以这样定义,然后照你说的做。
    猜你喜欢
    • 2021-04-28
    • 2021-03-19
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多