首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Chainer变量上应用优化器?

如何在Chainer变量上应用优化器?
EN

Stack Overflow用户
提问于 2018-10-16 07:48:39
回答 2查看 262关注 0票数 1

下面是Py火炬中的一个例子:

代码语言:javascript
复制
optimizer = optim.Adam([modifier_var], lr=0.0005)

在Tensorflow这里:

代码语言:javascript
复制
self.train = self.optimizer.minimize(self.loss, var_list=[self.modifier])

但是,Chainer的优化器只能在“Link”上使用,我如何将优化器应用于Chainer中的变量?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-17 06:02:29

简而言之,没有办法直接将chainer.Variable (偶数或chainer.Parameter)分配给chainer.Optimizer

以下是一些多余的解释。

首先,我重新定义了VariableParameter以避免混淆。

Variable是(1) torch.Tensor in PyTorch v4,(2) torch.autograd.Variable in PyTorch v3,(3) chainer.Variable in Chainer v4。

Variable是一个包含两个张量的对象:.data.grad。这是必要条件和充分条件,因此Variable不一定是一个可学习的参数,它是优化器的目标。

在这两个库中,都有另一个类Parameter,它类似于Variable,但与Variable不同。Parameter在火炬中是torch.autograd.Parameter,在Chainer中是chainer.Parameter

Parameter必须是一个可学习的参数,并且应该进行优化。

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

第二,在PyTorch中,torch.nn.Optimizer直接优化Parameter,但在Chainer chainer.Optimizer中没有优化Parameter:相反,chainer.UpdateRule优化ParameterOptimizer只是在Link中将UpdateRules注册到Parameters。

因此,chainer.Optimizer不接收Parameter作为它的参数是很自然的,因为它只是UpdateRule的一个“传递人”。

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

票数 1
EN

Stack Overflow用户

发布于 2018-10-16 12:32:38

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

代码语言:javascript
复制
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的更多详细教程,请参阅下面

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52830419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档