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
only expands 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 lesson2-image_models.ipynb
:
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.
- Assertion improved: https://github.com/fastai/fastai/pull/637
- Notebook fixed: https://github.com/fastai/fastai/pull/638