PyTorch深度学习项目教程课件:提升猫狗图像分类的准确率_第1页
PyTorch深度学习项目教程课件:提升猫狗图像分类的准确率_第2页
PyTorch深度学习项目教程课件:提升猫狗图像分类的准确率_第3页
PyTorch深度学习项目教程课件:提升猫狗图像分类的准确率_第4页
PyTorch深度学习项目教程课件:提升猫狗图像分类的准确率_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PyTorch深度学习项目教程

提升猫狗图像分类的准确率CONVOLUTIONALNEURALNETWORK要点:监督学习、分类任务、多层感知机、数据增强

项目背景ProjectBackground问题:项目3完成猫狗图像分类项目框架的搭建,但是其分类的准确率仅有69%,一般在实际应用场景中,准确率需要达到95%以上。解决:为了提高图像分类的准确率,一种名为卷积神经网络(ConvolutionalNeuralNetwork,CNN)的网络结构被提出来,通过在网络中使用卷积层(ConvolutionalLayer)、池化层(PoolingLayer)和全连接层(FullyConnectedLayer)来自动学习图像中的空间层次特征。由于其准确性和易用性,迅速成为深度学习中应用广泛的架构之一。知识目标KnowledgeObjectives深入理解卷积神经网络(CNN)的基本概念、结构和原理学习卷积层、池化层和全连接层的功能,以及它们在图像特征提取中的作用学习不同经典卷积神经网络架构,如AlexNet、VGGNet、ResNet、MobileNet等,并理解它们的优缺点及适用场景掌握卷积层尺寸(如滤波器大小、步长、填充等)的计算方法及其对模型性能的影响能力目标AbilityGoals能够具体分析卷积网络各层之间的关系,并理解整个网络的训练和推理过程熟练运用Dropout、MaxPool2d、BatchNormalization等模型优化技术以提高网络性能和防止过拟合掌握使用PyTorch等深度学习框架构建和训练卷积神经网络,并应用于图像分类具备调整网络结构和超参数来优化模型性能的能力素养目标ProfessionalAttainments培养在模型性能不佳时,能够发现并分析问题原因的批判性思维能力培养根据项目需求和数据特点,能够自主选择合适的网络架构和技术的创新能力培养通过实践案例,能够将理论知识应用到解决实际问题中的能力培养在团队中有效沟通和协作,以及对深度学习领域的持续学习和探索精神目录任务1多层感知机问题分析任务2卷积神经网络的引入任务3卷积网络结构编程实现任务4网络训练及结果评估任务5认识更多网络结构01任务1多层感知机问题分析1多层感知机问题分析问题:1.网络不够深对于一张图片而言,以分辨率为640×640的彩色图像为例,其本身的特征维度高达1,228,800个,由于计算机内存的显示,我们只能压缩特征维度,在此基础上,采用了5层网络结构,总参数已经超过400万个,但是网络的学习能力一般;2.网络结构单一我们仅仅是将图像展开为一维数组,然后通过线性矩阵相乘,难以表达图像中更多的空间关系。改进方向:增加层数、增加神经元个数新的问题:梯度爆炸、梯度消失新的操作直接带来参数爆炸问题,深度学习参数的传播为矩阵运算,维度的增加使得一个神经网络层次就高达上万亿参数,还需要对这些参数进行网络层间的正向传播和方向传播求导,以当前的计算能力来讲,无法实现MLP网络向更多参数和更深层次扩展需要新的网络结构02任务2卷积神经网络的引入2.1卷积

在数字图像处理中,可以通过图像滤波操作来完成对图片主要信息的保留以及噪声的剔除

卷积:2.1卷积defconvolve(image,kernel):

#获取图像和卷积核的尺寸

image_h,image_w=image.shape

kernel_h,kernel_w=kernel.shape

#创建一个空白矩阵,用于存储卷积后的结果

output=np.zeros((image_h-kernel_h+1,image_w-kernel_w+1))

#对于每一个滑动窗口位置,计算其与卷积核的内积并将结果存储于相应的位置

forhinrange(0,image_h-kernel_h+1):

forwinrange(0,image_w-kernel_w+1):

output[h,w]=(image[h:h+kernel_h,w:w+kernel_w]*kernel).sum()

returnoutputf=cv2.imread('../data/dogs-vs-cats/val/cat/cat.11250.jpg')

cv2.imshow('img_f',f)

h=np.array([

[0.1,0.1,0.1],

[0.1,0.2,0.1],

[0.1,0.1,0.1]

])

g=convolve(f[:,:,0],h).astype(np.uint8)

cv2.imshow('img_g',g)

cv2.waitKey()

