用PyTorch预测网格坐标的顺序

时间:2019-07-18 09:13:34

标签: deep-learning pytorch lstm recurrent-neural-network

我有一个类似的未解决问题here on Cross Validated(尽管不是以实现为重点,我希望这个问题可以解决,所以我认为它们都是有效的)。

我正在一个使用传感器监视人员GPS位置的项目。然后,坐标将转换为简单网格表示。我想尝试做的是在记录用户路线后,训练神经网络来预测下一个坐标,即以下面的示例为例,用户随着时间的推移仅重复两条路线, Home-> A 首页-> B

我想用不同长度的序列训练RNN / LSTM,例如(14,3), (13,3), (12,3), (11,3), (10,3), (9,3), (8,3), (7,3), (6,3), (5,3), (4,3), (3,3), (2,3), (1,3),然后还预测具有不同长度的序列,例如对于这个示例路线,如果我打电话

route = [(14,3), (13,3), (12,3), (11,3), (10,3)] //pseudocode
pred = model.predict(route)

pred应该给我(9,3)(或者最好是更长的预测,例如((9,3), (8,3), (7,3), (6,3), (5,3), (4,3), (3,3), (2,3), (1,3)

如何将这样的训练序列提供给下面确定的initforward操作?

self.rnn = nn.RNN(input_size, hidden_dim, n_layers, batch_first=True)
out, hidden = self.rnn(x, hidden)

另外,整个路径应该是张量还是路径内的每组坐标都应该是张量?

enter image description here

1 个答案:

答案 0 :(得分:4)

我对RNN的经验不是很丰富,但是我会尝试一下。

开始之前需要注意的几件事:
1.您的数据不是StackBlitz
2.您想要的输出预测(即使在归一化之后)也没有限制在[-1, 1]范围内,因此您不能有normalizedtanh激活作用于输出预测。

为解决您的问题,我提出了一个递归网络,该网络给出当前状态(2D坐标)可预测下一个状态(2D坐标)。请注意,由于这是一个循环网络,因此每个位置还存在一个隐藏状态。首先,隐藏状态为零,但是随着网络看到更多的步骤,它会更新其隐藏状态。

我提出了一个简单的网络来解决您的问题。它具有一个具有8个隐藏状态的RNN层,并具有一个完全连接的层以输出预测。

class MyRnn(nn.Module):
  def __init__(self, in_d=2, out_d=2, hidden_d=8, num_hidden=1):
    super(MyRnn, self).__init__()
    self.rnn = nn.RNN(input_size=in_d, hidden_size=hidden_d, num_layers=num_hidden)
    self.fc = nn.Linear(hidden_d, out_d)

  def forward(self, x, h0):
    r, h = self.rnn(x, h0)
    y = self.fc(r)  # no activation on the output
    return y, h

您可以将两个序列用作训练数据,每个序列是形状为T x 1 x 2的张量,其中T是序列长度,每个序列项是二维(xy)。

要预测(在训练过程中):

rnn = MyRnn()
pred, out_h = rnn(seq[:-1, ...], torch.zeros(1, 1, 8))  # given time t predict t+1
err = criterion(pred, seq[1:, ...])  # compare prediction to t+1

模型经过训练后,您可以先显示k个步骤,然后继续预测接下来的步骤:

rnn.eval()
with torch.no_grad():
  pred, h = rnn(s[:k,...], torch.zeros(1, 1, 8, dtype=torch.float))
  # pred[-1, ...] is the predicted next step
  prev = pred[-1:, ...]
  for j in  range(k+1, s.shape[0]):
    pred, h = rnn(prev, h)  # note how we keep track of the hidden state of the model. it is no longer init to zero.
    prev = pred

我将所有内容放到ReLU中,以便您可以使用它。
为简单起见,我在这里忽略了数据标准化,但是您可以在colab笔记本中找到它。


下一步是什么?
这些类型的预测易于出错累积。应该在训练过程中解决此问题,方法是将输入的“真实”“干净”序列转换为实际的预测序列,从而使模型能够补偿其误差。