使用 PyTorch 预测网格坐标序列
Predicting sequence of grid coordinates with PyTorch
我有一个类似的开放性问题 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)
)
如何将此类训练序列提供给下面确定的 init
和 forward
操作?
self.rnn = nn.RNN(input_size, hidden_dim, n_layers, batch_first=True)
out, hidden = self.rnn(x, hidden)
另外,是整个路线是一个张量还是路线内的每组坐标都是张量?
我对 RNN 不是很有经验,但我会试一试。
开始之前需要注意的几件事:
1.你的数据不是.
2. 您想要的输出预测(即使在归一化之后)不受 [-1, 1]
范围的限制,因此您不能对输出预测进行 tanh
or ReLU
激活。
为了解决您的问题,我提出了一个给定当前状态(二维坐标)预测下一个状态(二维坐标)的循环网络。请注意,由于这是一个循环网络,因此还有一个与每个位置相关联的隐藏状态。起初,隐藏状态为零,但随着网络看到更多步骤,它会更新其隐藏状态。
我建议使用一个简单的网络来解决您的问题。它有一个带有 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
x1
x2
的张量,其中 T
是序列长度,每个条目都是二维的 (x-y)。
预测(训练期间):
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 中找到它。
下一步是什么?
这些类型的预测很容易出现错误累积。这应该在训练期间解决,方法是将输入从基本事实 "clean" 序列转移到实际预测序列,以便模型能够补偿其错误。
我有一个类似的开放性问题 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)
)
如何将此类训练序列提供给下面确定的 init
和 forward
操作?
self.rnn = nn.RNN(input_size, hidden_dim, n_layers, batch_first=True)
out, hidden = self.rnn(x, hidden)
另外,是整个路线是一个张量还是路线内的每组坐标都是张量?
我对 RNN 不是很有经验,但我会试一试。
开始之前需要注意的几件事:
1.你的数据不是
2. 您想要的输出预测(即使在归一化之后)不受 [-1, 1]
范围的限制,因此您不能对输出预测进行 tanh
or ReLU
激活。
为了解决您的问题,我提出了一个给定当前状态(二维坐标)预测下一个状态(二维坐标)的循环网络。请注意,由于这是一个循环网络,因此还有一个与每个位置相关联的隐藏状态。起初,隐藏状态为零,但随着网络看到更多步骤,它会更新其隐藏状态。
我建议使用一个简单的网络来解决您的问题。它有一个带有 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
x1
x2
的张量,其中 T
是序列长度,每个条目都是二维的 (x-y)。
预测(训练期间):
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 中找到它。
下一步是什么?
这些类型的预测很容易出现错误累积。这应该在训练期间解决,方法是将输入从基本事实 "clean" 序列转移到实际预测序列,以便模型能够补偿其错误。