PyTorch实战:卷积神经网络详解+Python实现卷积神经网络Cifar10彩色图片分类

目录

前言

一、卷积神经网络概述

二、卷积神经网络特点

卷积运算

单通道,二维卷积运算示例

单通道,二维,带偏置的卷积示例

带填充的单通道,二维卷积运算示例

Valid卷积

Same卷积

多通道卷积计算

1.局部感知域

2.参数共享

3.池化层

4.层次化提取

 三、卷积网络组成结构


前言

PyTorch可以说是三大主流框架中最适合初学者学习的了,相较于其他主流框架,PyTorch的简单易用性使其成为初学者们的首选。这样我想要强调的一点是,框架可以类比为编程语言,仅为我们实现项目效果的工具,也就是我们造车使用的轮子,我们重点需要的是理解如何使用Torch去实现功能而不要过度在意轮子是要怎么做出来的,那样会牵扯我们太多学习时间。以后就出一系列专门细解深度学习框架的文章,但是那是较后期我们对深度学习的理论知识和实践操作都比较熟悉才好开始学习,现阶段我们最需要的是学会如何使用这些工具。

深度学习的内容不是那么好掌握的,包含大量的数学理论知识以及大量的计算公式原理需要推理。且如果不进行实际操作很难够理解我们写的代码究极在神经网络计算框架中代表什么作用。不过我会尽可能将知识简化,转换为我们比较熟悉的内容,我将尽力让大家了解并熟悉神经网络框架,保证能够理解通畅以及推演顺利的条件之下,尽量不使用过多的数学公式和专业理论知识。以一篇文章快速了解并实现该算法,以效率最高的方式熟练这些知识。


博主专注数据建模四年,参与过大大小小数十来次数学建模,理解各类模型原理以及每种模型的建模流程和各类题目分析方法。此专栏的目的就是为了让零基础快速使用各类数学模型、机器学习和深度学习以及代码,每一篇文章都包含实战项目以及可运行代码。博主紧跟各类数模比赛,每场数模竞赛博主都会将最新的思路和代码写进此专栏以及详细思路和完全代码。希望有需求的小伙伴不要错过笔者精心打造的专栏:
一文速学-数学建模常用模型icon-default.png?t=N7T8https://blog.csdn.net/master_hunter/category_10967944.html


一、卷积神经网络概述

卷积神经网络(Convolutional Neural Network,简称CNN)是一种特殊的人工神经网络结构,它在图像识别、语音识别、自然语言处理等领域有着广泛的应用。CNN的特点在于其能够自动提取输入数据的特征,从而实现对输入数据的高效分类和识别。根据专栏阅读而到此部分的读者对神经网络基础都有很清晰的了解,普通的神经网络架构的基本功能还是存在很多可以优化的点。而卷积神经网络是一类包含卷积运算且具有深度结构的前馈神经网络,这里我们划重点卷积运算和深度结果,前馈神经网络也就是具有前向传播,没有循环和记忆功能的单向网络。那么只要认识到卷积运算和卷积神经网络的特殊性质就可以很好的区分普通前馈神经网络和卷积神经网络。

二、卷积神经网络特点

 卷积神经网络相对于普通神经网络在于以下四个特点:

  • 局部感知域:CNN的神经元只与输入数据的一小部分区域相连接,这使得CNN对数据的局部结构具有强大的敏感性,可以自动学习到图像的特征。
  • 参数共享:在CNN中,同一个卷积核(filter)在整个输入图像上滑动,共享权重和偏置。这减少了网络的参数量,提高了模型的泛化能力。
  • 池化层:通过池化层,CNN可以降低特征图的分辨率,减少计算量,同时保留主要的特征信息,提高了网络的抗噪能力和泛化能力。
  • 层次化特征提取:通过堆叠多层卷积层和池化层,网络可以逐级提取图像的抽象特征,从低级特征如边缘到高级特征如纹理、形状等。

卷积运算

我们以多个实例来理解卷积运算:

单通道,二维卷积运算示例

红色的方框圈中的数字和卷积核乘积再相加得到输出数据。

单通道,二维,带偏置的卷积示例

带偏置的计算是在上述乘积运算之后加上偏置。

