Как применить оптимизатор для переменной в Chainer? - PullRequest
0 голосов
/ 16 октября 2018

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

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Короче говоря, нет способа напрямую присвоить chainer.Variable (даже ни 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(не Parameter) до Optimizer (хотя PyTorch позволяет регистрировать Variable до Optimizer: это только для обратной совместимости).

Во-вторых, в PyTorch torch.nn.Optimizer напрямую оптимизирует Parameter, но в Chainer chainer.Optimizer НЕ оптимизирует Parameter: вместо этого chainer.UpdateRule делает.Optimizer просто регистрирует UpdateRule с Parameter с в Link.

Поэтому вполне естественно, что chainer.Optimizer не получает Parameter в качестве своих аргументов, потому что этопросто «доставщик» UpdateRule.

Если вы хотите присоединить разные UpdateRule для каждого Parameter, вам следует непосредственно создать экземпляр подкласса UpdateRule и прикрепить его кParameter.

0 голосов
/ 16 октября 2018

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

...