一、LSUV 简单的初始化技术
1.1 fan_out的等价用法
w1的初始化,等价于下面一行用kaiming_uniform的初始化
1.2 torch自带初始化 方差越来越小
1.3 不同初始化对网络训练的影响
用torch默认参数初始化,训练2个epoch,得到的acc,valid比较高。
nfs = [8,16,32,64,64]
learn,run = get_learn_run(nfs, data, 0.6, ConvLayer, cbs=cbfs)
run.fit(2, learn)
train: [1.73625, tensor(0.3975, device='cuda:0')]
valid: [1.68747265625, tensor(0.5652, device='cuda:0')]
train: [0.356792578125, tensor(0.8880, device='cuda:0')]
valid: [0.13243565673828125, tensor(0.9588, device='cuda:0')]
看起来训练是正常的。但是我们加入Hooks,看一下直方图的样子
- 四个卷积的激活元的值的分布直方图如下所示。
- 统计激活元为0的比例,发现第一层40%的激活元为0,第2~4层,90%的激活元都为0.
- 虽然acc很高,但是网络大部分激活元都没有利用起来!
进过LSUV初始化之后
for m in mods: print(lsuv_module(m, xb))
run.fit(2, learn)
网络的非零元少了很多!
前面我看到如果前面的几个
batch
我们没有很好的初始化
,我们最终有90%的激活元
都为0,即激活元处于非活动状态
。这就是我们想要
LSUV
的原因。
二、imagenette数据集
- 您的领域中擅长使用深度学习的很大一部分是知道如何创建类似小而实用的有用数据集
Jeremy使用这两个数据集比Jeremy做过的任何其他事情更深入地了解计算机 视觉模型训练
三、datablock API
- get_image_files:获取所有的文件路径。fnames,就是file of names。所有的绝对路径
- ImageDataBunch
- 调用ImageDataBunch的构造函数和from_name_re
- from_name_func
- src=ImageList.split_by_rand_pct()————(ImageList(ItemList)
- 重新构建了一个ItemList的trainset和validset
- 马上调用ItemList的
下面是函数关系调用图:
Pets数据集在分割验证集和训练集时,是随机比例分配的。所以接口有一点点不一样。
使用fastai库来读取Pets数据集的函数关系调用图:
四、新的CNN模型
五、Optimizer重构
待续……
08_data_block.ipynb
google colab运行fastai course-v3笔记本_hello world-CSDN博客