Вот пример в Pytorch:
optimizer = optim.Adam([modifier_var], lr=0.0005)
И вот в Tensorflow:
self.train = self.optimizer.minimize(self.loss, var_list=[self.modifier])
Но оптимизаторы Chainer могут использовать только "Link", как я могу применить Optimizer к переменной в Chainer?
Короче говоря, нет никакого способа напрямую назначить chainer.Variable
(even chainer.Parameter
) для chainer.Optimizer
.
Ниже приводится некоторое избыточное объяснение.
Во-первых, я переопределяю Variable
и Parameter
чтобы избежать путаницы.
Variable
является (1) torch.Tensor
в PyTorch v4, (2) torch.autograd.Variable
в PyTorch v3 и (3) chainer.Variable
в Chainer v4. Variable
- это объект, который имеет два тензора; .data
и .grad
. Это необходимое и достаточное условие, поэтому Variable
не обязательно является обучаемым параметром, который является целью оптимизатора.
В обеих библиотеках есть еще один класс Parameter
, который аналогичен, но не то же самое с Variable
. Parameter
- torch.autograd.Parameter
в Pytorch и chainer.Parameter
в Chainer. Parameter
должен быть изучаемым параметром и должен быть оптимизирован.
Поэтому не должно быть случая зарегистрировать Variable
(not Parameter
) для Optimizer
(хотя PyTorch позволяет регистрировать Variable
to Optimizer
: это просто для обратной совместимости).
Во-вторых, в PyTorch torch.nn.Optimizer
напрямую оптимизирует Parameter
, но в цепочке chainer.Optimizer
Оптимизатор НЕ оптимизирует Parameter
: вместо этого, chainer.UpdateRule
делает. Optimizer
просто регистрирует UpdateRule
для Parameter
в Link
.
Поэтому вполне естественно, что chainer.Optimizer
не получает Parameter
качестве своих аргументов, потому что он просто " UpdateRule
доставки" UpdateRule
.
Если вы хотите подключить разные UpdateRule
для каждого Parameter
, вы должны напрямую создать экземпляр подкласса UpdateRule
и прикрепить его к Parameter
.
Ниже приведен пример изучения задачи регрессии с MyChain
модели MyChain
MLP с использованием оптимизатора Adam
в Chainer.
from chainer import Chain, Variable
# Prepare your model (neural network) as 'Link' or 'Chain'
class MyChain(Chain):
def __init__(self):
super(MyChain, self).__init__(
l1=L.Linear(None, 30),
l2=L.Linear(None, 30),
l3=L.Linear(None, 1)
)
def __call__(self, x):
h = self.l1(x)
h = self.l2(F.sigmoid(h))
return self.l3(F.sigmoid(h))
model = MyChain()
# Then you can instantiate optimizer
optimizer = chainer.optimizers.Adam()
# Register model to optimizer (to indicate which parameter to update)
optimizer.setup(model)
# Calculate loss, and update parameter as follows.
def lossfun(x, y):
loss = F.mean_squared_error(model(x), y)
return loss
# this iteration is "training", to fit the model into desired function.
for i in range(300):
optimizer.update(lossfun, x, y)
Итак, в общем, вам нужно setup
model
, после чего вы можете использовать функцию update
для вычисления параметра потери и обновления model
. Вышеприведенный код исходит отсюда
Кроме того, есть другой способ написать учебный код с помощью модуля Trainer
. Для более подробного руководства Chainer, пожалуйста, см. Ниже