PyTorch卷积神经网络模型初建
Posted 刘小怪tt
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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]))
# 至此完成了深度学习的建模
以上是关于PyTorch卷积神经网络模型初建的主要内容,如果未能解决你的问题,请参考以下文章
[Pytorch系列-40]:卷积神经网络 - 模型的恢复/加载 - 搭建LeNet-5网络与MNIST数据集手写数字识别
[Pytorch系列-41]:卷积神经网络 - 模型参数的恢复/加载 - 搭建LeNet-5网络与MNIST数据集手写数字识别