Матричная факторизация с помощью PyTorch с использованием графического процессора - PullRequest
0 голосов
/ 02 октября 2019

Приведенный ниже код работает, но он очень медленный, так как использует циклы for. В моем университете доступны серверы с ресурсами GPU. Кроме того, я хотел бы понять, как использовать партии для более эффективного обучения модели.

import torch
import torch.nn as nn
import torch.nn.functional as F

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):
        feat_i = self.vectors(i)
        feat_j = self.vectors(j)
        result = (feat_i * feat_j).sum(-1)
        return result


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

epochs = 100
for epoch in range(epochs):
    loss = 0
    for r,c in zip(r_index, c_index):
        i = torch.LongTensor([int(r)])
        j = torch.LongTensor([int(c)])
        rating = torch.FloatTensor([Xij[i, j]])
        # predict
        prediction = model(i, j)
        loss += loss_fn(prediction, rating)

                # Reset the gradients to 0
    optimizer.zero_grad()

                # backpropagate
    loss.backward()

                # update weights
    optimizer.step()
    print(loss)

Я попробовал приведенное ниже изменение, но оно выдало предупреждение. Я не уверен, почему мои целевые размеры не совпадают, но это, похоже, является причиной проблемы.


epochs = 50
for epoch in range(epochs):
    loss = 0

    # predict
    i = torch.LongTensor(r_index)
    j = torch.LongTensor(c_index)
    ratings = Xij[i, j]
    prediction = model(i, j)
    loss += loss_fn(prediction, rating)

                # Reset the gradients to 0
    optimizer.zero_grad()

                # backpropagate
    loss.backward()

                # update weights
    optimizer.step()
    print(loss)

И предупреждение (не уверен, где я ошибся):

/anaconda3/lib/python3.6/site-packages/torch/nn/modules/loss.py:431: UserWarning: Using a target size (torch.Size([1])) that is different to the input size (torch.Size([5931640])). This will likely lead to incorrect results due to broadcasting. Please ensure they have the same size.
  return F.mse_loss(input, target, reduction=self.reduction)

1 Ответ

0 голосов
/ 02 октября 2019

Во втором фрагменте кода есть опечатка,

loss += loss_fn(prediction, ratings) # instead of rating
...