课程页
fast.ai releases new deep learning course, four libraries, and 600-page book
https://www.fast.ai/2020/08/21/fastai2-launch/

fastai applications - quick start
https://docs.fast.ai/quick_start.html

教程页
https://docs.fast.ai/tutorial.vision

程序页
https://colab.research.google.com/github/fastai/fastai/blob/master/nbs/23_tutorial.vision.ipynb
可点击 “复制到云盘硬盘” 复制到自己的谷歌硬盘

The 1cycle policy learn.lr_find() learn.recorder.plot() learn.fit(2, 5e-3) learn.fit_one_cycle(2, 5e-2)
https://fastai1.fast.ai/callbacks.one_cycle.html
How Do You Find A Good Learning Rate
https://sgugger.github.io/how-do-you-find-a-good-learning-rate.html

Understanding Fastai’s fit_one_cycle method
https://iconof.com/1cycle-learning-rate-policy/

CLRs are not computationally expensive and eliminate the need to find the best learning rate value—the optimal learning rate will fall somewhere between the minimum and maximum bounds.
“The essence of this learning rate policy comes from the observation that increasing the learning rate might have a short term negative effect and yet achieve a longer term beneficial effect.” Smith
Cyclical Learning Rates are effective because they can successfully negotiate saddle points, which typically have small gradients (flat surfaces) and can slow down training when learning rate is small. The best way to overcome such obstacles is to speed up and to move fast until a curved surface is found. The increasing learning rate of CLRs does just that, efficiently.
Concretely, in super-convergence, learning rate starts at a low value, increases to a very large value and then decreases to a value much lower than its initial one.

Picking Out Components of a Path
https://realpython.com/python-pathlib/

import pathlib
pathlib.Path.cwd()
PosixPath(’/home/gahjelle/realpython/’)

path
PosixPath(’/home/gahjelle/realpython/test.md’)

path.name
‘test.md’

path.stem
‘test’

path.suffix
‘.md’

path.parent
PosixPath(’/home/gahjelle/realpython’)

path.parent.parent
PosixPath(’/home/gahjelle’)

path.anchor
‘/’

作者:有糖吃可好
链接:https://www.zhihu.com/question/310138804/answer/581039350
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

unfreeze 在fastai课程中使用的是预训练模型,模型卷积层的权重已经提前在ImageNet 上训练好了,在使用的时候一般只需要在预训练模型最后一层卷积层后添加自定义的全连接层即可。卷积层默认是freeze的,即在训练阶段进行反向传播时不会更新卷积层的权重,只会更新全连接层的权重。在训练几个epoch之后,全连接层的权重已经训练的差不多了,但accuracy还没有达到你的要求,这时你可以调用unfreeze然后再进行训练,这样在进行反向传播时便会更新卷积层的权重(一般不会对卷积层权重进行较大的更新,只会进行一点点的微调,越靠前的卷积层调整的幅度越小,所以有了differential learning rate 这一想法)precompute 当precompute=True时,会提前计算出每一个训练样本(不包括增强样本)在预训练模型最后一层卷积层的activation, 并将其缓存下来,之后在训练阶段进行前向传播的时候,直接将precompute 的activation 作为后面全连接层(FC Layer)的输入,这样便省去前面卷积层进行前向传播的计算量,减少训练所需时间(这种优势在epoch比较大的时候能够显著0提高训练速度)。当precompute=False时,则不会提前计算训练样本的activation,每一个epoch都需要重新将训练样本+增强样本(前提是进行了增强操作)进行卷积层的前向传播,然后进行反向传播更新对应的权重。
总结一下:当precompute=True时:

  1. 增强样本不会参与训练;
  2. 不管你的模型是unfreeze还是freeze都不会更新卷积层的权重,因为activation已经提前计算好了,如果你想要更新卷积层权重,必须把precompute设置为False。 当 precompute=False时 : 如果有增强样本,增强样本这时便会参与模型训练; 如果模型为unfreeze状态,在进行反向传播的时候便会更新卷积层的权重。

