Как применить оптимизатор для переменной в Chainer?

1

Вот пример в 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

2 ответа

0
Лучший ответ

Короче говоря, нет никакого способа напрямую назначить 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.

0

Ниже приведен пример изучения задачи регрессии с 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, пожалуйста, см. Ниже

Ещё вопросы

Сообщество Overcoder
Наверх
Меню