2.2步长Stride设步长为4后,8×8的矩阵经过卷积操作后,减少为2×2的大小,图像信息被压缩了16倍2.2步长Stridedefconvolve_with_stride(image,kernel,stride):

#获取图像和卷积核的尺寸

image_h,image_w=image.shape

kernel_h,kernel_w=kernel.shape

#创建一个空白矩阵,用于存储卷积后的结果,考虑图像步长大小

output=np.zeros((int((image_h-kernel_h+stride)/stride),int((image_w-kernel_w+stride)/stride)))

#滑动窗口增加了步长

forhinrange(0,image_h-kernel_h+1,stride):

forwinrange(0,image_w-kernel_w+1,stride):

output[int(h/stride),int(w/stride)]=(image[h:h+kernel_h,w:w+kernel_w]*kernel).sum()

returnoutputf=cv2.imread('../data/dogs-vs-cats/val/cat/cat.11250.jpg')

cv2.imshow('img_f',f)

h=numpy.array([

[0.1,0.1,0.1],

[0.1,0.2,0.1],

[0.1,0.1,0.1]

])

g0=convolve_with_stride_padding(f[:,:,0],h,4,1).astype(np.uint8)

g1=convolve_with_stride_padding(f[:,:,1],h,4,1).astype(np.uint8)

g2=convolve_with_stride_padding(f[:,:,2],h,4,1).astype(np.uint8)

g=cv2.merge([g0,g1,g2])

print(f.shape)

print(g.shape)

cv2.imshow('img_g',g)

cv2.waitKey()通过卷积操作,图像尺寸从(289,500,3)降低到了(72,125,3),同时保留了图像的显著特征。因此,卷积成了我们进行图像参数压缩的一个工具,经过卷积操作后形成的图,我们称为特征图(FeatureMap)2.3填充Padding卷积计算时,引入步长后,会存在边缘无法参与到卷积运算的情况,导致了信息损失。因此我们需要对输入图像在边界进行填充操作,让更多的元素参与运算,这一过程被称为Padding2.3填充Padding卷积计算时,引入步长后,会存在边缘无法参与到卷积运算的情况,导致了信息损失。因此我们需要对输入图像在边界进行填充操作,让更多的元素参与运算,这一过程被称为Paddingdefconvolve_with_stride_padding(image,kernel,stride,padding):

#填充

image=cv2.copyMakeBorder(image,padding,padding,padding,padding,0)

#获取图像和卷积核的尺寸

image_h,image_w=image.shape

kernel_h,kernel_w=kernel.shape

#创建一个空白矩阵,用于存储卷积后的结果,考虑图像步长大小

output=np.zeros((int((image_h-kernel_h+stride)/stride),int((image_w-kernel_w+stride)/stride)))

#滑动窗口增加了步长

forhinrange(0,image_h-kernel_h+1,stride):

forwinrange(0,image_w-kernel_w+1,stride):

output[int(h/stride),int(w/stride)]=(image[h:h+kernel_h,w:w+kernel_w]*kernel).sum()

returnoutput2.4卷积神经网络卷积神经网络:指定每层特征图的数量,例如我们对于每个图像通道,创建10个卷积核,每个卷积核都来学习图像的特征参数计算:

假设卷积核大小为3x3,每层卷积核数量为10,则每层参数数量:卷积核x输入图像通道数x每层卷积核数+偏置=(3×3)×3×10+1=271个参数量大大减少,自卷积神经网络诞生以来,网络的层次得到了大幅加深,伴随一些减缓链式乘法造成的梯度消失或者梯度爆炸机制,网络层次达到了100多层03任务3卷积网络结构编程实现3.1LeNet网络结构classLeNet(nn.Module):

def__init__(self,classes=2):

#使用super调用父类中的init函数对LeNet进行初始化,初始化后LeNet类的8个nn.Module属性都是空的

super(LeNet,self).__init__()

#构建网络子模块,存储到LeNet的module属性中

#这种conv1的卷积层和fc1的全连接层也是一个Module的子类,其中已经预定好了相关的Module属性

#这种子模块的module属性一般为空,即其中不再包含更小的子模块,而parameters中则存储了相关的权值等属性

#nn.Conv2d(3,6,5)只是实现了一个卷积层的实例化,而赋值给self.conv1才实现了该卷积层到LeNet的module属性中的添加

#这里进行赋值时其实会被setattr函数拦截,对赋值的数据类型进行判断,如果是module类或者其子类,则赋值给LeNet的module中

#module这个属性其实是一个字典,赋值操作就是想该字典中添加键值对,键就是conv1,值就是nn.Conv2d(3,6,5)这个卷积层实例

#赋值时候如果判断数据类型为Parameter类,则会存储到LeNet中的Parameter字典(即Parameter属性)中

