Hi,
I'm reading the course-v3 ***.ipynb , https://github.com/fastai/course-v3/blob/master/nbs/dl2/09_optimizers.ipynb , and I was wondering whether should I use "self.opt" or "self.run.opt" in the callbackhanders. such as: "class Recorder(Callback):" ,"class ParamScheduler(Callback):" and so on.
here is the code I am geting confused:
class Recorder(Callback):
def begin_fit(self): self.lrs,self.losses = [],[]
def after_batch(self):
if not self.in_train: return #or using: if not self.run.in_train: return
self.lrs.append(self.opt.hypers[-1]['lr']) #or using: self.lrs.append(self.run.opt.hypers[-1]['lr'])
self.losses.append(self.loss.detach().cpu()) #or using: self.losses.append(self.run.loss.detach().cpu())
class ParamScheduler(Callback):
_order=1
def __init__(self, pname, sched_funcs):
self.pname,self.sched_funcs = pname,listify(sched_funcs)
def begin_batch(self):
if not self.in_train: return
fs = self.sched_funcs
if len(fs)==1: fs = fs*len(self.opt.param_groups) #or using: if len(fs)==1: fs = fs*len(self.run.opt.param_groups)
pos = self.n_epochs/self.epochs #or using: pos = self.run.n_epochs/self.run.epochs
for f,h in zip(fs,self.opt.hypers): h[self.pname] = f(pos) #or using: for f,h in zip(fs,self.run.opt.hypers): h[self.pname] = f(pos)
Because , I find the attributes: "opt , loss,n_epochs, epochs.... " are only defined in the Learner(), they are passed to every CallbackHander by the Callback() class through the code:
class Callback():
_order=0
def set_runner(self, run): self.run=run
Hi, I'm reading the course-v3 ***.ipynb , https://github.com/fastai/course-v3/blob/master/nbs/dl2/09_optimizers.ipynb , and I was wondering whether should I use "self.opt" or "self.run.opt" in the callbackhanders. such as: "class Recorder(Callback):" ,"class ParamScheduler(Callback):" and so on. here is the code I am geting confused:
Because , I find the attributes: "opt , loss,n_epochs, epochs.... " are only defined in the Learner(), they are passed to every CallbackHander by the Callback() class through the code: