【机器学习】经典CNN架构

第一章:引言

1.1 研究背景

机器学习的发展历程

机器学习作为人工智能的重要分支,其发展历程可以追溯到20世纪50年代。初期的机器学习研究主要集中在规则系统和基本的统计学习方法上。随着计算能力的提升和数据的积累,机器学习逐渐发展出更为复杂的算法和模型。20世纪80年代和90年代,出现了许多影响深远的算法,如决策树、支持向量机(SVM)和随机森林,这些方法在多种应用场景中取得了显著的成果。

进入21世纪后,深度学习的兴起极大地推动了机器学习的发展。深度学习通过构建多层次的神经网络(深度神经网络),能够自动学习数据中的复杂特征,并在各种任务中超越传统机器学习算法的表现。尤其是在图像处理和计算机视觉领域,深度学习表现出了非凡的能力,使得许多曾经难以解决的问题得到了突破。

卷积神经网络(CNN)的崛起

卷积神经网络(CNN)是深度学习领域的一项重要突破。CNN最早由Yann LeCun等人在20世纪80年代末期提出,用于图像识别任务。其核心思想源于生物视觉系统的特性,模拟了人类视觉处理的过程。CNN通过卷积层、池化层和全连接层的组合,能够有效地从图像数据中提取层次化特征。

在2012年,AlexNet的成功标志着CNN在计算机视觉领域的广泛应用。AlexNet在ImageNet大规模视觉识别挑战赛中获得了巨大的成功,将错误率大幅降低,显著提高了图像分类的准确性。这一成果标志着深度学习,尤其是CNN在图像处理领域的主导地位。

自此之后,CNN在各种图像处理任务中,如目标检测、图像分割、人脸识别等领域中,均取得了突破性的进展。例如,R-CNN和YOLO等网络结构在目标检测任务中表现优异,U-Net在医学图像分割中取得了显著的成果。这些进展不仅推动了计算机视觉技术的发展,也带动了智能驾驶、医疗影像分析等实际应用的创新。

1.2 CNN的基本概念

卷积神经网络(CNN)的定义

卷积神经网络(CNN)是一种特殊类型的深度学习模型,主要用于处理具有网格结构的数据,例如图像。CNN的核心思想是通过卷积操作提取数据的局部特征,并通过层次化的结构逐步提取更高级的特征。CNN通常由以下几种主要层次组成:

  • 卷积层(Convolutional Layer):卷积层通过卷积核(滤波器)对输入数据进行卷积操作,以提取局部特征。卷积核通过滑动窗口的方式扫描整个输入图像,与图像的每个局部区域进行卷积操作,生成特征图(Feature Map)。卷积层的主要优点是能够捕捉局部特征,并减少参数数量,相比全连接层具有更强的泛化能力。

  • 激活函数(Activation Function):激活函数通常在卷积操作之后应用,以引入非线性因素,使得神经网络能够学习更加复杂的特征。常见的激活函数包括ReLU(Rectified Linear Unit)、Sigmoid和Tanh。ReLU函数因为其计算简单且能有效缓解梯度消失问题,在实际应用中最为常见。

  • 池化层(Pooling Layer):池化层用于对卷积层输出的特征图进行下采样,以减小数据的空间尺寸,同时保持重要的特征信息。常见的池化操作包括最大池化(Max Pooling)和平均池化(Average Pooling)。池化层的主要作用是减少计算量和防止过拟合。

  • 全连接层(Fully Connected Layer):全连接层将卷积层和池化层提取的特征映射到最终的输出空间,如分类结果。全连接层将所有的神经元连接到上一层的所有神经元,通过线性变换和激活函数进行最终的特征融合和决策。

CNN在深度学习中的地位

