Code前端首页关于Code前端联系我们

什么是卷积神经网络? CNN的结构、训练和优化一篇文章讲得很完整

terry 2年前 (2023-09-23) 阅读数 111 #AI人工智能

本文详细讨论了卷积神经网络CNN,深入分析了背景和重要性、定义和层次介绍、训练和优化,详细分析了其卷积层、激活函数、Pooling层、归一化层,最后列出了训练和优化的多项关键技术:训练集准备和改进、损失函数、优化、学习率调整、正则化技术以及模型评估和调优。

1. 简介

卷积神经网络(CNN)的复杂性和灵活性使其成为深度学习的中心研究课题之一。在本介绍部分中,我们将深入探讨 CNN 在科学和工业中的历史背景、基本原理、重要性和影响。 卷积神经网络是什么?CNN结构、训练与优化一文全解

1.1 背景和意义

卷积神经网络受到人类视觉系统的启发,特别是视觉皮层的神经元结构。自 1962 年Hubel和Wiesel的开创性工作以来,这一思想激发了一系列研究和开发。

  1. 早期发展:LeNet-5由Yann LeCun等人在1980年代末和1990年代初开发,被认为是第一个成功的卷积神经网络。 LeNet-5 在手写数字识别方面取得了令人印象深刻的结果。
  2. 现代崛起:随着硬件的飞速发展和大数据的出现,CNN在21世纪初开始再次崛起,并在各个领域取得突破。

CNN的重要性不仅体现在它的准确性和效率上,还体现在它的理论洞察力上。例如,卷积层通过划分权重来减少参数数量,这有助于更有效地训练模型,也提高了模型对平移不变性的理解。

1.2 卷积神经网络概述

卷积神经网络是一种前馈神经网络,其人工神经元可以响应周围实体的局部区域,从而能够识别视觉空间的一些结构特征。以下是卷积神经网络的关键组成部分:

  1. 卷积层:通过卷积运算检测图像的局部特征。
  2. 激活函数:引入非线性以提高模型表达能力。
  3. 拉力层:降低函数维数,增加模型的鲁棒性。
  4. 全连接层:处理空间特征后,使用全连接层进行分类或回归。

卷积神经网络的这些组件协同工作,使 CNN 能够从原始像素中自动学习有意义的特征层次结构。随着深度的增加,这些特征逐渐从基本形状和纹理抽象为对象和场景的复杂表示。

卷积神经网络的独特优势是它们能够自动化传统机器学习中需要手动干预的许多功能部分。这不仅能够在许多任务中实现卓越的性能,而且还激发了广泛的学术和工业兴趣。


2。卷积神经网络各层简介

卷积神经网络由若干层组成,每一层都有特定的目的和功能。这部分将探讨卷积运算、激活函数、池化层和归一化层的基本概念。

2.1 卷积运算

卷积运算是卷积神经网络的核心,涉及很多复杂的概念和细节。我们将一一介绍。 卷积神经网络是什么?CNN结构、训练与优化一文全解

卷积核和特征图

卷积核是一个小矩阵,通过在输入上滑动来生成特征图。每个卷积核可以捕获不同的特征,例如边缘、角点等。

卷积核大小

卷积神经网络是什么?CNN结构、训练与优化一文全解卷积核的大小影响其可以捕获的特征的规模。较小的卷积核可以捕获更详细的特征,而较大的卷积核可以捕获更广泛的特征。

# 使用3x3的卷积核
conv_layer_small = nn.Conv2d(3, 64, 3)
# 使用5x5的卷积核
conv_layer_large = nn.Conv2d(3, 64, 5)

多通道卷积

与多通道输入进行卷积。每个输入通道都用一个卷积核进行卷积,然后将所有结果相加。这使得模型能够捕获来自不同渠道的不同特征。

步长和填充

步长和填充控制折叠操作的几何属性。

步长

步长定义了卷积核在输入上移动的速度。较大的步长会减小输出的大小,而较小的步长会保持大小不变​​。

# 使用步长2
conv_layer_stride2 = nn.Conv2d(3, 64, 3, stride=2)

