FastAi slice(lr)在fit_one_cycle()中做什么

时间:2019-12-31 01:33:49

标签: machine-learning pytorch fast-ai

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有什么好处?

2 个答案:

答案 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)])

在此函数定义中,我们看到已建立对数步进数组。另外,我们看到可以将nsteps的值指定为整数。