我想在PyTorch中实现Kalman滤波器。我构建了以下模型:
import torch
from torch import matmul, mm, nn
class DepthV1Acceleration(torch.nn.Module):
def __init__(self, prediction_steps):
super(DepthV1Acceleration, self).__init__()
t = 1 / 30
self.initial_P = torch.tensor([[0, 0, 0],
[0, 1000, 0],
[0, 0, 1000]])
self.P = self.initial_P.clone()
self.F = torch.tensor([[1, t, 0.5 * t ** 2],
[0, 1, t],
[0, 0, 0.9]])
self.depth_acceleration = torch.tensor([0.9], requires_grad=True)
self.F[2, 2] = self.depth_acceleration
self.H = torch.tensor([[1, 0, 0]])
self.R = torch.tensor([[0.01]], requires_grad=True)
self.prediction_steps = prediction_steps
def forward(self, measurements):
output = torch.zeros(measurements[0], measurements[1] - self.prediction_steps, measurements[2])
for i in range(measurements.shape[0]):
self.P = self.initial_P.clone()
x = measurements[i, 0, :]
for j in range(measurements.shape[1], -1 * self.prediction_steps):
z = measurements[i, j, :]
y = z - mm(self.H, x)
S = mm(mm(self.H, self.P), torch.transpose(self.H, 0, 1)) + self.R
K = mm(mm(self.P, torch.transpose(self.H, 0, 1)) @ torch.inverse(S))
x = x + mm(K, y)
self.P = mm((torch.eye(10) - mm(K, self.H)), self.P)
# prediction
output_element = x.clone()
x = mm(self.F, x)
self.P = mm(mm(self.F, self.P), torch.transpose(self.F, 0, 1))
for _ in range(self.prediction_steps):
output_element = mm(self.F, output_element)
output[i, j, :] = output_element
return output
它给了我ValueError: optimizer got an empty parameter list
。我使用以下代码:
model = DepthV1Acceleration(3)
optimizer = torch.optim.Adam(model.parameters(), lr=0.0001)
我用同样的错误检查了其他问题,但没有发现与我的案例类似的问题
您应该设置一个字段来保存pytorch层(继承} 层即可。或者,您可以重写parameters()或named_parameters()
nn.Module
),以便parameters()
找到参数集。张量是不够的;对于线性变换,只需使用^{相关问题 更多 >
编程相关推荐