PyTorch卷积神经网络模型初建

最近自己配置深度学习的各种框架,硬盘空间都快装满了,windows的环境配置着实是太麻烦了
在这里插入图片描述

卷积神经网络可以算是深度神经网络中很流行的网络了。本文从基础入手,介绍了卷积网络的基本原理以及相关的其它技术,并利用卷积网络做了一个简单项目作为示例参考。想入手 CNN 的朋友不可错过~

在这里插入图片描述
卷积神经网络之所以优于其它深度神经网络是由于它特殊的操作。相比一次只计算图像中的单个像素,CNN 将多个像素的信息组合在一起,因此能够理解时间模式。
另外,CNN 可以「看到」一组像素组合成一条直线或者曲线。由于深度神经网络通常都是多层卷积的堆叠,通过上一层得到了直线或者曲线后,下一层不再组合像素,而是将线组合成形状,一层一层进行下去,直到形成完整的图片。

在这里插入图片描述

深度学习建模过程:

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

(2)数据读取、清洗

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

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

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

(6)调整参数重新学习直到达到比较不错的标准
在这里插入图片描述
使用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]))
 
# 至此完成了深度学习的建模!

在这里插入图片描述

嘿嘿嘿

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章