如何将优化器应用于Chainer中的变量?

时间:2018-10-16 07:48:40

标签: python chainer

以下是Pytorch中的一个示例:

optimizer = optim.Adam([modifier_var], lr=0.0005)

在Tensorflow中:

self.train = self.optimizer.minimize(self.loss, var_list=[self.modifier])

但是Chainer的优化器只能在“链接”上使用,如何在Optimizer中将Optimizer应用于Variable?

2 个答案:

答案 0 :(得分:1)

简而言之,无法直接将 self.tree_model = QComponentTreeModel(self.model) self.tree_view = QComponentTreeView() self.tree_view.setRootIsDecorated(False) self.tree_view.setModel(self.tree_model) self.tree_view.show() self.tree_view.clicked.connect(self.componentSelected) self.currentComponentChanged.connect( self.tree_view.currentComponentChanged) self.tree_view.setMinimumWidth(400) self.tree_view.setMinimumHeight(300) (甚至chainer.Variable)分配给chainer.Parameter

以下是一些多余的解释。

首先,我重新定义chainer.OptimizerVariable以避免混淆。

Parameter在PyTorch v4中是(1)Variable,在PyTorch v3中是(2)torch.Tensor,而在Chainer v4中是(3)torch.autograd.Variable
chainer.Variable是一个拥有两个张量的对象; Variable.data。这是必要条件,因此.grad不一定是一个可学习的参数,它是优化程序的目标。

在两个库中,都有另一个类Variable,它与Parameter类似但不相同。 Variable在Pytorch中是Parameter,在Chainer中是torch.autograd.Parameter
chainer.Parameter必须是可学习的参数,并且应该进行优化。

因此,不应将Parameter(不是Variable)注册到Parameter(尽管PyTorch允许将Optimizer注册到Variable:只是为了向后兼容。

第二,在PyTorch Optimizer中直接优化torch.nn.Optimizer,但是在Chainer Parameter中则不优化chainer.Optimizer:相反,Parameter可以优化。 chainer.UpdateRule只是将Optimizer注册到UpdateRule中的Parameter中。

因此,Link不会接受chainer.Optimizer作为参数是很自然的,因为它只是Parameter的“送货员”。

如果要为每个UpdateRule附加不同的UpdateRule,则应直接创建Parameter子类的实例,并将其附加到UpdateRule

答案 1 :(得分:0)

以下是在Chainer中使用MyChain优化器通过Adam MLP模型学习回归任务的示例。

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的参数。 上面的代码来自here

此外,还有其他使用Trainer模块编写培训代码的方法。有关Chainer的更详细的教程,请参阅下面的