带填充的单通道,二维卷积运算示例

对于以上实例填充边缘为0的向量,是因为在标准的卷积过程中,存在两个问题:

每次卷积运算后,图像就会缩小,在经历多次运算后,图像终会失去其形状,变为 1\times 1 的 “柱状”。

对于图像边缘的像素,其只被一个输出所触碰或者使用,但对于图像中间的像素,则会有多个卷积核与之重叠。所以那些在角落或者边缘区域的像素点在输出中采用较少,意味着卷积过程丢掉了图像边缘位置的许多信息。

对于这个问题,可以采用额外的 “假” 像素(通常值为 0, 因此经常使用的术语 ”零填充“ )填充边缘。这样,在滑动时的卷积核可以允许原始边缘像素位于其中心,同时延伸到边缘之外的假像素。假设填充的像素大小为 p ,则 n 就变成了 n+2p ,故其输出图像的尺寸为 \left \lfloor \frac{n+2p-f}{s} \right \rfloor +1。至于选择填充多少像素,通常有两个选择,分别叫做 Valid 卷积和 Same 卷积。

Valid卷积

Valid 卷积意味着不填充,如之前所述,图像会经历卷积运算后逐渐缩小,输出的图像尺寸即为上述公式:\left \lfloor \frac{n+2p-f}{s} \right \rfloor +1

Same卷积

Same卷积意味填充后,输出图像的尺寸与输入图像的尺寸相同,根据上述公式,令 \left \lfloor \frac{n+2p-f}{s} \right \rfloor +1=n,可得到p=\frac{(n-1)s-n+f}{2}。当 s=1 时,p=\frac{f-1}{2}。一般卷积核 f 的大小会选择一个奇数,如 3 \ 5 \ 7 等。主要因为:

  • 如果 f 是一个偶数,那么只能使用一些不对称填充。只有当 f 是奇数时,Same 卷积才会有自然的填充,即可以选择同样的数量填充四周。
  • 当卷积核 f 是奇数时,其只有一个中心点,在具体的程序实现过程中会便于指出卷积核的位置。

多通道卷积计算

多通道卷积会按通道进行输入数据和滤波器的卷积运算,并将结果相加, 从而得到输出

以上篇文章卷积神经网络对Cifar10图像的分类卷积运算的过程,整体网络计算架构为:

原图像(尺寸为32*32*3)分别和n5*5*3的卷积核(又名滤波器,filiter)进行卷积运算,得到n28*28*1的特征图(feature map),每个特征图分别添加不同的偏置(bias),具体为特征图中的每个元素 +\ b_n,对每个特征图添加激活函数 g(x),进行非线性运算,将这 n 个特征图依次叠加,得到最终的特征图(尺寸为 28\times 28 \times n)。

1.局部感知域

局部感知域指的是网络中的每一个神经元只对输入数据的一个局部区域进行感知,而不是整个输入数据。

 在卷积神经网络中,每个神经元的权重是共享的。这意味着在处理不同的输入位置时,使用的权重是相同的。这种权重共享使得网络对于平移不变性具有很强的适应能力。卷积操作只关注输入数据的局部区域,而非整个输入数据。这样可以减少网络的参数数量,降低计算复杂度。由于权重共享和稀疏连接的特性,卷积神经网络能够高效地处理大规模的输入数据,如高分辨率图像。通过卷积操作,网络可以逐步提取输入数据的局部特征,从低层到高层,逐步抽象和组合特征,形成对于整体特征的理解。

2.参数共享

卷积神经网络(Convolutional Neural Network,CNN)的参数共享是指在网络的不同位置使用相同的参数(权重和偏置)来处理输入数据的不同区域,这是卷积层的一个重要特点。

具体来说,卷积操作在处理输入数据时,会使用一个称为卷积核(filter)的小窗口,通过与输入数据的局部区域进行卷积运算来提取特征。而在整个输入数据上,使用的卷积核是相同的。这意味着网络的不同位置使用的权重是共享的。

这种参数共享有以下几个重要特点:

减少参数数量:由于同一个卷积核在不同位置共享,网络的参数数量大大减少。这降低了模型的复杂度,减少了过拟合的可能性。

