在Lesson 3 - planet中,我看到了这两行代码:
lr = 0.01
learn.fit_one_cycle(5, slice(lr))
如果slice(min_lr,max_lr)那么我理解fit_one_cycle()将使用来自slice(min_lr,max_lr)的扩展学习率。 (希望我对此的理解是正确的)
但是在这种情况下,slice(lr)只有一个参数
fit_one_cycle(5,lr)和 fit_one_cycle(5,slice(lr))有什么区别? 而且,使用slice(lr)代替直接使用lr有什么好处?
答案 0 :(得分:6)
Jeremy花了一段时间解释第5课中的内容。
我了解的是,fastai.vision模块将体系结构分为3组,并根据您输入的内容以可变的学习率对其进行训练。 (起始层通常不需要很大的参数变化)
此外,如果您使用“ fit_one_cycle”,则所有组的学习率均会随其各自的变量学习而退火。
检查第5课https://course.fast.ai/videos/?lesson=5(使用成绩单查找器快速转到“切片”部分)
答案 1 :(得分:0)
这也让我措手不及。我得出的结论是,杰里米出于习惯使用了slice(lr)
。 slice
只不过是python内置的,它用于获取开始,停止和步进的值。
有关源代码的详细信息
def lr_range(self, lr:Union[float,slice])->np.ndarray:
"Build differential learning rates from `lr`."
if not isinstance(lr,slice): return lr
if lr.start: res = even_mults(lr.start, lr.stop, len(self.layer_groups))
else: res = [lr.stop/10]*(len(self.layer_groups)-1) + [lr.stop]
return np.array(res)
def fit(self, epochs:int, lr:Union[Floats,slice]=defaults.lr,
wd:Floats=None, callbacks:Collection[Callback]=None)->None:
"Fit the model on this learner with `lr` learning rate, `wd` weight decay for `epochs` with `callbacks`."
lr = self.lr_range(lr)
if wd is None: wd = self.wd
if not getattr(self, 'opt', False): self.create_opt(lr, wd)
else: self.opt.lr,self.opt.wd = lr,wd
callbacks = [cb(self) for cb in self.callback_fns + listify(defaults.extra_callback_fns)] + listify(callbacks)
fit(epochs, self, metrics=self.metrics, callbacks=self.callbacks+callbacks)
您可以看到在fit
lr_range
中被调用,而在lr_range
even_mults
中被调用:
def even_mults(start:float, stop:float, n:int)->np.ndarray:
"Build log-stepped array from `start` to `stop` in `n` steps."
mult = stop/start
step = mult**(1/(n-1))
return np.array([start*(step**i) for i in range(n)])
在此函数定义中,我们看到已建立对数步进数组。另外,我们看到可以将n
或steps
的值指定为整数。