FASTAI笔记-1-安装以及猫狗分类

fastai基于pytorch,如果新手入行可以看看该视频,不光是pytorch教学,也是深度学习教学。

https://morvanzhou.github.io/tutorials/machine-learning/torch/1-1-why/

fastai论坛,有问题可以上去问,上面也有课程详细笔记。

https://forums.fast.ai/

fastai官方文档如下。

https://docs.fast.ai/

为何用fastai,首先因为轻量化数据集读取和数据增强,其次因为快速高效的训练。

进入正题,首先安装fastai,这里建议使用pytorch1.0.0,因为fastai对于1.0.1的版本还没有做全部更新,使用一些api比如create_cnn会卡住。

一、安装

1.进入https://pytorch.org/get-started/previous-versions/,选择相对应python和cuda版本的whl文件进行下载。

2.进入下载路径,然后使用:

pip install xxx.whl

3.安装完成之后,安装torchvision。

pip install torchvision

4.安装fastai

pip install fastai

二、使用

1.深度学习建模过程:

(1)下载或者制作数据集

(2)数据读取、清洗

(3)数据增强、特征工程

(4)建立神经网络/下载效果好的训练好的模型

(5)进行学习根据metrics和loss评价模型准确度

(6)调整参数重新学习直到达到比较不错的标准

2.使用fastai来进行这一切:

# 使用jupyternotebook进行试验

%matplotlib inline
# 若引用的库有更新会自动更新
%reload_ext autoreload
%autoreload 2

# import * 对于编程人员来说会有点难以接受,主要目的是方便实验
from fastai import *
from fastai.vision import *
# 不怕不会,怕不知道怎么学,在进行一切之前,首先要学会如下:
doc(get_transforms())  # 获得该方法的文档,学会使用该方法
# 使用上面的方法结合访问官方文档介绍网站来进行学习,官方文档url文中最开始有提供。

'''
    首先获得数据集
'''
# 1.示例中的数据为PETS,是一个用来进行猫狗品种分类的数据集。
path = untar_data(URLs.PETS)  # 该方法首先下载数据集到目录中,再进行解压,返回解压路径
print(path)  # 打印path,其为下载的目录
print(path.ls())  # 看看解压路径中的文件
paths_img = path/'images'  # 该路径为图像文件路径,也就是真正的建模数据集
images = get_images_files(paths_img)  # 该方法为获取路径中的所有文件
print(images[:5])

# 2.加载路径中的数据集
pat = r'/([^/]+)_\d+.jpg$'  # 用于匹配图片名字的表达式
tfms = get_transforms()  # 这个用来进行数据增强
data = ImageDataBunch.from_name_re(paths_img, images, pat=pat, ds_tfms=tfms, size=224, bs=32)  # 该方法使用数据加载对象ImageDataBunch的from_name_re(使用正则匹配文件名称的方法),进行数据读取。
data.show_batch(rows=3, figsize=(6,8))  # 看看数据的样子
print(data.c)  # 打印数据集中的分类数量
data.normalize(imagenet_stats)  # normalize图像,消除因为激活函数而可能发生的梯度爆炸和梯度消失情况,加快梯度下降,很有用,详细内容请看文章开始提供的pytorch教学链接里面关于BN(batch_normal)的视频

# 3.进行神经网络建模和学习

'''
    神经网络训练,可以概括为如下步骤:
    1.建立神经网络模型,预先训练好的比较好,表达能力更强
    2.查找合适的学习率进行学习
    3.进行学习(该步骤其实为迁移学习:使用pretrained模型加上自己的分类,然后进行学习)
    4.保留当前状态
    5.unfreeze:解冻模型所有权重,准备
    6.查找合适的学习率。
    7.再次进行学习,(进行fine tune:微调,在原有模型上加上自己的最后fully connection layer,然后进行所有权重训练。)
'''

learn = create_cnn(data, models.resnet34, metrics=fastai.metrics.accuracy)  # 该方法建立了一个resnet34网络结构的CNN网络,在训练中打印metrics对应的方法来展示精度,注意:metrics不影响训练精度。
learn.lr_find()  # 查找合适的学习率
learn.recorder.plot()  # 绘制y轴为loss,x轴为学习率的图像
# 学习率应该选择loss向下降程度最大点所对应的学习率
learn.fit_one_cycle(4, slice(lr))  # 进行训练,4为epoch数,slice(lr)是学习率范围
learn.save('stage_1', return_path=True)  # 保存第一阶段迁移学习的参数,return_path=True是打印保存目录
learn.unfreeze()  # 该方法为解冻所有权重
learn.lr_find()
learn.recorder.plot()
learn.fit_one_cycle(5, slice(lr))  # 开始fine tune,该lr为上面一步图像中下降最快的点对应的lr
learn.save('stage_2')  # 保存第二阶段fine tune的参数

# 4.查看分类错的数据都是哪些
interp = ClassificationInterpretation.from_learner(learn) 
losses,idxs = interp.top_losses()  # 查找分类错误的图像的索引
interp.plot_top_losses(9, figsize=(15,11))  # 打印出分类错误的图像

# 5.分类一个试试
img = open_image(images[0])
label, idx, probability = learn.predict(img)
print('预测的分类为{}, 概率为{:.4f}'.format(label, probability[idx]))

# 至此完成了深度学习的建模

 

你可能感兴趣的:(AI)