Dans ma structure de NN, je veux utiliser un taux d'apprentissage différent ou un optimiseur, par ex. AdaGrad, dans chaque couche. Comment l'implémenter? Attends ton aide. Thks.Comment implémenter un taux d'apprentissage séparé ou un optimiseur dans une couche différente dans Chainer?
1
A
Répondre
0
Après l'installation optimizer
au model
, chaque paramètre de link
dans le modèle a update_rule
attribut (par exemple AdaGradRule
dans ce cas), qui définit comment mettre à jour ce paramètre.
Et chaque update_rule
a hyperparam
attribut séparément, de sorte que vous pouvez remplacer ces hyperparam
pour chaque paramètre dans le lien.
Voici une exemple de code,
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...
...
Excellent travail! Comment une description détaillée que je cherche c'est. J'apprécie pour votre aide. Je vais essayer plus tard et vous donner plus de réponse. –
Wow, ça marche parfaitement! Mais j'ai une autre question qui est-ce que je peux définir des optimiseurs séparés - adagrad, sgd - et l2 régularisation - 0.0001, 0.00001 - pour chaque couche? –
@corochann \t Je suis désolé de vous déranger à nouveau. Quand je mets model.l1.W.update_rule.hyperparam.lr = 0.01. Comment appliquer "la décroissance après chaque époque" lors de la définition du taux d'apprentissage de cette couche individuelle? – machen