self.conv1=nn.Conv2d(3,6,5)

self.conv2=nn.Conv2d(6,16,5)

self.fc1=nn.Linear(16*13*13,120)

self.fc2=nn.Linear(120,84)

self.fc3=nn.Linear(84,classes)

#按照每层网络结构写处forward函数,即如何进行前向传播

defforward(self,x):

out=F.relu(self.conv1(x))

out=F.max_pool2d(out,2)

out=F.relu(self.conv2(out))

out=F.max_pool2d(out,2)

out=out.view(out.size(0),-1)

out=F.relu(self.fc1(out))

out=F.relu(self.fc2(out))

out=self.fc3(out)

returnoutLeNet由YannLecun提出,是一种经典的卷积神经网络,是现代卷积神经网络的起源之一。Yann将该网络用于邮局的邮政的邮政编码识别,有着良好的学习和识别能力。LeNet又称LeNet-5,具有一个输入层,两个卷积层,两个池化层,3个全连接层(其中最后一个全连接层为输出层)网络由项目3的400多万参数降低到了30多万参数3.2nn.Conv2ddef__init__(

self,

in_channels:int,

out_channels:int,

kernel_size:_size_2_t,

stride:_size_2_t=1,

padding:Union[str,_size_2_t]=0,

dilation:_size_2_t=1,

groups:int=1,

bias:bool=True,

padding_mode:str='zeros',

device=None,

dtype=None

)->None:

3.2nn.

max_pool2d文件头importtorch.nn.functionalasF本质上torch.**也是调用了torch.nn.functional模块nn.max_pool2d和F.max_pool2d两种写法均可max_pool2d的作用是对特征图进行最大值过滤,由此进一步缩小特征图的大小而无需引入额外的参数max_pool2d(out,2)最大池化示意图04任务4网络训练及结果评估4网络训练及评估30个Epoch,训练结束后在训练集的准确率为在90.78%,在验证集的准确率最佳准确率为82.12%项目3的训练代码中,仅需替换网络结构:net=LeNet(classes=2)05任务5认识更多网络结构5.1AlexNet网络模型2012年,AlexKrizhevsky、IlyaSutskever在多伦多大学GeoffHinton的实验室设计出了一个深层的卷积神经网络AlexNet,夺得了2012年ImageNetLSVRC的冠军,且准确率远超第二名(top5错误率为15.3%,第二名为26.2%),引起了很大的轰动。AlexNet可以说是具有历史意义的一个网络结构,在此之前,深度学习已经沉寂了很长时间,自2012年AlexNet诞生之后,后面的ImageNet冠军都是用卷积神经网络(CNN)来做的,并且层次越来越深,使得CNN成为图像识别分类的核心算法模型,带来了深度学习的大爆发5.1AlexNet网络模型AlexNet之所以能够成功,跟这个模型设计的特点有关,主要有:1)使用了非线性激活函数:ReLU,本项目改进的LeNet也借鉴了这个激活函数。2)数据增强:随机对数据进行旋转、水平翻转、平移及对比度变化等操作,在本项目的预处理部分,也采用数据增强机制;3)归一化层:即对每层运算后的结果,重新归一化到一定区间,缩小数据取值范围;4)Dropout引入:引入

Dropout主要是为了防止过拟合。在神经网络中Dropout通过修改神经网络本身结构来实现,对于某一层的神经元,通过定义的概率将神经元置为0,这个神经元就不参与前向和后向传播,就如同在网络中被删除了一样,同时保持输入层与输出层神经元的个数不变,然后按照神经网络的学习方法进行参数更新。在下一次迭代中,又重新随机删除一些神经元(置为0),直至训练结束,如图所示,相当于每次训练参数仅更新部分参数。Dropout机制示意图(每次训练更新部分参数)5.1AlexNet网络模型通过30次的训练,猫狗分类项目在验证集得到了92.08%的最高准确率,相对于多层感知机MLP不到70%的准确率有了巨大提升AlexNet的参数数量为6000万个5.2VGGNet网络模型VGGNet是由牛津大学视觉几何小组(VisualGeometryGroup,VGG)提出的一种深层卷积网络结构,他们以7.32%的错误率赢得了2014年ILSVRC分类任务的亚军(冠军由GoogLeNe6.65%的错误率夺得)和25.32%的错误率夺得定位任务(Localization)的第一名(GoogLeNet错误率为26.44%),网络名称VGGNet取自该小组名缩写。VGGNet是首批把图像分类的错误率降低到10%以内模型,同时该网络所采用的卷积核的思想是后来许多模型的基础该模型发表在2015年国际学习表征会议(InternationalConferenceOnLearningRepresentations,ICLR)后,至今被引用的次数已经超过1万4千余次。5.2VGGNet网络模型VGG遵循了LeNet和AlexNet奠定的CNN经典逐层串行堆叠的结构,并达到了传统结构深度和性能的极致。其最大贡献是证明了卷积神经网络中小卷积核的使用和深度的增加对网络的最终分类识别效果有很大的作用。1.使用3×3小卷积核选择3×3大小卷积是因为它是最小的能够表示上下左右中心的卷积核,作者认为两个3×3的卷积堆叠获得的感受野大小,相当一个5×5的卷积;而3个3×3卷积的堆叠获取到的感受野相当于一个7×7的卷积。这样可以使模型深度变深,增加非线性映射,学习和表示能力变强,也能很好地减少参数(例如7×7的参数为49个,而3个3×3的参数为27)。使用3×3卷积时,其padding为1,stride为1,这样就可以使卷积前后的featuremap的尺度保持不变,只有通过maxpooling层时featuremap尺度缩小一半(2×2,stride为2)。2.网络层数越深效果越好牛津大学视觉组将模型B中每个block中的两个3×3卷积替换成了一个5×5卷积进行对照试验,结果是使用5×5卷积的模型top-1error比模型B高了7%,因为这两种卷积感受野是一样的,证明小而深的网络性能是要超过大而浅的网络。

