【问题标题】:Predicting sequence of grid coordinates with PyTorch使用 PyTorch 预测网格坐标序列
【发布时间】:2019-11-27 04:24:00
【问题描述】:

我有一个类似的悬而未决的问题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)

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

【问题讨论】:

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


    【解决方案1】:

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

    开始之前需要注意的几点:
    1.您的数据不是normalized
    2. 你想要的输出预测(即使在归一化之后)不受[-1, 1] 范围的限制,因此你不能让tanhReLU 激活作用于输出预测。

    为了解决您的问题,我提出了一个循环网络,它在给定当前状态(二维坐标)的情况下预测下一个状态(二维坐标)。请注意,由于这是一个循环网络,因此每个位置也有一个隐藏状态。起初,隐藏状态为零,但随着网络看到更多步骤,它会更新其隐藏状态。

    我建议一个简单的网络来解决您的问题。它有一个带有 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
    

    您可以使用您的两个序列作为训练数据,每个序列是一个形状为 Tx1x2 的张量,其中 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
    

    我将所有内容放在colab notebook 中,以便您可以使用它。
    为简单起见,我在这里忽略了数据规范化,但你可以在 colab notebook 中找到它。


    接下来是什么?
    这些类型的预测容易产生错误累积。这应该在训练期间通过将输入从地面实况“干净”序列转移到实际预测序列来解决,以便模型能够补偿其错误。

    【讨论】:

    • @PhilipO'Brien 很高兴我能提供帮助。感谢您的赏金。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-24
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多