Класс
torch.optim.Optimizer
принимает список словарей с аргументом params
в качестве группы параметров. В каждом словаре необходимо определить params
и другие аргументы, используемые для этой группы параметров. Если в словаре не указан указанный аргумент c, вместо него будут использованы исходные аргументы, переданные в Optimizer
. Обратитесь к официальной документации для получения дополнительной информации.
Вот обновленный код:
import torch as pt
# Objective function
def f(x, y):
return (10 - 100 * x) ** 2 + (y - 20) ** 2
# Optimal parameters
print("Optimal value:", f(0.1, 20))
# Initial parameters
hp = pt.Tensor([1]), pt.Tensor([10])
print("Initial value", f(*hp))
# Optimiser
for param in hp:
param.requires_grad = True
# eps and betas are shared between the two groups
optimizer = pt.optim.Adam([{"params": [hp[0]], "lr": 1e-3}, {"params": [hp[1]], "lr": 0.1}])
# optimizer = pt.optim.Adam([{"params": [hp[0]], "lr": 1}, {"params": [hp[1]], "lr": 2.2}])
n = 5
for i in range(n):
optimizer.zero_grad()
loss = f(*hp)
loss.backward()
optimizer.step()
for param in hp:
param.requires_grad = False
print("Final parameters:", hp)
print("Final value:", f(*hp))
Попробуйте использовать {"lr": 1}
и {"lr": 2.2}
для первого и второго параметров соответственно. Это приведет к окончательному значению 19,9713.