下面是Py火炬中的一个例子:
optimizer = optim.Adam([modifier_var], lr=0.0005)在Tensorflow这里:
self.train = self.optimizer.minimize(self.loss, var_list=[self.modifier])但是,Chainer的优化器只能在“Link”上使用,我如何将优化器应用于Chainer中的变量?
发布于 2018-10-17 06:02:29
简而言之,没有办法直接将chainer.Variable (偶数或chainer.Parameter)分配给chainer.Optimizer。
以下是一些多余的解释。
首先,我重新定义了Variable和Parameter以避免混淆。
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优化Parameter。Optimizer只是在Link中将UpdateRules注册到Parameters。
因此,chainer.Optimizer不接收Parameter作为它的参数是很自然的,因为它只是UpdateRule的一个“传递人”。
如果希望为每个UpdateRule附加不同的Parameter,则应直接创建UpdateRule子类的实例,并将其附加到Parameter。
发布于 2018-10-16 12:32:38
下面是一个在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的参数。
此外,还有其他使用Trainer模块编写培训代码的方法。有关Chainer的更多详细教程,请参阅下面
https://stackoverflow.com/questions/52830419
复制相似问题