增强模型的平移不变性:由于同一特征的卷积核在不同位置使用相同的权重,使得模型对输入数据的平移具有不变性,从而能够更好地处理平移变换后的数据。

提高计算效率:参数共享减少了计算量,因为不同位置使用相同的权重进行计算,避免了重复计算。

# 定义一个简单的卷积神经网络
class SimpleCNN(nn.Module):def __init__(self):super(SimpleCNN, self).__init__()# 定义一个卷积层,使用3个3x3的卷积核self.conv = nn.Conv2d(in_channels=1, out_channels=3, kernel_size=3)def forward(self, x):# 使用卷积操作处理输入数据x = self.conv(x)return x

 self.conv 是一个卷积层,它使用了3个3x3的卷积核进行卷积操作。无论输入数据的哪一个位置,这3个卷积核的参数都是相同的。

3.池化层

对于 28\times 28 \times n 的特征图,其池化过程仅需通过池化核对该特征图进行池化运算即可得到输出。

  在通过卷积获得了特征 (features) 之后,下一步我们希望利用这些特征去做分类。理论上讲,人们可以用所有提取得到的特征去训练分类器,但这样做会面临巨大计算量的挑战。并且容易出现过拟合 (over-fitting)。

池化层通过对特征图进行降维,减少了后续层的计算量,同时保留了重要的特征。卷积后的特征具有一种“静态性”的属性,意味着在一个图像区域有用的特征极有可能在另一个区域同样适用。也就是说一张图片有多只鸟,在一个区域提取的鸟图像的特征在该图像的另一端鸟图像的特征也同样适用。与卷积层类似,池化操作也使用一个移动的窗口,但它的操作是简单的统计汇总(如最大值或平均值)。这些统计到的特征不仅具有低得多的维度 (相比使用所有提取得到的特征),同时还会改善结果(不容易过拟合)。这种聚合的操作就叫做池化 (pooling)

import torch
import torch.nn as nn# 定义一个示例的特征图(假设通道数为3,高度为4,宽度为4)
feature_map = torch.randn(1, 3, 4, 4)  # 1表示batch size# 定义一个最大池化层,窗口大小为2x2,步幅为2
max_pooling_layer = nn.MaxPool2d(kernel_size=2, stride=2)# 应用最大池化层
output = max_pooling_layer(feature_map)# 输出的尺寸会缩小一半(因为窗口大小为2x2,步幅为2)
print(output.shape)

 

这样需要注意的是,池化操作是对每个通道分别进行的,不会改变通道的数量。池化层对于一定程度的平移、旋转、缩放等变化保持不变性,即使特征稍微移动也能被正确检测到,减少了特征图的维度,也减少了模型的参数数量,有助于减轻过拟合的问题。

4.层次化提取

根据以上的图例很容易明白CNN的的计算层次化,CNN 由多个卷积层和池化层组成,每一层都可以提取出不同层次的特征。前层主要提取低级特征(如边缘、纹理等),后层逐渐提取高级抽象的特征(如形状、对象等)。每一层的特征都是基于前一层的特征提取的,这样多层的叠加使得网络能够提取出更加复杂的特征。随着层次的增加,特征图的尺寸逐渐缩小,这减少了后续层的计算量。

 三、卷积网络组成结构

卷积神经网络(Convolutional Neural Network,CNN)的基本架构通常包括以下几种层:

输入层(Input Layer):接受原始数据输入,例如图像,其尺寸与输入图像的尺寸相匹配。

卷积层(Convolutional Layer):负责特征提取。卷积核在输入数据上滑动,计算每个位置的卷积,从而得到特征图。多个卷积核可以提取多种特征。通常会使用ReLU等激活函数来引入非线性。

池化层(Pooling Layer):减小特征图的尺寸,同时保留最重要的信息。常用的池化操作是最大池化和平均池化。

全连接层(Fully Connected Layer):将之前层次提取的特征进行扁平化,并通过全连接操作将其与输出层相连接。

输出层(Output Layer):根据任务的不同,可以是一个全连接层,也可以是一个Softmax层,用于分类问题。

批归一化层(Batch Normalization Layer):用于加速训练过程,提升模型的泛化性能。

Dropout层:在训练过程中随机断开一部分神经元,防止过拟合。

