深度学习原理 Lesson 11:Data Block API & Optimizer

15a34e5f984841c56f441b1d1d6c9712.jpeg

1

   

简介

  1. 一个精简的初始化技术:Layer-wise Sequential Unit Variance (LSUV)

    1. 从零搭建

    2. 监测LSUV带来的改变

  2. Data Block API

    1. Get files:os.scandir进入文件系统 os.walk递归树

    2. Transformation:list func组合来高速转化数据

    3. Split & Label

    4. DataBunch:只是DataLoader的一个很简单的容器

    5. 从零搭建

    6. 更好的运用,和个性化配置

    7. 重点研究

  3. StatefulOptimizer Class:大部分主流optimizer都是基于此,比如weight decay,momentum,Adam,LAMB,并在此深入看下momentum带来的提升

  4. 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

  1. 从文件夹中把需要的文件读取到一个list中

  • os.scandir:扫描一个目录下的所有文件

  • os.walk:可以扫描一个目录下的目录

用返回的文件list,封装成 class ImageList( ItemList )

136c4883a3dd5979e588d3bb147c15ab.jpeg

3.2

   

Split

  1. 把train和valid的数据分开

  2. 这里讲的是根据目录名来划分,fn.parent.parent.name如果等于train就是train组

  3. 再抽象一点,就是根据任意func来划分,返回真就是train组

  4. 最后封装成class SplitData

3.3

   

Label

  1. 取到items.parent.name,即为label

  2. 用CategoryProcessor - uniqueify 把类别去重变成list,index作为id,即为vocab

  3. 按顺序输入把item的label映射成id,即y_list

  4. 最后对train和valid分别label,封装成class LabelData

3.4

   

Transform

把转换的func添加到tfms即可,也可以通过.transform( tfms )的方式添加,要使用和展示图片时才会触发

6ab8bb088507abaa8ad7decce45ddd38.jpeg

3.5

   

DataBunch

  1. 封装成class DataBunch,可以通过train_ds,train_dl等各种属性去调用内部数据

  2. 之后一般还会加个normalize,把数据做标准化处理

4

   

StatefulOptimizer

Optimizer的作用:在Backward中,通过更科学的的方式调整grad,实现更快更好的拟合本节由浅入深的讲解了Optimizer中steppers的实现方式,至于StatefulOptimizer会在3中讲解

  1. SGD

  2. SGD + Weight Decay

  3. Momentum + Weight Decay

  4. Adam + Weight Decay

  5. LAMB

4.1

   

SGD

首先调用方式如下:

f6be143875e3acdc26aac1f6a08f8fe6.png

3c2441a309951b6c5c8fab4023e6b0ab.png

Step

核心就是p = p - lr * p.grad

82e5846486021df9de55d032f45e5d29.png而这个add是个特殊用法,即先把括号内的相乘再相加

9e23c48ee9405be972af804e095cc138.jpeg

Optimizer

主要作用是设定一个hyper的属性,用来保存每个parameter的lr,将来还可以寸更多参数当然还可以保存更多属性,和方法

4.2

   

SGD + Weight Decay

Weight Decay是为了防止参数过大导致的overfit,而设计的一种惩罚机制,会加入到loss的计算

a6e5dbfdbe6abdcf589cb30505982a2d.png

622d43087a1a2ae9c0e005d9dbc95125.jpeg

还有一种用的比较多的叫L2 Regularization,只是计算方式不用,因为WD和Adam搭配效果更好,所以fastai默认用WD,这是L2的公式:

5caffbad2239d096dbc470b577cc6b70.png

4.3

   

Momentum + Weight Decay

Momentum实现的效果,就是将剧烈抖动的拟合曲线,变得非常平滑,更容易拟合到最佳状态,大致就是如下的效果

e1fe151d0283346b08546e81ea55423c.jpeg  →  18e5ef165ab3e93e7005591e2f481b54.jpeg
实现方式是,用moving average of the gradients取代gradient进行计算,那avg_grad计算方式如下:

80f12132120596cc11da94f5b555ae9c.jpeg

因为要保存每个param的grad_avg,所以要增加一个state的概念来存储,于是乎就需要把Optimizer升级为StatefulOptimizer

fdd2f278a61598a114301e1330594621.jpeg

7c2214519809ab7ae334e9b7375ae8e8.jpeg

Momentum Experiments

这里还通过数据实验,展示了Momentum的效果

实验1:

da72bee8e208ef429e55bdce60b6bbbb.jpegc081787ceee7bac1c7d891024161be72.jpeg

实验2:

44739c911bf2255647b955c8fa9cf7a9.jpeg4309a851d811940e53487110d8804c60.jpeg

上图拟合的很好,但因为都是随机函数,很多实际问题往往是个曲线函数,如是更换初始值。发现一开始拟合很慢,而且beta过大的时候就失真了。

0e587db31bce8cbdff3be16576c09751.jpeg

于是在实验3中增加debiasing,有点类似于Lesson5 中的RMSProp

8fbc3a0726bb5b189aff26c929638fc6.jpeg7e1dc27124fa67b9cbaa3f6644b94222.jpeg

4.4

   

Adam + Weight Decay

5ea6e97899f23ed838b5d2e2823ef8f7.jpeg

7d6927c066e774f62900e31a2c2b2a18.png

04563e905c9872508731c956f35e50e1.jpeg

bcb523103ad2100dabee8966c625ef01.jpeg

517c8a2beb2541c9af24c9aa212c5364.jpeg

4.5

   

LAMB

也没太搞懂,但貌似是基于layer的均值的gradient

c0be93e59827a76b912ea9ff12a95ca3.jpeg

1ae77275e16884b0135a3cf08372c5cb.jpeg

d764b1e67c6450e574dacd05a53a917e.jpeg

5

   

Runner & Progress Bar

这两部分简单提到了

  1. 把Runner合并到Learner中

  2. 把fit的结果用Progress Bar来展示具体操作可以看Notebook

6

   

Data Augmentation

  1. PIL transform的代码

  2. Batch transform的性能

6.1

   

PIL

Python Image Library

  1. view image

  2. flip

  3. radom crop

  4. random resize crop kaggle冠军必用的技术

  5. perspective warping 透视变形

  6. faster tensor creation 图片更快转tensor的方法

view

有些图像在压缩时会失去必要特征,需要注意处理的算法

d96158d6ca9acb34e5e5277f6ddc0cb4.jpeg

flip

6135f38f59a35481e7d1be164781f8fd.jpeg

random crop

居中剪裁

c90a196d4369966ae19c3aeb64398762.jpeg

random resize crop

922b2fe984347c7c35dd734d9d32ee28.jpeg

154bcc82b45bb01199d4e307867bd28e.jpeg

perspective warping & faster tensor creation

看看例子就行

6.2

   

Batch data augmentation

用Pytorch来做Batch的transform,而且可以放在GPU上,效率非常高这里演示的是affine/coord transforms

  1. 生成grid

  2. affine矩阵乘积,实现transform

  3. interpolate插值,reflection效果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值