馈送神经网络:IndexError:索引超出范围

时间:2021-02-09 12:14:14

标签: machine-learning neural-network pytorch

我是 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])

0 个答案:

没有答案