卷积神经网络(CNN)作为深度学习的核心架构之一,在许多应用领域表现出色。其优势主要体现在以下几个方面:

  • 特征自动提取:CNN能够自动学习图像中的特征,从低级特征(如边缘、纹理)到高级特征(如形状、物体),无需人工设计特征提取算法。

  • 参数共享和稀疏连接:卷积层通过卷积核共享参数,减少了模型的参数数量,提高了训练效率,同时避免了过拟合现象。

  • 空间不变性:卷积操作能够提取局部特征并保留空间结构信息,使得CNN在处理不同位置的对象时具有较好的不变性。

  • 深层次特征学习:通过深层次的网络结构,CNN能够逐层提取数据的高阶特征,从而更好地进行复杂任务的建模。

由于这些优点,CNN在图像分类、目标检测、图像分割等领域成为主流的模型架构,并不断推动计算机视觉技术的发展和应用。

1.3 研究动机与目标

研究动机

经典卷积神经网络(CNN)架构作为深度学习领域的重要组成部分,具有深远的学术价值和广泛的应用前景。随着技术的发展,新的CNN变种不断涌现,但经典CNN架构的基础知识仍然对理解和掌握这些先进模型至关重要。通过对经典CNN架构的深入研究,可以为以下几个方面提供理论支持和实践指导:

  • 理论研究:经典CNN架构的研究可以帮助学术界更好地理解深度学习模型的工作原理和优势,为进一步的理论研究奠定基础。

  • 模型优化:深入了解经典CNN架构可以为模型优化提供依据,如改进卷积操作、激活函数和池化策略,以提高模型的性能和效率。

  • 实际应用:经典CNN架构的应用在各个领域中表现突出,通过研究这些架构可以为实际应用中的技术选择和系统设计提供参考。

研究目标

本文旨在深入探讨经典卷积神经网络(CNN)架构,通过详细分析其核心组件和变种模型,达到以下目标:

  • 全面阐述经典CNN架构的基本原理和结构:从卷积层、激活函数、池化层到全连接层,详细介绍每个组件的功能和实现方法。

  • 解析经典CNN模型的演进和优化:深入分析LeNet-5、AlexNet、VGGNet、GoogLeNet、ResNet等经典模型的设计思想和创新点,探讨其在实际应用中的效果和贡献。

  • 提供技术实现和优化建议:通过丰富的Python代码示例,展示经典CNN架构的具体实现,帮助读者理解模型的实际应用和优化策略。

  • 促进学术交流和技术发展:通过对经典CNN架构的系统性研究,为相关领域的学术研究和技术发展提供有价值的参考,推动深度学习技术的进一步进步。

第二章:卷积神经网络的基本组成部分

2.1 卷积层(Convolutional Layer)

卷积层的理论知识

卷积层是卷积神经网络(CNN)的核心组成部分,其主要作用是对输入数据(例如图像)应用卷积操作,以提取特征。卷积操作通过卷积核(或滤波器)在输入数据上滑动,计算局部区域的加权和,从而捕捉局部特征。

卷积操作的数学原理

  1. 卷积运算:卷积操作的核心是对输入数据和卷积核进行逐元素乘法后求和。对于二维卷积,假设输入图像为 I,卷积核为 K,则卷积操作可以表示为:

  1. 卷积核(滤波器):卷积核是一个小的矩阵,它在输入数据上滑动,通过逐元素相乘和求和操作提取特征。卷积核的大小和数量直接影响特征图的生成。

  2. 特征图:卷积操作的输出称为特征图(Feature Map),它表示了输入数据在特定卷积核下的激活情况。

  3. 步幅(Stride):步幅定义了卷积核在输入数据上滑动的步长。较大的步幅可以减少特征图的尺寸,而较小的步幅可以增加特征图的尺寸。

  4. 填充(Padding):为了控制特征图的尺寸,通常在输入数据的边界添加填充。填充可以是零填充(Zero Padding),用于保持特征图尺寸的稳定。

卷积层的作用

  • 局部感知:通过局部感知机制,卷积层可以捕捉输入数据中的局部特征。
  • 权重共享:卷积核的参数在整个输入数据上共享,从而减少模型的参数数量,提高计算效率。
  • 特征提取:卷积层通过不同的卷积核提取不同的特征,如边缘、纹理等。

卷积运算的实现

import torch
import torch.nn as nn
import torch.nn.functional as F

