PyTorch 矩阵分解嵌入错误
PyTorch matrix factorization embedding error
我正在尝试使用单个隐藏层 NN 来执行矩阵分解。一般来说,我试图求解一个张量 V,其尺寸为 [9724x300],其中库存中有 9724 件物品,而 300 是任意数量的潜在特征。
我的数据是一个[9724x9724]矩阵X,其中列和行代表相互喜欢的数量。 (例如X[0,1]表示同时喜欢item 0和item 1的用户的总和。对角条目不重要。
我的目标是使用 MSE 损失,使得 V[i,:] 在 V[j,:] 转置上的点积非常非常接近 X[i,j]。
下面是我从下面link改编的代码。
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 class 没有将张量识别为要优化的模型参数。
有没有想过我哪里出错了?
您正在将列表传递给 self.vectors
、
return (self.vectors([i])*torch.transpose(self.vectors([j]))).sum(1)
在调用之前尝试将其转换为张量 self.vectors()
我正在尝试使用单个隐藏层 NN 来执行矩阵分解。一般来说,我试图求解一个张量 V,其尺寸为 [9724x300],其中库存中有 9724 件物品,而 300 是任意数量的潜在特征。
我的数据是一个[9724x9724]矩阵X,其中列和行代表相互喜欢的数量。 (例如X[0,1]表示同时喜欢item 0和item 1的用户的总和。对角条目不重要。
我的目标是使用 MSE 损失,使得 V[i,:] 在 V[j,:] 转置上的点积非常非常接近 X[i,j]。
下面是我从下面link改编的代码。
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 class 没有将张量识别为要优化的模型参数。
有没有想过我哪里出错了?
您正在将列表传递给 self.vectors
、
return (self.vectors([i])*torch.transpose(self.vectors([j]))).sum(1)
在调用之前尝试将其转换为张量 self.vectors()