Below are the steps we followed to build a State of the Art CLASSIFIER:-

ENABLE DATA AUGMENTATION AND SET PRECOMPUTE = TRUE.
USE lr_find() TO FIND THE HIGHEST LEARNING RATE WHERE LOSS IS STILL CLEARLY IMPROVING
TRAIN LAST LAYER FROM PRECOMPUTED ACTIVATIONS FOR COUPLE OF EPOCHS.
TRAIN LAST LAYER WITH DATA AUGMENTATION (i.e PRECOMPUTE=FALSE) FOR 2–3 EPOCH WITH CYCLE_LEN=1.
UNFREEZE ALL THE LAYERS.
SET EARLIER LAYERS TO LOWER LEARNING RATE THAN NEXT HIGHER LAYERS AND TRAIN IT.
USE lr_find() AGAIN.
TRAIN FULL NETWORK WITH cycle_mult=2 UNTILL OVERFITTING.

下面是我们通常采取的8个步骤:

1.启用数据增强,并设置预计算(precompute)=True
2.使用lrfind()找到最高的学习速率,其中损失仍在明显改善。
3.为1-2个epoch的预计算激活训练最后一层
4.用数据增强的方法(即预计算=False)进行最后一层的训练,使用cyclelen=1的2-3个周期
5.解冻所有的层
6.将较早的层设置为比下一个更高层的3x-10x降低的学习速率
7.再次使用lr_find()
8.用cycle_mult=2训练整个网络,直到过度拟合

img_f = fnames[0]
img = open_image(img_f) #原形式
img.show(figsize=(5,5))

get_y_fn = lambda x: path_lbl/f’{x.stem}_P{x.suffix}’
通常很明显。这里,我猜是文件名 + _P,我创建了一个简单的函数,取文件名,然后加上 _P ,放到另一个目录里 (path_lbl) ,然后尝试打开它,成功了。
f = lambda a,b,c:a+b+c 中的关键字lambda表示匿名函数,
#冒号:之前的a,b,c表示它们是这个函数的参数。
#匿名函数不需要return来返回值,表达式本身结果就是返回值。

##图像显示方法


mask = open_mask(get_y_fn(img_f))
mask.show(figsize=(5,5), alpha=1)

cam_fn = fnames[5]
cam_img = PILImage.create(cam_fn)
cam_img.resize((224,96))
cam_img.show
test_eq(cam_img.size, (128,96))
tmask = Transform(PILMask.create)
mask_fn = path/‘labels’/f’{cam_fn.stem}P{cam_fn.suffix}’
mask = tmask(mask_fn)
test_eq(type(mask), PILMask)
test_eq(mask.size, (128,96))
**
,axs = plt.subplots(1,3, figsize=(16,15))**
cam_img.show(ctx=axs[0], title=‘image’)
mask.show(alpha=1, ctx=axs[1], vmin=1, vmax=30, title=‘mask’)
cam_img.show(ctx=axs[2], title=‘superimposed’)
mask.show(ctx=axs[2], vmin=1, vmax=30);

dls.show_batch(max_n=4)
learn.show_results(max_n=6, figsize=(15,17))

两种数据加载方式

dls = SegmentationDataLoaders.from_label_func(
path, bs=8, fnames = fnames, label_func = label_func, codes = codes
)

camvid = DataBlock(blocks=(ImageBlock, MaskBlock(codes)),
get_items = get_image_files,
get_y = label_func,
splitter=RandomSplitter(),
batch_tfms=aug_transforms(size=(120,160)))
dls = camvid.dataloaders(path/“images”, path=path, bs=8)

learn = unet_learner(dls, resnet34)
learn.fine_tune(3)

learn.fine_tune()
It’s a new method in fastai v2. So in fastai v1 you will still have to use these steps separately.
fit_one_cycle
unfreeze
fit_one_cycle