# 定义一个简单的卷积操作
class SimpleConvNet(nn.Module):
    def __init__(self):
        super(SimpleConvNet, self).__init__()
        # 定义一个卷积层,输入通道数1,输出通道数6,卷积核大小3x3
        self.conv1 = nn.Conv2d(1, 6, kernel_size=3)
        
    def forward(self, x):
        x = self.conv1(x)
        return x

# 初始化网络并输入一个4x4的张量
net = SimpleConvNet()
input_data = torch.randn(1, 1, 4, 4)
output_data = net(input_data)
print(output_data)
2.2 激活函数(Activation Function)

激活函数的理论知识

激活函数在神经网络中引入非线性,从而使网络能够学习和表示复杂的非线性关系。激活函数的选择对网络的性能和训练效果有着重要影响。

常见激活函数

ReLU 激活函数的应用

class ReLUNet(nn.Module):
    def __init__(self):
        super(ReLUNet, self).__init__()
        self.conv1 = nn.Conv2d(1, 6, kernel_size=3)
        self.conv2 = nn.Conv2d(6, 16, kernel_size=3)
        self.fc1 = nn.Linear(16*4*4, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)

    def forward(self, x):
        x = F.relu(self.conv1(x))
        x = F.relu(self.conv2(x))
        x = x.view(-1, 16*4*4)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

# 测试网络
net = ReLUNet()
input_data = torch.randn(1, 1, 8, 8)
output_data = net(input_data)
print(output_data)
2.3 池化层(Pooling Layer)

池化层的理论知识

池化层主要用于对特征图进行下采样,减少数据的空间维度,从而降低计算复杂度和防止过拟合。池化层通过对局部区域进行汇聚操作,保留特征图中的重要信息。

池化操作的种类

  1. 最大池化(Max Pooling)

    • 定义:最大池化操作选择每个局部区域中的最大值。公式为:

      MaxPooling(x)=max⁡(xi,j)\text{MaxPooling}(x) = \max(x_{i,j})MaxPooling(x)=max(xi,j​)
    • 优点:能够保留特征图中的重要特征,同时减少特征图的尺寸。

  2. 平均池化(Average Pooling)

    • 定义:平均池化操作计算每个局部区域的平均值。公式为:

      AveragePooling(x)=1n∑i,jxi,j\text{AveragePooling}(x) = \frac{1}{n} \sum_{i,j} x_{i,j}AveragePooling(x)=n1​i,j∑​xi,j​
    • 优点:通过平均化局部区域的值,能减少特征图的噪声。

池化层的作用

  • 下采样:池化操作通过减少特征图的尺寸,降低计算复杂度。
  • 特征选择:池化操作通过选择局部区域中的最大值或平均值,保留重要特征。
  • 平移不变性:池化操作能够提高特征图对输入数据平移的鲁棒性。

最大池化操作

class MaxPoolNet(nn.Module):
    def __init__(self):
        super(MaxPoolNet, self).__init__()
        self.conv1 = nn.Conv2d(1, 6, kernel_size=3)
        self.pool = nn.MaxPool2d(kernel_size=2, stride=2)

    def forward(self, x):
        x = F.relu(self.conv1(x))
        x = self.pool(x)
        return x

# 测试网络
net = MaxPoolNet()
input_data = torch.randn(1, 1, 8, 8)
output_data = net(input_data)
print(output_data)
2.4 全连接层(Fully Connected Layer)

全连接层的理论知识

全连接层是神经网络中一种重要的层,其作用是将前一层的所有神经元连接到当前层的每一个神经元。这种连接方式允许全连接层进行高维度的特征组合。

全连接层的特点

  1. 权重矩阵:全连接层的每个神经元与前一层的所有神经元都有连接,这些连接的权重被组成一个矩阵。公式:

    2.特征组合:全连接层通过对特征进行线性组合,能够学习到数据中的复杂特征。

    3.高维特征映射:全连接层可以将低维特征映射到高维空间,增强模型的表达能力。

