读取数据
利用正则表达式
利用正则表达式从路径中提取文件名,文件名就作为label
get_transforms()的作用是 data augmentation,例如rotation, zoom, translation等其他方法,防止过拟合1
2
3
4
5
6
7
8
9
10
11
12# 举一个正则表达式的例子
pat = r'\\([a-z]+).\d+.jpg$'
pat = re.compile(pat)
img_path ='\\data\\dog.12247.jpg'
print(pat.search(img_path).group(1))
# output: 'dog'
# 实际使用时
path_img = 'C:\\Users\\hp\\.fastai\\data\\images'
fnames = get_image_files(path_img)
data = ImageDataBunch.from_name_re(path_img, fnames, pat, ds_tfms=get_transforms(), size=224,bs=bs)
data.normalize(imagenet_stats)
从文件夹中读取文件
要求文件夹的层次为path下有三个文件夹,分别命名为train,valid,test,且 train 和 valid 内文件夹有每个类别的文件夹,里面存着该类别的图片。
- path
- train
- class1
- class2
- valid
- class1
- class2
- test
- train
1 | data = ImageDataBunch.from_folder(path, train, valid, ds_tfms=get_transforms(), size, bs) |
从csv文件读取
ImageDataBunch.from_csv(path, ds_tfms=tfms, size=24)
从df读取
data = ImageDataBunch.from_df(path, df, ds_tfms=tfms, size=24)
可视化读取的文件
将读取的图片展示出来data.show_batch(rows=3, figsize=(12,12))
利用预训练好的模型训练自己的任务
1 | learn = create_cnn(data, models.resnet34, metrics=error_rate) |
保存模型
learn.save(path) # path可以直接填想要命名的文件名,模型将被保存到训练数据的model文件夹内
理解模型
可视化模型在哪里犯的错最多,将哪些类别混淆的次数最多以改进模型1
2
3
4interp = ClassificationInterpretation.from_learner(learn)
interp.most_confused(min_val=2)
interp.plot_top_losses(9, figsize=(12,12))
interp.plot_confusion_matrix(figsize=(12,12), dpi=60)
改进模型
找到最大但不发散的学习率,解冻预训练模型,在自己的任务上继续训练,准确率往往会更进一步。1
2
3
4learn.lr_find()
learn.recorder.plot()
learn.unfreeze()
learn.fit_one_cycle(2, max_lr=slice(1e-6,1e-4))