综上所述,VGGNet使用了3个3×3卷积核来代替7×7卷积核,使用了2个3×3卷积核来代替5×5卷积核,在保证了具有相同感知野的条件下,提升了网络的深度,一定程度上提升了神经网络的效果。VGGNet有多个版本,常用的是VGG16表示有16层的卷积,除此之外,还有VGG11、VGG13和VGG19等模型不同层级的VGG网络结构5.2VGGNet网络模型VGG模型参数超过1.3亿个,仅仅30个Ephoch训练,很难收敛,准确率为:85.64%5.2VGGNet网络模型defvgg_trans_learning(classes=2):

model=torchvision.models.vgg16(pretrained=True)

#冻结特征提取,修改全连接层,并尝试冻结一些层次

num_fc=model.classifier[6].in_features#获取最后一层的输入维度

model.classifier[6]=torch.nn.Linear(num_fc,classes)#修改最后一层的输出维度,即分类数

#对于模型的每个权重,使其不进行反向传播,即固定参数

forparaminmodel.parameters():

param.requires_grad=False

#将分类器的最后层输出维度换成了num_cls,这一层需要重新学习

forparaminmodel.classifier[6].parameters():

param.requires_grad=True

returnmodel对于网络收敛慢的问题,我们可以采用一种称为迁移学习的方法,及利用其他人训练好的模型,在我们的任务上进行训练。考虑到大部分数据或任务都是存在相关性的,所以通过迁移学习我们可以将已经学到的模型参数(也可理解为模型学到的知识)通过某种方式来分享给新模型,从而加快并优化模型的学习效率,而不用让网络从零开始训练。[INFO]Training:Epoch[001/030]Iteration[170/176]Loss:0.0435Acc:97.78%[INFO]Newbestaccinvalid:99.16%这充分说明我们网络具有强大的记忆能力,基于ImageNet海量图片的千锤百炼后,一个充分训练的网络模型可以迅速适应新的任务要求,和我们人类处理问题的能力何其相似,迁移学习能力是深度学习技术得以流行的原因之一5.3ResNet网络模型对于卷积神经网络,我们已经接触了LeNet,AlexNet和VGGNet,以上几个模型的共同结构为:1)卷积层(Convolution):提取图像的底层特征,将原图中符合卷积核特征的特征提取出来(卷积核特征是由网络自己学习出来的);2)池化层/降采样层/下采样层(Pooling/Subsampling):降低Featuremap的维度,防止过拟合;3)全连接层/密集连接层(FullyConnected/DenseLayer):将池化层的结果拉平(flatten)成一个长向量,汇总之前卷积层和池化层得到的底层的信息和特征;4)输出层(Output):全连接+激活(二分类用Sigmoid;多分类用Softmax归一化)。5.3ResNet网络模型

5.3ResNet网络模型

5.3ResNet网络模型

5.3ResNet网络模型ResNet推出后,迅速得到了业内的广泛关注,网络最高层次突破了1000层,使之成为绝大多数深度神经网络任务的骨干网络(BackBone)。BackBone是计算机视觉任务的根基,在通过BackBone生成的特征图FeatureMap的基础上再进行如分类、目标检测和图像分割等任务,BackBone一般也称为特征编码(Encoder),后面接上不同的任务头(Head)执行所需任务5.3ResNet网络

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论