填充

填充通过在输入的边缘添加零来控制输出的大小。这有助于控制折叠操作期间的信息丢失。

# 使用填充1,使得输出尺寸与输入尺寸相同(假设步长为1)
conv_layer_padding1 = nn.Conv2d(3, 64, 3, padding=1)

扩张卷积(Dilated Convolution)

扩张卷积是一种扩大卷积核感受野的方法,它在卷积核的元素之间插入一个空白。这使得网络能够捕获更广泛的信息,而无需增加内核大小或计算量。

# 使用空洞率2的卷积核
conv_layer_dilated = nn.Conv2d(3, 64, 3, dilation=2)

分组卷积(Groups Convolution)

分组卷积通过对输入通道进行分组并为每个组使用不同的卷积核来扩展卷积运算。这增加了模型的容量并使其能够学习更复杂的表示。

# 使用2个分组
conv_layer_grouped = nn.Conv2d(3, 64, 3, groups=2)

2.2 激活函数

卷积神经网络是什么?CNN结构、训练与优化一文全解 激活函数在神经网络中起着至关重要的作用。它们增加了模型的非线性,以便它可以学习和近似复杂的函数。

ReLU激活函数

ReLU(整流线性单元)是现代深度学习中最流行的激活函数之一。它是非线性的,但计算效率非常高。

优点和缺点

ReLU的主要优点是计算效率高和稀疏激活的促进。然而,它可能会导致“dead ReLU”现象,即某些神经元永远不会被激活。

# 使用PyTorch定义ReLU激活函数
relu = nn.ReLU()

Leaky ReLU

Leaky ReLU 是 ReLU 的一种变体,允许负输入值出现较小的正斜率。这有助于缓解“dead ReLU”问题。

# 使用PyTorch定义Leaky ReLU激活函数
leaky_relu = nn.LeakyReLU(0.01)

Sigmoid 激活函数

Sigmoid 激活函数可以压缩 0 到 1 之间的任意值。