全连接层的作用

  • 决策融合:全连接层能够将来自不同卷积层和池化层的特征融合,进行最终的决策。
  • 分类:在网络的最后阶段,全连接层通常用于进行分类任务,将提取的特征映射到类别标签。

全连接层的实现

class FullyConnectedNet(nn.Module):
    def __init__(self):
        super(FullyConnectedNet, self).__init__()
        self.conv1 = nn.Conv2d(1, 6, kernel_size=3)
        self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
        self.fc1 = nn.Linear(6*3*3, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)

    def forward(self, x):
        x = F.relu(self.conv1(x))
        x = self.pool(x)
        x = x.view(-1, 6*3*3)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

# 测试网络
net = FullyConnectedNet()
input_data = torch.randn(1, 1, 8, 8)
output_data = net(input_data)
print(output_data)
2.5 归一化技术(Normalization Techniques)

归一化技术的理论知识

归一化技术用于改善神经网络训练的稳定性和加速收敛速度。通过对网络中的激活值或梯度进行归一化,能够有效减轻梯度消失和梯度爆炸问题。

常见归一化技术

归一化技术的作用

  • 稳定训练:归一化能够有效减轻梯度消失和梯度爆炸问题,提高训练的稳定性。
  • 加速收敛:通过规范化输入数据的分布,加速模型的训练收敛速度。
  • 减少依赖:归一化技术能够减少对权重初始化的依赖,提高网络的泛化能力。

批量归一化(Batch Normalization)示例

class BatchNormNet(nn.Module):
    def __init__(self):
        super(BatchNormNet, self).__init__()
        self.conv1 = nn.Conv2d(1, 6, kernel_size=3)
        self.bn1 = nn.BatchNorm2d(6)
        self.conv2 = nn.Conv2d(6, 16, kernel_size=3)
        self.bn2 = nn.BatchNorm2d(16)

    def forward(self, x):
        x = F.relu(self.bn1(self.conv1(x)))
        x = F.relu(self.bn2(self.conv2(x)))
        return x

# 测试网络
net = BatchNormNet()
input_data = torch.randn(1, 1, 8, 8)
output_data = net(input_data)
print(output_data)

第三章:经典CNN架构的演进与分析

3.1 LeNet-5
INPUT => CONV => POOL => CONV => POOL => FC => FC => OUTPUT

LeNet-5网络结构实现

class LeNet5(nn.Module):
    def __init__(self):
        super(LeNet5, self).__init__()
        self.conv1 = nn.Conv2d(1, 6, kernel_size=5)
        self.conv2 = nn.Conv2d(6, 16, kernel_size=5)
        self.fc1 = nn.Linear(16*4*4, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)

    def forward(self, x):
        x = F.relu(self.conv1(x))
        x = F.max_pool2d(x, 2)
        x = F.relu(self.conv2(x))
        x = F.max_pool2d(x, 2)
        x = x.view(-1, 16*4*4)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return F.log_softmax(x, dim=1)

# 测试网络
net = LeNet5()
input_data = torch.randn(1, 1, 32, 32)
output_data = net(input_data)
print(output_data)
3.2 AlexNet
INPUT => CONV => POOL => CONV => POOL => CONV => CONV => CONV => POOL => FC => FC => FC => OUTPUT

AlexNet的主要创新点包括:

  1. 使用了ReLU激活函数,提高了训练效率。
  2. 引入了Dropout技术,有效缓解了过拟合问题。
  3. 利用GPU并行计算,大大加快了训练速度。
  4. 数据增强技术,如翻转、裁剪等,增加了训练数据的多样性。

AlexNet网络结构实现

