Георадар и ядро с пиро-аи
Я использую pyro.contrib.gp для обучения своих данных, но столкнулся со странной проблемой. Допустим, мы определяем 2 модели георадара следующим образом:
kernel_init = gp.kernels.RBF(input_dim= dimension, variance=torch.tensor(1.),
lengthscale=length_scale_init)
gpr_init = gp.models.GPRegression(train_x, train_y, kernel_init, noise=torch.tensor(0.), jitter = jitter)
kernel = gp.kernels.RBF(input_dim= dimension, variance=torch.tensor(1.),
lengthscale=length_scale_init)
gpr_opt = gp.models.GPRegression(train_x, train_y, kernel, noise=torch.tensor(0.), jitter = jitter)
Затем после оптимизации параметров масштаба длины ядра с помощью
optimizer = torch.optim.Adam([{‘params’: gpr_opt.kernel.lengthscale_unconstrained}], lr=5e-4)
for i in range(num_steps):
# Zero gradients from previous iteration
optimizer.zero_grad()
# Calc loss and backprop gradients
loss = loss_function(params)
loss.backward()
# Update step
optimizer.step()
losses.append(loss.item())
Наконец, вы хотите вычислить значения двух моделей в некоторых точках test_x:
with torch.no_grad():
init_value = gpr_init(test_x, full_cov=False, noiseless=True)
opt_value = gpr_opt(test_x, full_cov=False, noiseless=True)
И, как ни странно, получается такое же значение, равное
opt_value = init_value
но каждая модель gpr имеет ядро с разными масштабами длины. Почему? Кажется, работает, если я удалю
init_value=...
на последнем этапе после с
torch.no_grad():
.