1
简介
一个精简的初始化技术:Layer-wise Sequential Unit Variance (LSUV)
从零搭建
监测LSUV带来的改变
Data Block API
Get files:os.scandir进入文件系统 os.walk递归树
Transformation:list func组合来高速转化数据
Split & Label
DataBunch:只是DataLoader的一个很简单的容器
从零搭建
更好的运用,和个性化配置
重点研究
StatefulOptimizer Class:大部分主流optimizer都是基于此,比如weight decay,momentum,Adam,LAMB,并在此深入看下momentum带来的提升
Data Augmentation & benchmark various data augmentation techniques
2
LSUV
Layer-wise Sequential Unit Variance 就是一种初始化parameter的技术原理是从数据中拿出1个batch,然后把每个层output的mean和std接近0,1的程度作为loss func,去调节每层的初始parameter
3
Data Block API
看完这一节再去看Data Block 的文档(https://docs.fast.ai/data_block.html)会觉得异常的轻松,因为用了哪些流程和方法,都拆开来看过了的感觉,下面就这几个核心步骤拆开来看下核心环节。
3.1
Get Files
从文件夹中把需要的文件读取到一个list中
os.scandir:扫描一个目录下的所有文件
os.walk:可以扫描一个目录下的目录
用返回的文件list,封装成 class ImageList( ItemList )
3.2
Split
把train和valid的数据分开
这里讲的是根据目录名来划分,fn.parent.parent.name如果等于train就是train组
再抽象一点,就是根据任意func来划分,返回真就是train组
最后封装成class SplitData
3.3
Label
取到items.parent.name,即为label
用CategoryProcessor - uniqueify 把类别去重变成list,index作为id,即为vocab
按顺序输入把item的label映射成id,即y_list
最后对train和valid分别label,封装成class LabelData
3.4
Transform
把转换的func添加到tfms即可,也可以通过.transform( tfms )的方式添加,要使用和展示图片时才会触发
3.5
DataBunch
封装成class DataBunch,可以通过train_ds,train_dl等各种属性去调用内部数据
之后一般还会加个normalize,把数据做标准化处理
4
StatefulOptimizer
Optimizer的作用:在Backward中,通过更科学的的方式调整grad,实现更快更好的拟合本节由浅入深的讲解了Optimizer中steppers的实现方式,至于StatefulOptimizer会在3中讲解
SGD
SGD + Weight Decay
Momentum + Weight Decay
Adam + Weight Decay
LAMB
4.1
SGD
首先调用方式如下:
Step
核心就是p = p - lr * p.grad
而这个add是个特殊用法,即先把括号内的相乘再相加
Optimizer
主要作用是设定一个hyper的属性,用来保存每个parameter的lr,将来还可以寸更多参数当然还可以保存更多属性,和方法
4.2
SGD + Weight Decay
Weight Decay是为了防止参数过大导致的overfit,而设计的一种惩罚机制,会加入到loss的计算
还有一种用的比较多的叫L2 Regularization,只是计算方式不用,因为WD和Adam搭配效果更好,所以fastai默认用WD,这是L2的公式:
4.3
Momentum + Weight Decay
Momentum实现的效果,就是将剧烈抖动的拟合曲线,变得非常平滑,更容易拟合到最佳状态,大致就是如下的效果
→
实现方式是,用moving average of the gradients取代gradient进行计算,那avg_grad计算方式如下:
因为要保存每个param的grad_avg,所以要增加一个state的概念来存储,于是乎就需要把Optimizer升级为StatefulOptimizer
Momentum Experiments
这里还通过数据实验,展示了Momentum的效果
实验1:
实验2:
上图拟合的很好,但因为都是随机函数,很多实际问题往往是个曲线函数,如是更换初始值。发现一开始拟合很慢,而且beta过大的时候就失真了。
于是在实验3中增加debiasing,有点类似于Lesson5 中的RMSProp
4.4
Adam + Weight Decay
4.5
LAMB
也没太搞懂,但貌似是基于layer的均值的gradient
5
Runner & Progress Bar
这两部分简单提到了
把Runner合并到Learner中
把fit的结果用Progress Bar来展示具体操作可以看Notebook
6
Data Augmentation
PIL transform的代码
Batch transform的性能
6.1
PIL
Python Image Library
view image
flip
radom crop
random resize crop kaggle冠军必用的技术
perspective warping 透视变形
faster tensor creation 图片更快转tensor的方法
view
有些图像在压缩时会失去必要特征,需要注意处理的算法
flip
random crop
居中剪裁
random resize crop
perspective warping & faster tensor creation
看看例子就行
6.2
Batch data augmentation
用Pytorch来做Batch的transform,而且可以放在GPU上,效率非常高这里演示的是affine/coord transforms
生成grid
affine矩阵乘积,实现transform
interpolate插值,reflection效果