class AlexNet(nn.Module):
    def __init__(self):
        super(AlexNet, self).__init__()
        self.conv1 = nn.Conv2d(3, 96, kernel_size=11, stride=4, padding=2)
        self.conv2 = nn.Conv2d(96, 256, kernel_size=5, stride=1, padding=2)
        self.conv3 = nn.Conv2d(256, 384, kernel_size=3, stride=1, padding=1)
        self.conv4 = nn.Conv2d(384, 384, kernel_size=3, stride=1, padding=1)
        self.conv5 = nn.Conv2d(384, 256, kernel_size=3, stride=1, padding=1)
        self.fc1 = nn.Linear(256*6*6, 4096)
        self.fc2 = nn.Linear(4096, 4096)
        self.fc3 = nn.Linear(4096, 1000)

    def forward(self, x):
        x = F.relu(self.conv1(x))
        x = F.max_pool2d(x, 3, 2)
        x = F.relu(self.conv2(x))
        x = F.max_pool2d(x, 3, 2)
        x = F.relu(self.conv3(x))
        x = F.relu(self.conv4(x))
        x = F.relu(self.conv5(x))
     

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

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

相关文章

7.添加购物车以及完善导航条跳转

添加购物车 一、引言二、前端2.1引入轻组件2.2为图片添加点击事件2.3创建addShoppingCart函数 三、后端四、运行效果五、导航条跳转 一、引言 在前几篇文章中,我们一步一步慢慢的实现了项目的建立,从数据库获取数据显示在页面,商品大图查看&…

C++ JAVA源码 HMAC计算 openssl 消息认证码计算 https消息防篡改 通信安全

签名和验签 把所有消息按顺序合并成一条信息,对这个信息用密钥进行签名。 签名信息通过 HTTP 头 Sign 传递,没有携带签名或者签名验证不通过的请求,将会被认为异常请求,并返回相应 code 码。 校验方法:根据 http请求…

国产3A游戏《黑神话悟空》中AI绘画技术的运用与探索

导语:近年来,我国游戏产业不断发展,越来越多的国产游戏开始尝试运用AI技术,以提升游戏品质。其中,国产3A游戏《黑神话悟空》便在原画设计过程中,巧妙地运用了AI绘画技术。本文将带你了解《黑神话悟空》如何…

【计算机三级-数据库技术】操作题大题(第六套)

第六套操作题 第46题 假定要建立一个学校科研项目管理的信息系统,需要管理如下信息: 教师:教师编号、教师姓名; 项目:项目编号、项目名称、资助额: 学生:学生编号、学生姓名、学位&#xff0c…

Vodafone 推出了与 Wi-Fi 竞争的基于树莓派私人5G技术

随着全球5G网络的逐步推出,在其过程中遇到了可预见的起起伏伏,并且蜂窝技术也开始进入另一个无线技术 Wi-Fi ,并且已经占据的市场。私有5G网络(即个人或公司建立自己的全设施蜂窝网络)如今正在寻找曾经属于Wi-Fi的唯一…

AR 眼镜之-系统应用音效-实现方案

目录 📂 前言 AR 眼镜系统版本 系统应用音效 1. 🔱 技术方案 1.1 技术方案概述 1.2 实现方案 1)初始化 2)播放音效 3)释放资源 2. 💠 播放音效 2.1 静音不播放 2.2 获取音效默认音量 3. ⚛️ …

QTCreator学习

1.新建程序 2. 设置项目名称 3. Build System选择qmake,若选择cmake则只会产生CmakeLists文件,不会产生pro文件。 4.Base class选择QDialog,表示该类继承于QDialog类 5.套件选择MinGW 32bit,取消掉其他的。 6. 双击ui文件,拖动可添加工具。 7.点击左…

C++模拟实现priority_queue(优先级队列)

一、priority_queue的函数接口 从上图我们可以看出&#xff0c; priority_queue也是一个容器适配器&#xff0c;我们使用vector容器来模拟实现priority_queue。 namespace bit{#include<vector>#include<functional>template <class T, class Container vector…

iOS App上架审核被拒——2.3.3 - Performance - Accurate Metadata

iOS上架审核被拒——Guideline 2.3.3 - Performance - Accurate Metadata 噢&#xff0c;又被拒了… 文章目录 iOS上架审核被拒——Guideline 2.3.3 - Performance - Accurate Metadata被拒原因解决 被拒原因 大概翻译了下&#xff1a;预览图问题&#xff0c;只因某张预览图加了…

正则表达式备查

