1、深度学习中最复杂的步骤往往是将数据转换成能够输入模型的形式
2、fastai中,要了解的pytorch类
class Dataset(object):
def __getitem__(self,index):
raise NotImplementedError
def __len__(self):
raise NotImplementedError
在python中__XXX__
这种形式成为duner,都是特殊的魔法方法进行一些特殊的操作,__getitem__
这个方法的意思是有一个对象可以用中括号来索引,len的方法是查看Dataset对象的大小,图像分类的Dataset对象通过getitem方法返回一个图像以及标签
2、为了创建小批次,要用到pyTorch的DataLoader,DataLoader接受一个Dataset对象到构造器,然后从中获取数据 ,列如第三项、第五项..,DataLoader会通过索引随机获取数据,然后根据batch_size创建一个指定的任意大小的批次,所以DataLoader的功能就是抓取单个样本组合成小批次 ,这仍然不足以训练模型,因为还没有办法去验证模型,需要一个独立于训练集的数据集,用验证集来测试模型的效果,为了实现这点,要使用fastai库的DataBunch类,DataBunch把train_dl和valid_dl组合起来,就可以发送给模型学习和拟合了
class torch.utils.data.DataLoader(dataset,batch_size=1,shuffle=False,sampler=None,batch_sampler=None,num_workers=0,collate_fn=<function default_collate>,pin_memory=False,drop_last=False,timeout=0,worker_init_fn=None)
3、
src=(ImageFileList.from_folder(path).label_from_csv('train_v2.csv',sep=' ',folder='train-jpg',suffix='.jpg').random_split_by_pct(0.2))
data=(src.datasets().transform(tfms,size=128).databunch().normalize(imagenet_stats)
from_folder表示从哪个文件夹读入,label_from_csv表示标签从哪里读入,
random_split_by_pct表示创建两个独立的数据集(训练集和验证集),src.datasets把数据集转为Pytorch的Dataset对象,transform对数据集进行矩阵变换,.databatch表示在一个方法里同时创建DataLoader和DataBunch对象
4、只要你理解了data block API,就不会困惑于如何把你的数据集转换成可供建模的数据
5、
tfms=get_transforms(flip_vert=True,max_lighting=0.1,max_zoom=1.05,max_wrap=0.)
,flip_vert=True表示可以随机反转图像,max_wrap表示透视变换,这就是所谓的数据增强。
6、learn=create_cnn(data,arch,metrics=[acc_02,f_score])
metric函数不影响模型的训练,改变metric函数不会改变模型结果 ,唯一使用到metrics函数的地方,就是在训练过程输出它们。
7在kaggle上模型的优劣由f-score度量函数来评价
8、databunch有一个特殊属性c,表示想让模型创建多少输出,对于任何分类器,让每个可能的类别都有一个概率值,也就是说分类器data.c的属性值总是等于data.classes的长度。多类别的则是选出任意个,把每个概率都跟阈值进行比较,只要概率比阈值大,我们就会认为模型确认了这个特征,对于planet-amazon这个特定的数据集,阈值设为0.2,可以通过实验找到一个合适的阈值
9、对于多分类不能用argmax要用另一种精度函数叫做accuracy_thresh用来把每个概率跟阈值进行比较,并返回所有高于阈值的概率
10、partial函数接收一个函数还是有关键字和值作为另外的参数以此创建一个新函数
11、当模型预测错误时,如果是部署在应用中是否有好的方法记录这个错误,利用这次错误有针对性的改进模型
答:让用户告诉你出错了,收集反馈,需要有个日志来记录 ,运行一段程序进行微调(unfreeze之后,再训练一会模型),创建一个新的DataBunch只包含分类错误的实例再训练
12、datablock有执行顺序吗?
答:
data=(ImageFileList.from_folder(path).label_from_folder().split_by_folder().add_test_folder().datasets().transform(tfms,size=224).databunch()
第一步是数据类型,第二步是数据来源,第三步是标注方法,第四步是划分数据集的方式,第五步是Datasets实例的类型,第六步是变形处理(非必需),最后一步是创建一个DataBunch,几乎所有的函数,都只有短短几行代码
13、有什么推荐的资源用来处理视频数据?
答:web应用,fastai的webapi可以处理,客户端可以使用opencv
14、learn.recorder.plot()
找到最大的斜率,而不是找到底部,难找的学习率,在曲线飙升前的部分查找,缩小10倍
15、 为什么不能微调生成大量较小的数据集,比如,6464,128128
答:完全可以这样做,而且效果很好
16、准确率对像素集图像分割有什么意义,它是否是正确分类的像素数 除于总数得到的
答:如果把每个像素想象成用于分类的独立对象,它们的准确率是一样的
17、大部分的示例和模型,都会导致训练损失大于验证损失,解决这个问题的最好方式是什么?试了很多不同的轮次数和学习率之后
答:当训练损失高于验证损失时就是欠拟合,训练损失应该低于验证损失,可以延长训练时间,用较低的学习率进行最后阶段的训练,仍然欠拟合,就要降低正则化的权重
学习率
画出训练损失和验证损失(蓝色的是训练损失、黄色的是验证损失)损失曲线先上升再下降,为什么会这样呢?可以画出学习率,可以看到学习率先上升后下降,为什么会这样,因为调用了fit_one_cycle
19、 图1图2
一般不会出现像图一这样的损失函数曲面,实际的图形就像图二是弯弯曲曲的,所以应该选择一个学习率大到足以越过不平整的区域,当快接近最优解时,最好是降低学习率,这就叫学习率退火
网友评论