我是 PyTorch 的新手,并尝试提供本教程的 LSTM 模型: https://blog.fastforwardlabs.com/2018/04/10/pytorch-for-recommenders-101.html
我复制了模型和训练的代码,但现在对我不起作用。
型号:
class LSTMRating(nn.Module):
def __init__(self, num_items, embedding_dim=64, hidden_dim=128, num_output=1):
super(LSTMRating, self).__init__()
self.hidden_dim = hidden_dim
self.item_embeddings = nn.Embedding(num_items, embedding_dim)
self.lstm = nn.LSTM(embedding_dim, hidden_dim)
self.linear = nn.Linear(hidden_dim, num_output)
self.hidden = self.init_hidden()
def init_hidden(self):
# initialize both hidden layers
return (Variable(torch.zeros(1, 1, self.hidden_dim)),
Variable(torch.zeros(1, 1, self.hidden_dim)))
def forward(self, sequence):
embeddings = self.item_embeddings(sequence)
output, self.hidden = self.lstm(embeddings.view(len(sequence), 1, -1),
self.hidden)
rating_scores = self.linear(output.view(len(sequence), -1))
return rating_scores
def predict(self, sequence):
rating_scores = self.forward(sequence)
return rating_scores
培训:
embedding_dim = 64
hidden_dim = 128
n_output = 1
# add one to represent padding when there is not enough history
model = LSTMRating(embedding_dim, hidden_dim, n_items+1, n_output)
loss_fn = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.1)
for sequence, target_ratings in training_data:
model.zero_grad()
# initialize hidden layers
model.hidden = model.init_hidden()
# convert sequence to PyTorch variables
sequence_var = Variable(torch.LongTensor(sequence.astype('int64')))
# forward pass
ratings_scores = model(sequence_var)
target_ratings_var = Variable(torch.FloatTensor(target_ratings.astype('float32')))
# compute loss
loss = loss_fn(ratings_scores, target_ratings_var)
# backpropagate
loss.backward()
# update weights
optimizer.step()
当我运行代码时,出现以下错误:
Traceback (most recent call last):
ratings_scores = local_model.predict(sequence_var)
File "models.py", line 82, in predict
rating_scores = self.forward(sequence)
File "models.py", line 75, in forward
embeddings = self.item_embeddings(sequence)
File "\torch\nn\modules\module.py", line 727, in _call_impl
result = self.forward(*input, **kwargs)
File "\torch\nn\modules\sparse.py", line 124, in forward
return F.embedding(
File "\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
我知道张量 sequence_var 的维度有问题。在网页上,他们说模型的输入尺寸应为 10x1x20。我试图将其重塑为维度,但不起作用 - 我只能将其转换为 2D 张量。我尝试过挤压、查看和重塑。
相关参数如下:
训练数据:
[[array([209, 32, 189, 242, 171, 111, 256, 5, 74, 102]), array([4, 5, 3, 5, 5, 5, 4, 3, 1, 2])]]
张量序列变量:
tensor([209, 32, 189, 242, 171, 111, 256, 5, 74, 102])