优点和缺点

  • 可能会导致输出问题,但渐变层可能已经消失了。在隐藏层中。
    # 使用PyTorch定义Sigmoid激活函数
    sigmoid = nn.Sigmoid()
    

    Tanh 激活函数

    Tanh 是另一个类似于 Sigmoid 的激活函数,但它将输出压缩到 -1 到 1 之间。

    优点和缺点T 通常比 Sig 输出范围更好,但仍然会导致梯度消失。
    # 使用PyTorch定义Tanh激活函数
    tanh = nn.Tanh()
    

    Swish 激活函数

    Swish 是一种自适应激活函数,可以自动调整其形状以适应特定问题。

    # 使用PyTorch定义Swish激活函数
    class Swish(nn.Module):
        def forward(self, x):
            return x * torch.sigmoid(x)
    

    其他激活函数

    其他激活函数还有很多,比如Softmax、Mish、ELU等,各有各的优点和适用场景。

    激活函数的选择

    激活函数的选择取决于许多因素,例如模型架构、数据类型和特定任务的需求。通过实验和调整,可以找到针对特定问题的最佳激活函数。

    2.3 池化层

    卷积神经网络是什么?CNN结构、训练与优化一文全解池化层在卷积神经网络中起着重要作用。它通常用于减少特征图的维度,从而降低计算要求并增加特征检测器的感受野。 。

    最大池化

    最大池化是最常用的池化技术之一。它通过选择窗口中的最大值来减小特征图的大小。

    # 使用PyTorch定义2x2的最大池化层
    max_pooling = nn.MaxPool2d(2)
    

    优点和缺点

    最大池化最大的优点是保留了窗口中最突出的功能。然而,它丢失了一些细节。

    平均池化

    与最大池化不同,平均池化使用窗口中所有值的平均值。

    # 使用PyTorch定义2x2的平均池化层
    average_pooling = nn.AvgPool2d(2)
    

    优缺点

    平均池化可以缓解最大池化导致过分强调某些特征的问题,但它会淡化一些重要的特征。

    全局平均池化

    全局平均池化是一种更复杂的池化策略,它对整个特征图进行平均。这通常用在网络的最后一层,直接用于分类。

    # 使用PyTorch定义全局平均池化层
    global_average_pooling = nn.AdaptiveAvgPool2d(1)
    

    池化窗口大小和步长

    池化窗口的大小和步长将直接影响输出的大小。较大的窗口和步长可以更显着地减小尺寸。

    池化的替代方案

    池化层有一些现代的替代方案,例如使用步长大于 1 的折叠层或使用扩张的绕组。这些方法可以更好地保留特征。

    池化层的选择

    选择特定类型的池化层取决于任务要求和特定的数据特征。深入了解不同池化技术的工作原理可以深入了解它们如何影响模型性能。

    2.4 归一化层

    卷积神经网络是什么?CNN结构、训练与优化一文全解 归一化层在训练深度神经网络中起着关键作用,主要用于提高训练的稳定性和速度。归一化层通过将输入数据缩放到适当的范围来帮助缓解训练期间的梯度消失和爆炸问题。

    批量归一化

    批量归一化通过对每个特征通道的输入进行归一化,将输入缩放至零均值和单位方差。

    # 使用PyTorch定义批量归一化层
    batch_norm = nn.BatchNorm2d(num_features=64)
    

    优点和缺点

    • 优点 :它允许更高的学习率,提供一些正则化效果,并且通常会导致更快的训练。
    • 缺点:小批量的统计估计可能会导致训练和推理之间的差异。

    层归一化

    层归一化是对单个样本上的所有函数进行归一化的变体。它在句子处理和循环神经网络中特别流行。

    # 使用PyTorch定义层归一化
    layer_norm = nn.LayerNorm(normalized_shape=64)
    

    实例标准化

    实例标准化主要用于风格转换任务。标准化在每个样本的每个通道上独立执行。

    # 使用PyTorch定义实例归一化
    instance_norm = nn.InstanceNorm2d(num_features=64)
    

    组归一化

    组归一化是批量归一化和层归一化之间的折衷,因为通道被分为不同的组并在每个组内。执行标准化。

    # 使用PyTorch定义组归一化
    group_norm = nn.GroupNorm(num_groups=32, num_channels=64)
    

    归一化层的选择

    归一化层的选择应根据具体任务和模型架构而定。在视觉任务中,批量归一化可能更可取,而在 NLP 任务中,层归一化可能更有用。


    3。训练和优化

    卷积神经网络是什么?CNN结构、训练与优化一文全解卷积神经网络的训练和优化涉及许多关键组件和技术,它们共同决定了模型的性能和可用性。下面详细介绍这些方面。

    3.1 训练集准备和改进

    有效的训练数据是深度学习成功的基础。为了使卷积神经网络有效学习,训练集的选择和改进至关重要。

    数据预处理

    预处理是训练集准备的关键步骤,包括:

    • 归一化:将输入缩放到0-1范围。
    • 居中:减去平均值,使数据以 0 为中心。
    • 数据清理:消除差异和错误数据。

    数据增强

    数据增强是一种通过应用随机变换来增加数据量的技术,从而提高模型的通用性。 ?确保模型不会过度贴合。

    3.2 损失函数

    损失函数衡量模型预测与真实目标之间的距离。选择合适的损失函数是优化模型性能的关键步骤。

    回归任务

    对于连续值预测,通常使用:

    • 均方误差 (MSE) :测量真值平方和真值之间的差。
    # 使用PyTorch定义MSE损失
    mse_loss = nn.MSELoss()
    
    • 平滑L1损失:减少偏差的影响。

    分类任务

    对于类别预测,常见的损失函数包括:

    • 交叉熵损失:衡量预测概率分布与真实分布之间的差异。
    # 使用PyTorch定义交叉熵损失
    cross_entropy_loss = nn.CrossEntropyLoss()
    
    • 二元交叉熵损失:特别用于二元分类任务。
    • 多标签损失:适用于多标签分类。

    优化损失函数

    选择合适的损失函数不仅取决于任务类型,还取决于模型架构、数据分布和具体业务指标。有时可能需要自定义损失函数来捕获特定问题的核心挑战。

    3.3 优化器

    优化器用于更新神经网络的权重,以最小化损失函数。每个优化器都有其特定的数学原理和应用场景。

    随机梯度下降(SGD)

    SGD 是最基本的优化算法。

    • Basic SGD:沿负梯度方向更新权重。
    • 带动量的SGD:引入动量项并累加之前的梯度以实现更平滑的收敛。
    # 使用PyTorch定义带动量的SGD优化器
    optimizer_sgd_momentum = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
    

    自适应优化器

    自适应优化器可以自动调整学习速度。

    • Adam:结合了 Momentum 和 RMSProp 的优点。
    # 使用PyTorch定义Adam优化器
    optimizer_adam = torch.optim.Adam(model.parameters(), lr=0.001)
    
    • Adagrad、RMSprop等:针对不同的参数有不同的学习率。

    选择优化工具的注意事项

    • 任务相关性:不同的优化工具对不同的任务和数据会产生不同的效果。
    • 超参数调整:比如学习率、动量等可能需要调整。

    3.4 学习率调整

    学习率是优化器中的关键超参数,其调整对模型训练有着深远的影响。

    固定学习率

    最简单的方法是使用固定学习率。但可能不够灵活。

    学习率规划

    一种更复杂的方法是在训练过程中动态调整学习率。

    预定调整

    • 步数减少 :按固定步长减少学习率。
    • 余弦退火:定期调整学习率。
    # 使用PyTorch定义余弦退火调度器
    scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer_adam, T_max=50)
    

    自适应调整

    • ReduceLROnPlateau:根据验证损失降低学习率。

    学习率预热

    在训练初期逐渐提高学习率。

    • 线性预热:线性增加初始阶段的学习率。

    3.5 正则化技术

    正则化是防止过拟合、提高模型泛化能力的关键技术。

    L1和L2正则化

    • L1正则化:倾向于产生稀疏权重并有助于特征选择。
    • L2正则化:减少权重,使模型更平滑。
    # 使用PyTorch添加L1和L2正则化
    l1_lambda = 0.0005
    l2_lambda = 0.0001
    loss = loss + l1_lambda * torch.norm(weights, 1) + l2_lambda * torch.norm(weights, 2)
    

    Dropout

    随机关闭一部分神经元,使模型更加稳健。

    • 正常 Dropout:随机丢弃神经元。
    • Spatial Dropout:随机丢弃折叠层中的整个特征图。

    批量归一化

    通过归一化层输入加快训练速度并降低初始化敏感性。

    数据增强

    如前所述,数据增强是一种重要的正则化方法。

    3.6 模型评估和调优

    模型评估是衡量模型性能的过程,调优是提高性能的过程。

    交叉验证

    使用交叉验证来估计模型的通用性。

    • k折交叉验证:将数据分为k份,依次使用其中一份作为验证集。

    调整参数的提示

    • 网格搜索:尝试不同的超参数组合。
    • 随机搜索:随机选择超参数,效率更高。

    提前停止的提示

    如果验证损失不再减少,请停止训练以防止过度拟合。

    模型集成

    通过组合多个模型来提高性能。

    • Bagging:训练多个模型和平均预测。
    • Boosting:根据先前模型的错误训练新模型。
    • Stacking:使用新模型结合其他模型的预测。

    4。总结

    卷积神经网络是什么?CNN结构、训练与优化一文全解本文广泛讨论了卷积神经网络CNN,深入分析了背景和重要性、定义和层次介绍、训练和优化,并详细分析了它的卷积层、激活函数和池化层、归一化层、最后列出了训练和优化的一些关键技术:训练集准备和改进、损失函数、优化、学习率自适应、正则化技术以及模型评估和调优。旨在为人工智能学者使用卷积神经网络(CNN)提供全面的指导。

    作者TechLead拥有10年以上互联网服务架构、AI产品开发和团队管理经验。拥有同济大学、复旦大学硕士学位。复旦机器人智能实验室成员、阿里云认证高级架构师、亿级项目管理专业人士。营收AI产品研发经理

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门