残差连接(Residual Connection):引入跳跃连接,可以在深层网络中减轻梯度消失问题。

卷积核(Kernel):卷积操作的核心部分,可以将其视为特征检测器。

 一个简单的卷积神经网络示例:

import torch
import torch.nn as nnclass SimpleCNN(nn.Module):def __init__(self):super(SimpleCNN, self).__init__()self.conv1 = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3, stride=1, padding=1)self.pool = nn.MaxPool2d(kernel_size=2, stride=2, padding=0)self.conv2 = nn.Conv2d(in_channels=16, out_channels=32, kernel_size=3, stride=1, padding=1)self.fc1 = nn.Linear(32 * 16 * 16, 512)self.fc2 = nn.Linear(512, 10)def forward(self, x):x = self.pool(F.relu(self.conv1(x)))x = self.pool(F.relu(self.conv2(x)))x = x.view(-1, 32 * 16 * 16)x = F.relu(self.fc1(x))x = self.fc2(x)return x# 创建网络实例
net = SimpleCNN()# 打印网络结构
print(net)

 其中包含两个卷积层、两个池化层和两个全连接层。

具体案例参考PyTorch实战:实现Cifar10彩色图片分类


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/85139.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件测试的理论基础1

软件的生命周期 可行性研究和计划(立项) 需求分析 概要设计(测试计划) 详细设计(测试方案) 实现(开发阶段;包含单元测试) 组装测试(集成测试) 确…

【MT7628AN】IOT | MT7628AN OpenWRT开发与学习

IOT | MT7628AN OpenWRT开发与学习 时间:2023-06-21 文章目录 `IOT` | `MT7628AN` `OpenWRT`[开发与学习](https://blog.csdn.net/I_feige/article/details/132911634?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22132911634…

上PICO,沉浸式观看亚运直播,参与跨国界游戏竞技

备受瞩目的杭州第19届亚运会,将于9月23日正式开幕。据悉,这也是有史以来项目最多的一届亚运会,除部分传统奥运项目外,还包含武术、藤球、板球、克柔术、柔术等亚洲特色项目,以及霹雳舞、电子竞技等深受年轻人喜爱的新兴…

Mojo编程语言是AI人工智能的新的编程语言

Mojo是Chris Lattner的创业公司Modular开发的一种新的编程语言,旨在统一AI基建和异构计算。Mojo被认为是Python的超集,兼容Python生态,但添加了系统编程和编译期优化的特性,以提高性能和部署效率。Mojo基于MLIR,可以支…

debian终端快捷键设置

为了方便使用图形化debian,快捷调出shell终端是提升工作学习效率的最重要的一步。 1.首先点击右上角,选择设置 2.点击键盘,选择快捷键,并创建自定义快捷键 3.点击添加快捷键 4.根据图中提示创建快捷键 Name: Terminal Command…

Android Jetpack Compose之UI的重组和自动刷新

1.概述 我们都知道,在传统的View中,若要改变UI,需要我们修改View的私有属性,比如要修改一个TextView的文字,我们需要通过它的setText(“xxx”)方法去修改。而Compose 则是通过重组来刷新UI。在之前的状态管理的文章中…

【CSS】画个三角形或圆形或环

首先通过调整边框&#xff0c;我们可以发现一些端倪 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><style>.box{width: 150px;height:150px;border: 50px solid black;}</style&g…

[JAVEee]SpringBoot项目的创建

SpringBoot可以更好的开发Spring项目,本文章将使用idea社区版来演示创建项目的过程与注意事项. SpringBoot的优点 SpringBoot中内置快速添加依赖的功能,能够便捷的集成各种框架,帮助开发.内置运行容器,无需配置Tomcat容器等其他web容器,可直接进行项目的部署与运行.更好的使用…

2023年中国研究生数学建模竞赛D题解题思路

为了更好的帮助大家第一天选题&#xff0c;这里首先为大家带来D题解题思路&#xff0c;分析对应赛题之后做题阶段可能会遇到的各种难点。 稍后会带来D题的详细解析思路&#xff0c;以及相关的其他版本解题思路 成品论文等资料。 赛题难度评估&#xff1a;A、B>C>E、F&g…

MDK工程转换Vscode+EIDE方法

MDK工程转换VscodeEIDE方法 1、VscodeEIDE环境搭建方法 请按下方视频完成环境搭建&#xff0c;并编译成功。下载&#xff0c;单步调试如无视频中芯片可暂不执行。 https://www.bilibili.com/video/BV1Zu4y1f72H/?spm_id_from333.337.search-card.all.click&vd_source73…

flex布局与float布局

float布局 俩栏 三栏 flex布局

第一百五十一回 自定义组件综合实例:游戏摇杆二

文章目录 内容回顾实现方法位置细节示例代码我们在上一章回中介绍了如何实现 游戏摇杆相关的内容,本章回中将继续介绍这方面的知识.闲话休提,让我们一起Talk Flutter吧。 内容回顾 我们在上一章回中介绍了游戏摇杆的概念以及实现方法,并且通过示例代码演示了实现游戏摇杆的…

MLAgents (0) Unity 安装及运行

1、下载ML-Agents 下载地址 GitHub - Unity-Technologies/ml-agents: The Unity Machine Learning Agents Toolkit (ML-Agents) is an open-source project that enables games and simulations to serve as environments for training intelligent agents using deep reinfo…

7.2、如何理解Flink中的水位线(Watermark)

目录 0、版本说明 1、什么是水位线&#xff1f; 2、水位线使用场景&#xff1f; 3、设计水位线主要为了解决什么问题&#xff1f; 4、怎样在flink中生成水位线&#xff1f; 4.1、自定义标记 Watermark 生成器 4.2、自定义周期性 Watermark 生成器 4.3、内置Watermark生…

软考网络工程师华为配置考点总结

华为交换机配置基础 1.vlan的配置 华为设备中划分VLAN的方式有&#xff1a; 静态的划分&#xff1a;基于接口动态划分&#xff1a;基于MAC地址、基于IP子网、基于协议、基于策略&#xff08;MAC地址、Ip地址&#xff09;。 其中基于接口划分VLAN&#xff0c;是最简单&#x…

AI视频剪辑:批量智剪技巧大揭秘

对于许多内容创作者来说&#xff0c;视频剪辑是一项必不可少的技能。然而&#xff0c;传统的视频剪辑方法需要耗费大量的时间和精力。如今&#xff0c;有一种全新的剪辑方式正在改变这一现状&#xff0c;那就是批量AI智剪。这种智能化的剪辑方式能够让你在短时间内轻松剪辑大量…

代码随想录算法训练营第23期day3| 203.移除链表元素 ,707.设计链表,206.反转链表

目录 一、链表 基础操作 二、&#xff08;leetcode 203&#xff09;移除链表元素 1.使用原来的链表 2.设置虚拟头结点 三、&#xff08;leetcode 707&#xff09;设计链表 四、&#xff08;leetcode 206&#xff09;反转链表 1.双指针法 2.递归法 一、链表 单链表定义…

大型集团借力泛微搭建语言汇率时区统一、业务协同的国际化OA系统

国际化、全球化集团&#xff0c;业务遍布全世界&#xff0c;下属公司众多&#xff0c;集团对管理方式和企业文化塑造有着很高的要求。不少大型集团以数字化方式助力全球统一办公&#xff0c;深化企业统一管理。 面对大型集团全球化的管理诉求&#xff0c;数字化办公系统作为集…

观测云产品更新 | 优化日志数据转发、索引绑定、基础设施自定义等

观测云更新 日志 数据转发&#xff1a;新增外部存储转发规则数据查询&#xff1b;支持启用/禁用转发规则&#xff1b;绑定索引&#xff1a;日志易新增标签绑定&#xff0c;从而实现更细颗粒度的数据范围查询授权能力。 基础设施 > 自定义 【默认属性】这一概念更改为【必…

接口自动化测试框架postman tests常用方法

【软件测试面试突击班】如何逼自己一周刷完软件测试八股文教程&#xff0c;刷完面试就稳了&#xff0c;你也可以当高薪软件测试工程师&#xff08;自动化测试&#xff09; postman常用方法集合&#xff1a; 1.​​​​​​设置环境变量 postman.setEnvironmentVariable("…