Neural network 如何在Chainer的不同层中实现单独的学习率或优化器?

Neural network 如何在Chainer的不同层中实现单独的学习率或优化器?,neural-network,chainer,Neural Network,Chainer,在我的神经网络结构中,我想在每一层中使用不同的学习速率或优化器,例如AdaGrad。如何实施?等待你的帮助。Thks.将优化器设置到模型后,模型中链接的每个参数都具有update\u rule属性(例如本例中的AdaGradRule),该属性定义了如何更新此参数 并且每个update_规则都分别具有hyperparam属性,因此您可以为链接中的每个参数覆盖这些hyperparam 下面是一个示例代码 class MLP(chainer.Chain): def __init__(self

在我的神经网络结构中,我想在每一层中使用不同的学习速率或优化器,例如AdaGrad。如何实施?等待你的帮助。Thks.

优化器设置到
模型
后,模型中
链接
的每个参数都具有
update\u rule
属性(例如本例中的
AdaGradRule
),该属性定义了如何更新此参数

并且每个
update_规则
都分别具有
hyperparam
属性,因此您可以为链接中的每个参数覆盖这些
hyperparam

下面是一个示例代码

class MLP(chainer.Chain):

    def __init__(self, n_units, n_out):
        super(MLP, self).__init__()
        with self.init_scope():
            # input size of each layer will be inferred when omitted
            self.l1 = L.Linear(n_units)  # n_in -> n_units
            self.l2 = L.Linear(n_units)  # n_units -> n_units
            self.l3 = L.Linear(n_out)  # n_units -> n_out

    def __call__(self, x):
        h1 = F.relu(self.l1(x))
        h2 = F.relu(self.l2(h1))
        return self.l3(h2)

model = MLP(args.unit, 10)
classifier_model = L.Classifier(model)
if args.gpu >= 0:
    chainer.cuda.get_device_from_id(args.gpu).use()  # Make a specified GPU current
    classifier_model.to_gpu()  # Copy the model to the GPU

# Setup an optimizer
optimizer = chainer.optimizers.AdaGrad()
optimizer.setup(classifier_model)

# --- After `optimizer.setup()`, you can modify `hyperparam` of each parameter ---

# 1. Change `update_rule` for specific parameter
#    `l1` is `Linear` link, which has parameter `W` and `b`
classifier_model.predictor.l1.W.update_rule.hyperparam.lr = 0.01

# 2. Change `update_rule` for all parameters (W & b) of one link
for param in classifier_model.predictor.l2.params():
    param.update_rule.hyperparam.lr = 0.01

# --- You can setup trainer module to train the model in the following...
...

优化器
设置到
模型
后,模型中
链接
的每个参数都具有
update\u rule
属性(例如本例中的
AdaGradRule
),该属性定义了如何更新此参数

并且每个
update_规则
都分别具有
hyperparam
属性,因此您可以为链接中的每个参数覆盖这些
hyperparam

下面是一个示例代码

class MLP(chainer.Chain):

    def __init__(self, n_units, n_out):
        super(MLP, self).__init__()
        with self.init_scope():
            # input size of each layer will be inferred when omitted
            self.l1 = L.Linear(n_units)  # n_in -> n_units
            self.l2 = L.Linear(n_units)  # n_units -> n_units
            self.l3 = L.Linear(n_out)  # n_units -> n_out

    def __call__(self, x):
        h1 = F.relu(self.l1(x))
        h2 = F.relu(self.l2(h1))
        return self.l3(h2)

model = MLP(args.unit, 10)
classifier_model = L.Classifier(model)
if args.gpu >= 0:
    chainer.cuda.get_device_from_id(args.gpu).use()  # Make a specified GPU current
    classifier_model.to_gpu()  # Copy the model to the GPU

# Setup an optimizer
optimizer = chainer.optimizers.AdaGrad()
optimizer.setup(classifier_model)

# --- After `optimizer.setup()`, you can modify `hyperparam` of each parameter ---

# 1. Change `update_rule` for specific parameter
#    `l1` is `Linear` link, which has parameter `W` and `b`
classifier_model.predictor.l1.W.update_rule.hyperparam.lr = 0.01

# 2. Change `update_rule` for all parameters (W & b) of one link
for param in classifier_model.predictor.l2.params():
    param.update_rule.hyperparam.lr = 0.01

# --- You can setup trainer module to train the model in the following...
...

干得好!如何详细描述,我正在寻找它。我很感激你的帮助。我稍后会尝试,并给你更多的回应。哇,它的工作非常完美!但我还有另一个问题,我是否可以为每一层设置单独的优化器——adagrad、sgd和l2正则化——0.0001、0.00001?@corochann,很抱歉再次打扰您。当我设置model.l1.W.update_rule.hyperparam.lr=0.01时。如何在设置该层的学习速率时应用“每个历元后的lr衰减”?您可以创建自己的
扩展
函数来更改这些值。也请参考你的学习率控制自定义扩展的例子。出色的工作!如何详细描述,我正在寻找它。我很感激你的帮助。我稍后会尝试,并给你更多的回应。哇,它的工作非常完美!但我还有另一个问题,我是否可以为每一层设置单独的优化器——adagrad、sgd和l2正则化——0.0001、0.00001?@corochann,很抱歉再次打扰您。当我设置model.l1.W.update_rule.hyperparam.lr=0.01时。如何在设置该层的学习速率时应用“每个历元后的lr衰减”?您可以创建自己的
扩展
函数来更改这些值。另请参考您的学习率控制自定义扩展的示例。