培训PyTorch模型索引器时出错:索引超出自身范围

2024-05-15 22:35:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我是PyTorch的新手,正在尝试实现推荐系统。 我正在研究我的第一个模型(矩阵分解),我在这里发现: https://blog.fastforwardlabs.com/2018/04/10/pytorch-for-recommenders-101.html

我有一个用户ID和项目ID的列表(参考电影ID)以及我传递给 模型如网站所述。我用pandas函数读取文件

training.py:

ratings = pd.read_csv('../data/ratings.csv')
movies = pd.read_csv('../data/movies.csv')

n_users = int(ratings.userId.nunique())
n_items = int(ratings.movieId.nunique())

users = pd.Series.tolist(ratings.userId)
items = pd.Series.tolist(ratings.movieId)
rating_values = pd.Series.tolist(ratings.rating)

model = MatrixFactorization(n_users, n_items, n_factors=20)
loss_fn = torch.nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(),
                            lr=1e-6)

index = 0
for user, item in zip(users, items):
    # get user, item and rating data
rating = Variable(torch.FloatTensor([rating_values[index]]))
user = Variable(torch.LongTensor([int(user)]))
item = Variable(torch.LongTensor([int(item)]))

index += 1
# predict rating
prediction = model(user, item)
loss = loss_fn(prediction, rating)
print(loss)

optimizer.zero_grad()

# backpropagate
loss.backward()

# update weights
optimizer.step()

models.py:

class MatrixFactorization(nn.Module):

    def __init__(self, n_users, n_items, n_factors=20):
        super().__init__()
        # create user embeddings
        self.user_factors = nn.Embedding(n_users, n_factors,
                                         sparse=True)
        # create item embeddings
        self.item_factors = nn.Embedding(n_items, n_factors,
                                         sparse=True)

    def forward(self, user, item):
        # matrix multiplication
        return (self.user_factors(user) * self.item_factors(item)).sum(1)

    def predict(self, user, item):
        return self.forward(user, item)

最后,我得到以下错误:

Traceback (most recent call last):
  File "src\training.py", line 31, in <module>
    prediction = model(user, item)
  File "AppData\Local\Programs\Python\Python39\lib\site-packages\torch\nn\modules\module.py", line 727, in _call_impl
    result = self.forward(*input, **kwargs)
  File "src\models.py", line 20, in forward
    return (self.user_factors(user) * self.item_factors(item)).sum(1)
  File "Python\Python39\lib\site-packages\torch\nn\modules\module.py", line 727, in _call_impl
    result = self.forward(*input, **kwargs)
  File "Python\Python39\lib\site-packages\torch\nn\modules\sparse.py", line 124, in forward
    return F.embedding(
  File "Python\Python39\lib\site-packages\torch\nn\functional.py", line 1852, in embedding
    return torch.embedding(weight, input, padding_idx, scale_grad_by_freq, sparse)
IndexError: index out of range in self

我不明白出了什么问题。模型或我的输入有问题吗


Tags: inpyselflineitemsnntorchitem