一、常用 符号内容\将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如&#xff0c;“n”匹配字符“n”。“\n”匹配换行符。序列“\”匹配“\”&#xff0c;“(”匹配“(”。^匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性&#xff0c;^ 还…

CSS知识点详解:display+float

display&#xff1a;浮动 1.block&#xff1a;使元素呈现为块级元素&#xff0c;可设置宽高 display: block; 特点&#xff1a;使元素呈现为块级元素&#xff0c;即该元素会以新行开始&#xff0c;占据整行的宽度&#xff0c;即使其宽度未满。 例子&#xff1a; 2.inline&a…

答题小程序的轮播图管理与接入获取展示实现

实现了答题小程序的轮播图管理&#xff0c;包括上传图片、设置轮播图、操作上下线等功能&#xff0c;可用于管理各类答题小程序的轮播图。 轮播图前端接入代码 答题小程序内使用以下代码接入轮播图&#xff1a; WXML&#xff1a; <view style"width: 100%"> …

继承(下)【C++】

文章目录 子类继承父类之后&#xff0c;子类的默认成员函数的变化构造函数编译器自动生成的构造函数程序员手动写的构造函数 拷贝构造编译器自动生成的拷贝构造函数程序员手动写的拷贝构造函数 赋值重载编译器自动生成的赋值重载程序员手动写的赋值重载 析构函数 继承与友元菱形…

ISO 26262中的失效率计算:IEC 61709-Clause 17_Switches and push-buttons

概要 IEC 61709是国际电工委员会&#xff08;IEC&#xff09;制定的一个标准&#xff0c;即“电子元器件 可靠性 失效率的基准条件和失效率转换的应力模型”。主要涉及电学元器件的可靠性&#xff0c;包括失效率的基准条件和失效率转换的应力模型。本文介绍IEC 61709第十七章&…

Linux安装并配置Hadoop

目录 一、安装并配置JDK二、安装并配置Hadoop三、安装过程中遇到的问题总结 一、安装并配置JDK Linux上一般会安装Open JDK,关于OpenJDK和JDK的区别&#xff1a;http://www.cnblogs.com/sxdcgaq8080/p/7487369.html 准备Open JDK 1.8 查询可安装的java版本 yum -y list jav…

C语言第17篇

1.在C语言中,全局变量的存储类别是_________. A) static B) extern C) void D) register 提示&#xff1a;extern adj.外来的 register n.登记表&#xff0c;v.登记 提示与本题无关 2.在一个C源程序文件中,要定义一个只允许本源文件中所有函数使用的全局变…

【经典算法】BFS_最短路问题

目录 1. 最短路问题介绍2. 算法原理和代码实现(含题目链接)1926.迷宫中离入口最近的出口433.最小基因变化127.单词接龙675.为高尔夫比赛砍树 3. 算法总结 1. 最短路问题介绍 最短路径问题是图论中的一类十分重要的问题。本篇文章只介绍边权为1(或边权相同)的最简单的最短路径问…

ant design pro 中用户的表单如何控制多个角色

ant design pro 如何去保存颜色ant design pro v6 如何做好角色管理ant design 的 tree 如何作为角色中的权限选择之一ant design 的 tree 如何作为角色中的权限选择之二ant design pro access.ts 是如何控制多角色的权限的 看上面的图片 当创建或编辑一个用户时&#xff0c;…

自带灭火电池?深蓝SL03托底事故揭秘

近日&#xff0c;网络上的一段热传视频&#xff0c;让不少网友看得先是惊心动魄&#xff0c;然后却又啧啧称奇。 该视频显示&#xff0c;8月18日晚上19点28分&#xff0c;一辆深蓝SL03在行驶中意外遭遇严重托底事故&#xff0c;车辆瞬间腾空跳跃&#xff0c;紧接着底盘出现明火…

禁止浏览器默认填充密码 vue

禁止浏览器默认填充密码会和我的样式冲突 所以禁止 第一种&#xff1a; 通过给表单元素添加 autocomplete"off" 属性&#xff0c; 可以防止浏览器自动填充表单中的账号和密码。可以在 input 标签或整个 form 标签上使用&#xff1a; <template><a-form&g…