fastai入门教程和基本概念相关推荐

  1. Hyperledger Fabric 官网翻译入门教程--之关键概念(Hyperledger Fabric 模型)

    英文地址:http://hyperledger-fabric.readthedocs.io/en/latest/fabric_model.html Hyperledger Fabric Model/ ...

  2. MobX快速入门教程(重要概念讲解)

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/7372119.html 一:Mobx工作流程图 二:MobX涉及到的概念 1:状态state 组件中的数据. 2 ...

  3. 动手学CV-目标检测入门教程:基本概念

    3.1 目标检测基本概念 本文来自开源组织 DataWhale

  4. MySQL入门教程:基本概念

    1.数据库基本概念 1.1 数据 所谓数据(Data)是指对客观事物进行描述并可以鉴别的符号,这些符号是可识别的.抽象的.它不仅仅指狭义上的数字,而是有多种表现形式:字母.文字.文本.图形.音频.视频 ...

  5. VPN入门教程:基本概念、使用方法及思科模拟器实践

    数据来源 本文仅用于信息安全的学习,请遵守相关法律法规,严禁用于非法途径.若观众因此作出任何危害网络安全的行为,后果自负,与本人无关. 1.引入 VPN可以实现在不安全的网络上,安全的传输数据,类似专 ...

  6. Linux Capabilities 入门教程--概念篇

    该系列文章总共分为三篇: Linux Capabilities 入门教程:概念篇 Linux Capabilities 入门教程:基础实战篇 Linux Capabilities 入门教程:进阶实战篇 ...

  7. Kafka入门教程与详解

    1 Kafka入门教程 1.1 消息队列(Message Queue) Message Queue消息传送系统提供传送服务.消息传送依赖于大量支持组件,这些组件负责处理连接服务.消息的路由和传送.持久 ...

  8. mysql query browswer_MySQL数据库新特性之存储过程入门教程

    MySQL数据库新特性之存储过程入门教程 在MySQL 5中,终于引入了存储过程这一新特性,这将大大增强MYSQL的数据库处理能力.在本文中将指导读者快速掌握MySQL 5的存储过程的基本知识,带领用 ...

  9. BIML 101 - ETL数据清洗 系列 - BIML 快速入门教程 - 序

    BIML 101 - BIML 快速入门教程 做大数据的项目,最花时间的就是数据清洗. 没有一个相对可靠的数据,数据分析就是无木之舟,无水之源. 如果你已经进了ETL这个坑,而且预算有限,并且有大量的 ...

最新文章

  1. JavaScript初学者编程题(5)
  2. 大数据是怎么知道你去过新发地的?
  3. Nginx-08:Nginx配置高可用
  4. Excel日期函数一览表
  5. 运算符--位移运算符和一些其他运算符
  6. Advanced+Apple+Debugging(2)
  7. python histogram函数_python (ploit2)(histogram)
  8. 使用proxychains 代理终端
  9. Django之Django debug toolbar调试工具
  10. Win10打开或关闭任务栏系统图标
  11. InstallShield教程-打包.NET程序
  12. NOI题库1.1-1.10答案
  13. 中国石油大学《大学语文》在线考试
  14. htmL中怎么使图片轮播,网页设计中怎么让图片轮播
  15. python输入个人所得税计算_python-计算个人所得税
  16. java 项目中遇到的问题 和解决方案_Java开发遇到的问题及解决方案
  17. 热门招聘丨 XTransfer史上最全产品技术岗位公开招聘
  18. 04 - Linux的用户与组文件
  19. 超详细的RS232/RS485电路设计
  20. 数值数据在计算机中的表示方法

热门文章

  1. QQ搜集用户数据是空穴来风吗?(二)
  2. 关于数据恢复软件怎么使用的
  3. 繁简转换OpenCC,autogb 和 autob5,iconv,python的jianfan包
  4. u盘变成raw格式并且不能格式化的解决方法
  5. ImmersionBar
  6. 数码照片冲印的象素与分辨率
  7. 金昌EX9000文件批量转换
  8. S60手机开发平台构建-塞班9.2+Carbide.c++
  9. [ICLR 2018] mixup: Beyond Empirical Risk Minimization
  10. 写代码写了好几年,才发现自己天天都在用设计模式!