Create a template for advanced optimizers and implement Adam with easy customization
Steppers¶
Optimizer v2¶
Class for optimizer with param groups and default hyperparameters
class NewOptimizer():
"Optimizer to handle different step functions and hyperparameters"
def __init__(self, params, step_fcns=[sgd_step], **defaults):
_defaults = {'lr':0.1, 'wd':1e-4}
defaults = update_defaults(_defaults, defaults)
#Make params a list of lists
self.params = list(params)
if not isinstance(self.params[0],list): self.params = [self.params]
self.hypes = [{**defaults} for p in self.params]
self.step_fcns = step_fcns
def step(self):
for pg,hype in zip(self.params,self.hypes):
for p in pg:
for step in self.step_fcns:
step(p, **hype)
def zero_grad(self):
for pg in self.params:
for p in pg:
p.zero_grad()
m,_,lf = get_linear_model(0.1)
o = NewOptimizer
db = get_mnist_databunch()
learn = Learner(m,lf,o,db, step_fcns=[l2_reg_step, sgd_step])
run = Runner(learn,[Stats([accuracy]), ProgressCallback()])
run.fit(1, 0.5)
Momentum¶
m,_,lf = get_linear_model(0.1)
o = StatedOptimizer
db = get_mnist_databunch()
learn = Learner(m,lf,o,db, step_fcns=[momentum_step, l2_reg_step], stats=[AverageGrad()])
run = Runner(learn,[Stats([accuracy]), ProgressCallback()])
run.fit(1,0.001)
Adding Dampening¶
m,lf = get_conv_model(), CrossEntropy()
o = adam_opt()
db = get_mnist_databunch()
learn = Learner(m,lf,o,db)
run = Runner(learn,[Stats([accuracy]), ProgressCallback(), HyperRecorder(['lr'])])
run.fit(1, 0.001)
run.cbs[3].plot_loss()