Короче говоря, нет возможности напрямую присвоить 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
s до Parameter
s в Link
.
Поэтому вполне естественно, что chainer.Optimizer
не получает Parameter
в качестве своих аргументов, потому что это просто "доставщик" UpdateRule
.
Если вы хотите прикрепить разные UpdateRule
к каждому Parameter
, вы должны напрямую создать экземпляр подкласса UpdateRule
и присоединить его к Parameter
.
person
Yuki Hashimoto
schedule
17.10.2018