以下是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?
答案 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.Optimizer
和Variable
以避免混淆。
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的更详细的教程,请参阅下面的