It seems that the library continues to change w/o updating the notebooks to reflect the changes.
courses/dl1/lesson7-CAM.ipynb: last section: Model
learn.unfreeze() learn.bn_freeze(True) lr=np.array([1e-6,1e-4,1e-2]) learn.fit(lr, 2, cycle_len=1) /mnt/disc1/fast.ai/fastai/courses/dl1/fastai/layer_optimizer.py in opt_params(self) 17 18 def opt_params(self): ---> 19 assert(len(self.layer_groups) == len(self.lrs)) 20 assert(len(self.layer_groups) == len(self.wds)) 21 params = list(zip(self.layer_groups,self.lrs,self.wds)) AssertionError:
There is no assert message. Digging into it.
lrs is of size 3 and the
layer_groups is of size 12.
core.py's listify is supposed to expand
lrs to match the # of layer groups:
def listify(x, y): if not is_iter(x): x=[x] n = y if type(y)==int else len(y) if len(x)==1: x = x * n return x
lrs to match the number of layer groups if it’s of size 1. So how is this code supposed to work?
3 against 12
This works with a different NN with exactly 3 layer_groups used in
lrs = np.array([lr/9, lr/3, lr]) learn.unfreeze() learn.fit(lrs, 3, cycle_len=1, cycle_mult=2)
So this looks like either a bug in the fastai library, or the notebook. If this is by design then the notebook needs to be changed to do something like:
learn.unfreeze() learn.bn_freeze(True) lr=np.array([[1e-6]*4,[1e-4]*4,[1e-2]*4]).flatten() learn.fit(lr, 2, cycle_len=1)
and then it works. But somehow I thought fastai was supposed to magically broadcast smaller groups onto bigger ones.