马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
一、引言
在深度学习蓬勃发展的今天,卷积神经网络(Convolutional Neural Network,CNN)凭借其在图像识别、目的检测、语义分割等盘算机视觉任务中的杰出体现,成为了该领域的核心技能。PyTorch 作为一款广泛应用的深度学习框架,为开辟者提供了便捷且高效的工具来构建、训练和摆设 CNN 模型。本文将深入探究 PyTorch 框架下卷积神经网络的相关知识,从卷积的根本概念出发,逐步介绍卷积神经网络的原理、构建方法以及模型的保存与调用,纪录 PyTorch 在 CV 开辟中的应用。
二、卷积的根本概念与术语
2.1 什么是卷积
卷积是一种数学运算,在信号处理、图像处理等领域有着广泛的应用。在深度学习中,卷积操纵是卷积神经网络的核心组成部分。简单来说,卷积可以明白为 “输入 + 脉冲 = 输出”,其运算过程包括翻转、移位、相乘和相加 。以一维离散卷积为例,假设有输入序列 [2, 3, 0, 5, 6, 7, 1, 8, 2, 9, 0] 和卷积核 [1, 1, 1],盘算过程如下:
通过这样的盘算,卷积操纵可以提取输入数据中的特性。在图像处理中,卷积核可以看作是一个滤波器,它在图像上滑动,对每个位置的像素进行卷积运算,从而得到处理后的图像。
2.2 根本图像卷积
对于图像卷积,假设有一个简单的输入图像和卷积核。输入图像部分像素值如下:
卷积核为:
盘算过程为:
这就是图像卷积的根本盘算方式,通过卷积核与图像像素的对应相乘和求和,得到输出图像的像素值。
2.3 卷积操纵相关术语
- 卷积核 / 操纵数 /filter:卷积核是卷积操纵中的关键元素,它决定了卷积操尴尬刁难输入数据的处理方式。不同的卷积核可以提取不同类型的特性,例如边沿检测、模糊处理等。
- 卷积的锚定位置:默认环境下,卷积的锚定位置在卷积核的中心位置。但在实际应用中,锚定位置可以根据需求进行调解,不同的锚定位置会影响卷积操纵的结果。
- 卷积的边沿添补方式:常见的边沿添补方式有 valid 和 same。valid 体现不进行边沿添补,卷积操纵只在输入数据的有效地区进行,这样会导致输出数据的尺寸变小;same 体现进行边沿添补,使得输出数据的尺寸与输入数据相同。
2.4 边沿处理
在卷积操纵中,边沿处理是一个重要的环节。不同的边沿添补方式会对卷积结果产生不同的影响。常见的边沿添补方式包括:
- BORDER_CONSTANT:用指定的常数添补边沿,如 Python 中cv.BORDER_CONSTANT,添补结果为iiiiiii|abcdefgh|iiiiiii。
- BORDER_REPLICATE:复制边沿像素进行添补,如cv.BORDER_REPLICATE,添补结果为aaaaaa|abcdefgh|hhhhhhh。
- BORDER_REFLECT:以边沿为对称轴进行反射添补,如cv.BORDER_REFLECT,添补结果为fedcba|abcdefgh|hgfedcb。
- BORDER_WRAP:以循环的方式进行添补,如cv.BORDER_WRAP,添补结果为cdefgh|abcdefgh|abcdefg。
- BORDER_REFLECT_101:类似BORDER_REFLECT,但在边界像素的处理上略有不同,如cv.BORDER_REFLECT_101,添补结果为gfedcb|abcdefgh|gfedcba。
- BORDER_TRANSPARENT:体现边沿不进行添补,保持透明,如cv.BORDER_TRANSPARENT,添补结果为uvwxyz|abcdefgh|ijklmno。
三、卷积神经网络根本原理与参数
3.1 卷积神经网络根本原理
卷积神经网络由多个卷积层、池化层和全毗连层组成。其根本原理是通过卷积层中的卷积核在输入数据上滑动,进行卷积操纵,提取数据的特性。这些特性颠末池化层的降采样处理,减少数据的维度,同时保存重要的特性信息。最后,全毗连层对提取的特性进行分类或回归等操纵,得到终极的输出结果。
卷积神经网络具有共享权重、像素迁徙和空间信息提取等利益。共享权重机制使得网络在训练过程中可以减少参数的数目,降低盘算量,同时提高模型的泛化本领。通过卷积操纵,网络可以自动学习到图像中的空间特性,如边沿、纹理等,从而对图像进行有效的分类和识别。
3.2 卷积层操纵
- 步长(strides):步长决定了卷积核在输入数据上滑动的步幅。当步长为 1 时,卷积核每次移动一个像素;当步长为 2 时,卷积核每次移动两个像素。步长的巨细会影响输出数据的尺寸,步长越大,输出数据的尺寸越小。
- 添补(padding):添补用于控制卷积操纵后输出数据的尺寸。当添补为 VALID 时,不进行边沿添补,输出数据的尺寸会根据输入数据和卷积核的巨细进行相应的盘算;当添补为 SAME 时,进行边沿添补,使得输出数据的尺寸与输入数据相同。例如,对于一个 3x3 的卷积核,当添补为 SAME 时,会在输入数据的边沿添补一圈像素,以保证输出数据的尺寸稳定。
- 卷积核巨细(filter size):卷积核的巨细通常为奇数,如 3x3、5x5 等。较大的卷积核可以提取更全局的特性,但盘算量也会相应增长;较小的卷积核可以提取更局部的特性,盘算量相对较小。在实际应用中,需要根据任务的需求和数据的特点选择符合的卷积核巨细,1×1卷积是通道起落的利器。
3.3 卷积层输出巨细盘算
对于一个 WxW 的特性图(feature map),假设卷积核的巨细为 FxF,卷积时添补边沿 P 个像素,卷积步长为 S,则输出的巨细盘算公式为:
输出巨细
当 P = 0 时,公式简化为:
输出巨细
这个公式对于计划卷积神经网络的结构非常重要,通过合理设置参数,可以控制网络中各层输出数据的尺寸,从而达到优化模型性能的目的。
3.4 池化层详解
池化层重要有均值池化和最大值池化两种方式。均值池化是盘算池化窗口内像素的匀称值,作为输出;最大值池化是取池化窗口内像素的最大值,作为输出。例如,对于一个 2x2 的池化窗口,在输入特性图上进行池化操纵:
- 均值池化:盘算窗口内像素的匀称值,得到输出特性图。
- 最大值池化:取窗口内像素的最大值,得到输出特性图。
最大值池化可以或许保存图像中的明显特性,对于图像的平移、旋转等变换具有一定的稳定性,但可能会丢失一些细节信息;均值池化则可以对图像进行平滑处理,减少噪声的影响,但可能会使图像的特性变得模糊。
四、构建 CNN 手写数字识别网络
4.1 CNN 手写数字识别网络结构
要构建的 CNN 手写数字识别网络结构包括卷积层、池化层、全毗连层和输出层。具体结构如下:
- 首先通过Conv2d层进行卷积操纵,例如第一个Conv2d层的权重为 (8x1x3x3),偏置为 (8),通过卷积操纵提取图像的特性。
- 接着利用MaxPool2d层进行池化操纵,降低特性图的维度。
- 然后颠末ReLU激活函数,增长网络的非线性。
- 再通过多个Conv2d、MaxPool2d、ReLU和Linear层的组合,进一步提取特性并进行分类。
- 最后通过LogSoftmax层得到终极的输出结果,用于识别手写数字。
4.2 Pytorch 函数支持
- torch.nn.Module:这是 PyTorch 中构建神经网络模型的基类。通过继续torch.nn.Module,可以方便地定义本身的神经网络模型,并实现前向传播等方法。
- torch.nn.Conv2d:用于创建二维卷积层。在构建 CNN 手写数字识别网络时,通过torch.nn.Conv2d定义卷积层,设置卷积核的巨细、步长、添补等参数,实现对输入数据的卷积操纵。
- torch.nn.MaxPool2d:用于创建最大池化层。在网络中,利用torch.nn.MaxPool2d对卷积层输出的特性图进行池化操纵,降低特性图的维度,减少盘算量。
五、模型保存与调用
5.1 模型保存方式
- 保存整个模型:利用torch.save(model, PATH)可以将整个模型保存到指定路径。这种方式保存的模型包含了模型的结构和参数,加载时可以直接恢复整个模型。
- 保存模型参数(state_dict):利用torch.save(model.state_dict(), PATH)只保存模型的参数。state_dict是一个 Python 格式的字典数据,只保存各层的参数相关信息,可以通过model和optimizer获取。加载时,需要先创建模型实例,然后利用model.load_state_dict(torch.load(PATH))加载参数,并通过model.eval()将模型设置为评估模式。
- 保存查抄点:除了保存模型参数,还可以保存训练过程中的其他信息,如当前的 epoch、优化器的状态、损失值等。利用以下代码保存查抄点:
- torch.save({
- 'epoch': epoch,
- 'model_state_dict': model.state_dict(),
- 'optimizer_state_dict': optimizer.state_dict(),
- 'loss': loss,
- }, PATH)
复制代码 恢复查抄点时,需要先创建模型和优化器的实例,然后加载查抄点并恢复相关信息:
- model = TheModelClass(*args, **kwargs)
- optimizer = TheOptimizerClass(*args, **kwargs)
- checkpoint = torch.load(PATH)
- model.load_state_dict(checkpoint['model_state_dict'])
- optimizer.load_state_dict(checkpoint['optimizer_state_dict'])
- epoch = checkpoint['epoch']
- loss = checkpoint['loss']
- model.eval()
- model.train() # -or
复制代码 5.2 模型猜测
在模型保存后,可以加载模型进行猜测。首先加载保存的模型,然后将输入数据传入模型,得到猜测结果。例如,在手写数字识别任务中,加载训练好的 CNN 模型,将待识别的手写数字图像进行预处理后传入模型,模型会输出猜测的数字类别。
就比如我之前利用Yolov5用作目的检测可视化,Yolov5 是基于卷积神经网络构建的。从原理上看,卷积神经网络通过卷积层、池化层等组件提取图像特性,Yolov5 也利用卷积操尴尬刁难输入图像进行特性提取 。在其网络架构中,存在多个卷积层,通过不同巨细和参数的卷积核来捕捉图像不同尺度和类型的特性,进而实现目的检测任务,包括目的的定位与分类。结果如图所示:
同时Yoov5也可用作语义分割模型,处理其任务结果也是嘎嘎厉害,实验结果如下:
六、总结
本篇文章介绍了 PyTorch 框架下卷积神经网络的相关知识,从卷积的根本概念、卷积神经网络的原理与参数,到构建 CNN 手写数字识别网络,以及模型的保存与调用。旨在对 PyTorch 在 CV 开辟中的应用有一个较为深入的明白。在实际应用中,需要根据具体的任务需求和数据特点,合理计划卷积神经网络的结构,选择符合的参数,并运用模型保存与调用技能,实现高效的图像识别等盘算机视觉任务。随着深度学习技能的不断发展,卷积神经网络在各个领域的应用将会越来越广泛,最后感谢各人的观看(_ _)。゜。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |