一文快速预览经典深度学习模型(一)——CNN、RNN、LSTM、Transformer、ViT

Hi,大家好,我是半亩花海。本文主要简要并通俗地介绍了几种经典的深度学习模型,如CNN、RNN、LSTM、Transformer、ViT(Vision Transformer)等,便于大家初探深度学习的相关知识,并更好地理解深度学习的基础内容,为后续科研开展建立一定的基础,欢迎大家一起交流学习。

目录

一、CNN(卷积神经网络)

1. 网络结构

2. 模型细节

3. 模型结构图

二、CNN变形

1. 具体模型

2. 网络结构

3. Inception细节

4. AlexNet和ResNet模型讲解

三、RNN(循环神经网络)

1. 模型简介

2. 模型结构

3. 模型细节

4. RNN模型讲解

5. 模型结构图

四、LSTM(长短期记忆神经网络)

1. 模型结构

2. 模型细节

3. 模型结构图

五、Transformer

1. 模型简介

2. 模型结构

3. 多头自注意力机制

4. 模型结构图(含具体结构解释)

六、ViT(Vision Transformer)

1. 模型简介

2. 模型结构

3. 模型结构图

4. ViT模型资源


一、CNN(卷积神经网络)

1. 网络结构

  • 输入层:输入图像等信息
  • 卷积层:用来提取图像的底层特征
  • 池化层:下采样(降采样层)防止过拟合,将数据维度减小(降维);最大(Max-Pooling)/平均(Ave-Pooling)
  • 全连接层:分类器,汇总卷积层和池化层得到的图像的底层特征和信息;通过激活函数(如 ReLU, Sigmoid, Tanh, softmax 等)进行非线性变换
  • 输出层:根据全连接层的信息得到概率最大的结果

2. 模型细节

  • 卷积运算:
    • 若步长 s=1:卷积大小结果为 N+2P-F+1
    • 若步长 s\neq 1:卷积大小结果为 \frac{N+2P-F}{s}+1(N:初始图片大小;P:padding,零填充的层数大小;F:卷积核大小;s:stride,步长)
  • 零填充两种方式:
    • valid:不填充,结果变小
    • same:输出图像与原图大小相同(如:若 s=1,则当 N+2P-F+1=N 即 P=\frac{1}{2} 时成立)

3. 模型结构图

  • 手写体数字识别的任务中,CNN模型结构如下所示:


二、CNN变形

1. 具体模型

LeNet-5、AlexNet、NIN、VGG、GoogLeNet、ResNet、DenseNet、MobileNets等。

2. 网络结构

  • LeNet:两个layer(conv+pool)+两层网络+FC(Fully Connected Layer,全连接层)
  • AlexNet:8层CNN(前5层卷积层,剩下3层全连接层);6000万参数量,首次使用Relu激活函数,dropout+BN(Batch Normalization,批标准化层)

  • NIN:Network In Network,1×1卷积,使得输入任意的特征图大小,输出为1×1×?,相当于一种全连接层/卷积化(全连接的输入是固定的,而卷积层可以处理任意大小输入,故相当于把全连接层变成卷积层,即卷积化);对多个通道进行信息整合,通道进行线性回归运算;达到通道数的变化,升维/降维/通道数不变,参数数量较少
  • VGG:参数量巨大,140M=140亿,19layers,VGG版本16/19(下图为VGG16,共16 个可训练层,其中13 个卷积层和 3 个全连接层,一般作为编码器,通过卷积层提取特征,再通过池化层降维,从而有效保留关键特征。)

  • GoogLeNet:参数较少,引入Inception V1, V2, V3, V4模块(通过并行的卷积操作来提取多尺度特征),造成参数变少

  • ResNet:残差网络、深度卷积神经网络架构
    • 残差学习:学习输入和输出之间的残差(即差异),而不是直接映射关系。
    • 残差块(Residual Blocks):ResNet由多个残差块组成,每个残差块包含两条路径:一条是卷积层的堆叠,另一条是恒等连接(Identity Connection)。
    • 恒等连接:允许输入直接跳过一些层的输出,然后与这些层的输出相加。这有助于解决深层网络训练中的梯度消失问题。

3. Inception细节

  • 目的:代替人手工区确定到底使用1×1,3×3,5×5还是是否需要max_pooling层,由网络自动取寻找适合的结构,并且节省计算。
  • 特点:使用多种卷积核进行运算,合并结果通道数。
  • 最终结果:28×28×256
    • 使用更少参数,达到和AlexNet或VGG同样类似的输出结果。
  • 计算量还是太大?参数还是太多?
    • 网络缩小之后再扩展,在5×5之前加一个1×1卷积结构

4. AlexNet和ResNet模型讲解

  • AlexNet:
    • https://www.bilibili.com/video/BV1ih411J7Kz?spm_id_from=333.788.videopod.sections&vd_source=9a436674403fe319125921c7e9fd097d
    • https://www.bilibili.com/video/BV1hq4y157t1?spm_id_from=333.788.videopod.sections&vd_source=9a436674403fe319125921c7e9fd097d
  • ResNet:
    • https://www.bilibili.com/video/BV1Fb4y1h73E?spm_id_from=333.788.videopod.sections&vd_source=9a436674403fe319125921c7e9fd097d
    • https://www.bilibili.com/video/BV1P3411y7nn?spm_id_from=333.788.videopod.sections&vd_source=9a436674403fe319125921c7e9fd097d

三、RNN(循环神经网络)

1. 模型简介

  • 循环神经网络、序列模型、反馈神经网络
  • 用于处理序列数据
  • 隐状态h可以对序列形的数据提取特征,接着再转换为输出

2. 模型结构

  • 输入单元(input units):\left \{ x_{0},\cdot \cdot \cdot, x_{t-1}, x_{t},\cdot \cdot \cdot, x_{t+1},\cdot \cdot \cdot \right \}
  • 隐藏单元(hidden units):\left \{ h_{0},\cdot \cdot \cdot, h_{t-1}, h_{t},\cdot \cdot \cdot, h_{t+1},\cdot \cdot \cdot \right \}
  • 输出单元(output units):\left \{ o_{0},\cdot \cdot \cdot, o_{t-1}, o_{t},\cdot \cdot \cdot, o_{t+1},\cdot \cdot \cdot \right \}
  • 输入层:x_{t} 表示时刻 t 的输入。
  • 第t次的中间的隐含层状态为:\left \{ h_{t} = f(U\cdot x_{t}+W\cdot h_{t-1}) \right \}f 是非线性激活函数,比如 tanh
  • 输出层:o_{t} = softmax(V\cdot h_{t}) = V\cdot softmax(h_{t})

3. 模型细节

  • 类型:
    • 一对一:固定的输入到输出,如图像分类
    • 一对多:固定的输入到序列输出,如图像的文字描述
    • 多对一:序列输入到输出,如情感分析,分类正面负面情绪
    • 多对多:序列输入到序列的输出,如机器翻译(称之为编解码网络)
    • 同步多对多:同步序列输入到同步输出,如文本生成,视频每一帧的分类(也称之为序列生成)
  • 参数共享:U, V, W 是不变的,这种参数共享的机制降低了网络的参数量
  • 问题:长期依赖;梯度消失、梯度爆炸问题;并行度较低,计算性能较差;信息容易丢掉,内存得大才行

4. RNN模型讲解

  • transformer:
    • https://www.bilibili.com/video/BV1pu411o7BE?spm_id_from=333.788.videopod.sections&vd_source=9a436674403fe319125921c7e9fd097d

5. 模型结构图


四、LSTM(长短期记忆神经网络)

1. 模型结构

(1)概述:LSTM对神经元单元状态的控制是通过一种叫“门”的结构实现的(有效筛选信息),在隐藏层里增加了记忆单元状态
(2)门的组成:sigmoid 函数(0全被遗忘、1全被保留、0-1部分信息保留)、一个执行点乘操作的计算元件
(3)门的种类:输入门、遗忘门(前两者决定记忆单元 C 的内容)和输出门

  • 输入门:控制当前时刻的输入 x_{t} 保存到了当前时刻的记忆单元状态 C_{t} 的比例大小
  • 遗忘门:控制上一时刻的记忆单元状态 C_{t-1} 保留到当前时刻的记忆单元状态 C_{t} 的比例大小
  • 输出门:控制单元状态 C_{t} 输出到当前的输出 h_{t} 的比例大小

(4)LSTM训练过程:

  • 前向传播具体计算过程:
    • 遗忘门计算:控制历史信息的保留(利用 sigmoid 激活函数,获取上一时刻的隐藏层输出 h_{t-1} 和这一时刻的模型输入 x_{t}
    • 输入门计算:控制当前时刻的输入中有多少信息要被添加到单元状态中
      • 通过 sigmoid 函数确定需要添加的信息
      • 通过 tanh 函数创建一个候选记忆单元信息状态
    • 状态更新:通过处理要遗忘和要保留的信息,完成上一时刻的记忆单元状态 C_{t-1} 到当前时刻 C_{t} 的更新(矩阵乘积)
    • 输出门计算:控制从记忆单元到输出的过程(输入为上一时刻得到的记忆单元状态 C_{t}、上一时刻的隐藏层输出 h_{t-1} 和这一时刻的模型输入 x_{t},输出这一时刻隐藏层的输出 h_{t} 和模型的输出 y_{t}

(5)计算误差:将输出值与实际值对比,建立损失函数,得到模型计算误差

(6)反向传播、更新参数:根据计算误差,多轮反向传播计算,更新模型参数(遗忘门、输入门、输出门、候选记忆单元中的权重参数及偏置、隐藏层与输出之间的权重参数),直至模型达到理想估计效果,用此时的可用模型对电池SOH进行估计

2. 模型细节

  • 对比RNN:
    • 将RNN中的隐藏层单元换成了一种具有特殊记忆功能的循环体结构
    • 在隐藏层状态h的基础上增加了记忆单元状态c(选择性地保留或删除历史信息,保证了长时间数据学习之后的梯度依然存在
  • GRU:门控循环单元
    • 重置门
    • 更新门

3. 模型结构图


五、Transformer

1. 模型简介

  • 基于自注意力机制(self-attention)的深度学习模型;
  • 主要用于处理序列到序列的任务,如机器翻译、文本摘要等

2. 模型结构

  • 核心:采用了全连接的自注意力层替代了传统的RNN或CNN
  • 模型结构的关键部分:
    • 编码器-解码器架构:Transformer模型由编码器(Encoder)和解码器(Decoder)两部分组成。编码器处理输入序列,而解码器生成输出序列。
    • 多头自注意力机制:编码器和解码器内部都包含多头自注意力机制(Multi-Head Attention),这种机制允许模型在处理序列中的每个元素时,同时考虑序列中的其他元素,从而捕捉序列内部的依赖关系。
    • 层级归一化(Layer Normalization):在每个子层(自注意力子层和前馈网络子层)之后,都会进行层归一化操作,这有助于模型的训练稳定性。
    • 残差连接(Residual Connection):每个子层的输出会与输入相加,形成残差连接,这有助于解决深层网络中的梯度消失问题。
    • 前馈网络(Feed Forward Network):在自注意力层之后,每个编码器和解码器的子层都会通过一个前馈网络,这个网络对每个位置的向量进行独立相同的操作。
    • 位置编码:由于Transformer模型本身不具备处理序列顺序的能力,因此需要引入位置编码来捕捉序列中词汇的位置信息。位置编码可以是学习得到的,也可以是通过正余弦函数(sin/cos)生成的。
    • 词嵌入:模型的输入首先通过一个词嵌入层,将词汇映射到高维空间中的向量表示。
    • 位置编码:为了保留序列信息,添加了一个位置编码到词向量中,使得模型能够理解单词之间的相对顺序。
    • 模块堆叠:编码器和解码器都由多个相同的层堆叠而成(通常是6个),每个层都包含自注意力机制和前馈网络,这样的结构使得模型能够捕获不同尺度的依赖关系。

3. 多头自注意力机制

多头自注意力机制(Multi-Head Attention)是Transformer模型中的核心组成部分,它允许模型在不同的表示子空间中并行地捕捉信息。

(1)基础步骤:

自注意力机制的核心思想:对于输入的每个位置,计算该位置与其他所有位置之间的相关性或相似性,并据此调整每个位置的表示。

  • 输入表示:假设输入是一个矩阵 X \in \mathbb{R}^{n \times d},其中 n 是序列的长度,d 是每个位置的表示维度。
  • 线性变换:输入矩阵 X 被映射到三个不同的向量:查询(Query)、键(Key)和值(Value)。这通过三个不同的权重矩阵 W_{Q}, W_{K}, W_{V}​ 实现,如下。【这里,Q 是查询矩阵,K 是键矩阵,V 是值矩阵。】

Q=X\cdot W_{Q}, K=X\cdot W_{K}, V=X\cdot W_{V}

  • 计算注意力权重:通过计算查询与键的点积来衡量各个位置之间的相关性,然后通过软max(Softmax)函数得到注意力权重。计算公式如下。【其中,d_{k} 是键向量的维度,通常是 d 的一部分,\frac{1}{\sqrt{d_k}} 是缩放因子,用于防止点积值过大。】

Attention(Q, K, V)=Softmax(\frac{QK^{T}}{\sqrt{d_{k}}})V

(2)结构细节:

  • 线性映射:在多头自注意力中,输入序列首先被映射到查询(Query)、键(Key)和值(Value)三个矩阵。这些映射是通过与权重矩阵相乘来实现的,通常这些权重矩阵是可学习的参数。
  • 多头结构:多头自注意力机制包含多个“头”,每个头都独立地执行自注意力操作。每个头都有自己的一套权重矩阵,用于Q、K和V的线性映射。
  • 缩放点积注意力:每个头计算Q和K的点积,然后通过除以一个缩放因子(通常是向量维度的平方根,如 \sqrt{k})来防止梯度消失或爆炸。
  • 掩码操作:如果存在,掩码(Mask)会被应用到点积的结果上,通常是将某些位置的值设置为一个非常大的负数(如负无穷),这样在应用softmax时,这些位置的权重会接近于零,从而实现对某些位置的忽略。
  • softmax归一化:对缩放后的点积结果应用softmax函数,得到每个头的注意力权重矩阵。
  • 加权求和:使用softmax得到的注意力权重矩阵与V矩阵相乘,得到每个头的输出,即加权求和的上下文向量。
  • 头的组合:所有头的输出会被拼接在一起,然后通过一个线性层进行处理,这个线性层可以学习如何最好地组合来自不同头的信息。
  • 前向传播:在前向传播过程中,每个自注意力头独立地处理输入,然后将结果沿着最后一个维度进行拼接,形成最终的多头自注意力输出。

(3)图示化的结构:

假设输入序列长度为 n,每个位置的维度为 d,则多头自注意力的结构可以简要描述为:

  • 输入 X \in \mathbb{R}^{n \times d}
  • 映射到多个头:通过 W_{Q}^{i}, W_{K}^{i}, W_{V}^{i} 映射到查询、键和值(每个头的维度为 d_{k}
  • 对每个头计算注意力:Attention_{i}=Softmax(\frac{Q_{i}K_{i}^{T}}{\sqrt{d_{k}}})V_{i}
  • 拼接所有头的输出:\text{MultiHead} = \text{Concat}(\text{Attention}_1, \dots, \text{Attention}_h)
  • 线性变换输出:\text{Output} = \text{MultiHead} W_O

(4)好处:捕捉到序列中不同位置之间的复杂关系;通过并行处理提高了模型的计算效率;使得模型能够从不同的角度学习数据的表示,增强了模型的表达能力。

4. 模型结构图(含具体结构解释)


六、ViT(Vision Transformer)

1. 模型简介

  • Transformer 架构应用于计算机视觉(cv)任务的模型
  • 将图像视为序列数据,利用Transformer在自然语言处理(nlp)中的成功
  • ViT的关键思想:通过自注意力机制,ViT能够充分利用图像的全局上下文信息,而不仅仅依赖于局部特征,这使得它能够在较大的图像数据集上表现出色。

2. 模型结构

总结:输入图像分割成patches线性嵌入与位置编码Transformer编码器(自注意力机制) → [CLS] token输出分类结果

(1)输入处理

  • 图像分块(Patch Embedding): ViT将输入图像划分为固定大小的图像块(patch),例如16×16像素的块。每个块被展平并映射到一个高维嵌入空间中,这通常通过一个线性层来实现。
  • 位置编码(Position Encoding): 由于 Transformer 本身不具备处理序列中元素位置的能力,ViT为每个图像块添加位置编码,以保留空间信息。位置编码可以是固定的或可学习的。

(2)Transformer 编码器

ViT的核心是标准的Transformer编码器,由多个自注意力层和前馈神经网络组成。

  • 自注意力机制(Self-Attention): 在每个自注意力层中,每个图像块通过自注意力机制与其他块进行交互。这使得模型能够捕捉不同区域之间的依赖关系。
  • 多头注意力(Multi-Head Attention): 通过多头机制,模型可以在多个子空间中并行学习特征,增强了特征表示能力。
  • 前馈神经网络(Feed-Forward Network, FFN): 每个自注意力层后面接一个前馈神经网络,通常由两个线性层和一个非线性激活函数(如GELU)组成。
  • 层归一化和残差连接: 在每个子层之后,ViT应用层归一化和残差连接,以稳定训练并提高模型的表达能力。

(3)输出处理

  • 分类头(Classification Head): ViT通常在处理完所有层之后,将第一个图像块(通常称为[CLS] token)用作分类结果的表示。这个token的输出通过一个线性层映射到类别空间,得到最终的分类结果。

3. 模型结构图

(1)vit_figure:

Transformer的编码器(Transformer_Encoder)

  • 多层自注意力机制(Self-Attention)
  • 前馈神经网络(Feedforward Neural Network,FNN)

(2)mixer_figure:MLP-Mixer,基于多层感知机(MLP)的视觉模型

4. ViT模型资源

GitHub - google-research/vision_transformer

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

这是一个bug求助帖子--安装kali 遇坑

第一个报错 介质:kali-linux-2024.1-live-amd64 环境:Dell笔记本 i510代cpu 现象及操作 安装完以后 然后我换了个国内的源进行了以下操作 apt-get update:更新源列表 apt-get upgrade:更新所有可以更新的软件包 然后进行清理。…

qt QClipboard详解

1、概述 QClipboard是Qt框架中的一个类,它提供了对窗口系统剪贴板的访问能力。剪贴板是一个临时存储区域,通常用于在应用程序之间传递文本、图像和其他数据。QClipboard通过统一的接口来操作剪贴板内容,使得开发者能够方便地实现剪切、复制和…

PyTorch核心概念:从梯度、计算图到连续性的全面解析(三)

文章目录 Contiguous vs Non-Contiguous TensorTensor and ViewStrides非连续数据结构:Transpose( )在 PyTorch 中检查Contiguous and Non-Contiguous将不连续张量(或视图)转换为连续张量view() 和 reshape() 之间的区别总结 参考文献 Contig…

DeBiFormer实战:使用DeBiFormer实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度,DP多卡,EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

iOS SmartCodable 替换 HandyJSON 适配记录

前言 HandyJSON群里说建议不要再使用HandyJSON,我最终选择了SmartCodable 来替换,原因如下: 首先按照 SmartCodable 官方教程替换 大概要替换的内容如图: 详细的替换教程请前往:使用SmartCodable 平替 HandyJSON …

Sqoop学习

目录 一、Soop简介 二、Sqoop的安装 1. 上传压缩包到/opt/install目录下 2.解压 3.修改文件名 4.拷贝sqoop-1.4.7.bin__hadoop-2.6.0目录下的sqoop-1.4.7.jar包到/opt/soft/sqoop147目录下 5.拷贝sqoop-1.4.7.bin__hadoop-2.6.0/lib目录下该jar包到sqoop/lib目录下 6.复…

WiFi一直获取不到IP地址是怎么回事?

在当今这个信息化时代,WiFi已成为我们日常生活中不可或缺的一部分。无论是家庭、办公室还是公共场所,WiFi都为我们提供了便捷的无线互联网接入。然而,有时我们可能会遇到WiFi连接后无法获取IP地址的问题,这不仅影响了我们的网络使…

FasterNet中Pconv的实现、效果与作用分析

发表时间:2023年3月7日 论文地址:https://arxiv.org/abs/2303.03667 项目地址:https://github.com/JierunChen/FasterNet FasterNet-t0在GPU、CPU和ARM处理器上分别比MobileViT-XXS快2.8、3.3和2.4,而准确率要高2.9%。我们的大型…

如何快速搭建一个spring boot项目

一、准备工作 1.1 安装JDK:确保计算机上已安装Java Development Kit (JDK) 8或更高版本、并配置了环境变量 1.2 安装Maven:下载并安装Maven构建工具,这是Spring Boot官方推荐的构建工具。 1.3 安装代码编辑器:这里推荐使用Inte…

从零开始训练一个大语言模型需要多少天?

一,前言 在AI领域,训练一个大型语言模型(LLM)是一个耗时且复杂的过程。几乎每个做大型语言模型(LLM)训练的人都会被问到:“从零开始,训练大语言模型需要多久和花多少钱?”…

成大事者,不外传的心计

成大事者,不外传的心计: 1.男人要避开闺蜜众多的女人。 2.追求女生,不可过于主动,心急难以品尝到热豆腐的美味。 3.倘若这个人身边没什么朋友,那就要赶快远离。 4.让利,是拓展人脉资源的有效法门。 5.…

如何将数据从 AWS S3 导入到 Elastic Cloud - 第 3 部分:Elastic S3 连接器

作者:来自 Elastic Hemendra Singh Lodhi 了解将数据从 AWS S3 导入 Elastic Cloud 的不同选项。这次我们将重点介绍 Elastic S3 Connector。 这是多部分博客系列的第三部分,探讨了将数据从 AWS S3 导入 Elastic Cloud 的不同选项。 在本博客中&#xf…

产品经理如何使用项目管理软件推进复杂项目按时上线

前言 相信很多产品同学或多或少都有过这样的经历:平时没有听到任何项目延期风险,但到了计划时间却迟迟无法提测……评审时没有任何argue,提测后发现开发的功能不是自己想要的……费劲九牛二虎之力终于让项目上线了,然而发现成果达…

K8S node节点没有相应的pod镜像运行故障处理办法

查看从节点状态 kubectl describe node k8s-node1以下是报错提示 解决办法 需要处理node1节点上的磁盘空间,磁盘空间需要在85%内 处理后的状态 处理正常

11.9.2024刷华为

文章目录 HJ31 单词倒排HJ32 密码提取语法知识记录 傻逼OD题目又不全又要收费,看毛线,莫名奇妙 HW这叼机构别搁这儿害人得不得? 我觉得我刷完原来的题目 过一遍华为机考的ED卷出处,就行了 HJ31 单词倒排 游戏本做过了好像 HJ3…

Colmap3.8 [CUDA]和[NO CUDA]版本

Colmap3.8 [CUDA]和[NO CUDA]版本的下载地址如下所示: 通过百度网盘分享的文件:colmap3.8 链接:https://pan.baidu.com/s/1kfbUqFI5N2t8Bx2MasFKXQ?pwd998n 提取码:998n 解压即可使用,运行时,点击下图…

sealos部署K8s,安装docker时master节点突然NotReady

1、集群正常运行中,在集群master-1上安装了dockerharbor,却发现master-1节点NotReady,使用的网络插件为 Cilium #安装docker和harbor(docker运行正常) rootmaster-1:/etc/apt# apt install docker-ce5:19.03.15~3-0~u…

NoETL自动化指标平台为数据分析提质增效,驱动业务决策

直觉判断往往来源于多年的经验和专业知识,能够在复杂和不确定的环境中快速做出决策反应。但这种方式普遍存在主观偏见,缺乏合理的科学依据,无法全面、客观、精准地评估和识别市场趋势与用户需求,从而造成决策失误,给业…

vscode的一些使用心得

问题1:/home目录空间有限 连接wsl或者remote的时候,会在另一端下载一个.vscode-server,vscode的插件都会安装进去,导致空间增加很多,可以选择更换这个文件的位置 参考:https://blog.csdn.net/weixin_4389…

《JavaEE进阶》----21.<基于Spring图书管理系统②(图书列表+删除图书+更改图书)>

PS: 开闭原则 定义和背景‌ ‌开闭原则(Open-Closed Principle, OCP)‌,也称为开放封闭原则,是面向对象设计中的一个基本原则。该原则强调软件中的模块、类或函数应该对扩展开放,对修改封闭。这意味着一个软…