Ошибка вложения факторизации матрицы PyTorch - PullRequest
0 голосов
/ 01 октября 2019

Я пытаюсь использовать один скрытый слой 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 Ответ

1 голос
/ 01 октября 2019

Вы передаете список в self.vectors,

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

Попробуйте преобразовать его в тензор, прежде чем позвонить self.vectors()

...