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