|
|
@@ -7,16 +7,11 @@ from chainer.training import extensions, Trainer as T
|
|
|
from chainer.training import trigger as trigger_module
|
|
|
from chainer_addons.training import lr_shift
|
|
|
from chainer_addons.training.optimizer import OptimizerType
|
|
|
-from chainer_addons.training.extensions import SacredReport
|
|
|
from chainer_addons.training.extensions.learning_rate import CosineAnnealingLearningRate
|
|
|
from chainer_addons.training.extensions import AlternateTrainable, SwitchTrainables, WarmUp
|
|
|
|
|
|
from cvdatasets.utils import attr_dict
|
|
|
|
|
|
-def debug_hook(trainer):
|
|
|
- pass
|
|
|
- # print(trainer.updater.get_optimizer("main").target.model.fc6.W.data.mean(), file=open("debug.out", "a"))
|
|
|
-
|
|
|
default_intervals = attr_dict(
|
|
|
print = (1, 'epoch'),
|
|
|
log = (1, 'epoch'),
|
|
|
@@ -24,9 +19,10 @@ default_intervals = attr_dict(
|
|
|
snapshot = (10, 'epoch'),
|
|
|
)
|
|
|
|
|
|
-def observe_alpha(trainer):
|
|
|
- model = trainer.updater.get_optimizer("main").target.model
|
|
|
- return float(model.pool.alpha.array)
|
|
|
+def debug_hook(trainer):
|
|
|
+ pass
|
|
|
+ # print(trainer.updater.get_optimizer("main").target.model.fc6.W.data.mean(), file=open("debug.out", "a"))
|
|
|
+
|
|
|
|
|
|
def _is_adam(opts):
|
|
|
return opts.optimizer == OptimizerType.ADAM.name.lower()
|
|
|
@@ -177,37 +173,3 @@ class Trainer(T):
|
|
|
return
|
|
|
return super(Trainer, self).run()
|
|
|
|
|
|
-class SacredTrainer(Trainer):
|
|
|
- def __init__(self, ex, intervals=default_intervals, *args, **kwargs):
|
|
|
- super(SacredTrainer, self).__init__(intervals=intervals, *args, **kwargs)
|
|
|
- self.extend(SacredReport(ex=ex, trigger=intervals.log))
|
|
|
-
|
|
|
-class AlphaPoolingTrainer(SacredTrainer):
|
|
|
-
|
|
|
- @property
|
|
|
- def model(self):
|
|
|
- return self.updater.get_optimizer("main").target.model
|
|
|
-
|
|
|
- def __init__(self, opts, updater, *args, **kwargs):
|
|
|
- super(AlphaPoolingTrainer, self).__init__(opts=opts, updater=updater, *args, **kwargs)
|
|
|
- ### Alternating training of CNN and FC layers (only for alpha-pooling) ###
|
|
|
- if opts.switch_epochs:
|
|
|
- self.extend(SwitchTrainables(
|
|
|
- opts.switch_epochs,
|
|
|
- model=self.model,
|
|
|
- pooling=self.model.pool))
|
|
|
-
|
|
|
- def reportables(self):
|
|
|
- print_values, plot_values = super(AlphaPoolingTrainer, self).reportables()
|
|
|
- alpha_update_rule = self.model.pool.alpha.update_rule
|
|
|
- if _is_adam(opts):
|
|
|
- # in case of Adam optimizer
|
|
|
- alpha_update_rule.hyperparam.alpha *= opts.kappa
|
|
|
- else:
|
|
|
- alpha_update_rule.hyperparam.lr *= opts.kappa
|
|
|
-
|
|
|
- self.extend(extensions.observe_value("alpha", observe_alpha), trigger=intervals.print)
|
|
|
- print_values.append("alpha")
|
|
|
- plot_values["alpha"]= ["alpha"]
|
|
|
-
|
|
|
- return print_values, plot_values
|