神经网络与深度学习课程报告(三)

一、经典卷积神经网络结构

1. LeNet-5网络

LeNet-5是Yann LeCun于1998年提出的第一个成功应用于手写数字识别的卷积神经网络,其结构特点包括:

网络结构:
输入层(32×32) → C1卷积层(6@28×28) → S2池化层(6@14×14) → C3卷积层(16@10×10) → S4池化层(16@5×5) → C5全连接层(120) → F6全连接层(84) → 输出层(10)

创新点:

  • 首次将卷积、池化和全连接层结合;

  • 使用平均池化而非最大池化;

  • 采用Sigmoid/tanh而非ReLU激活函数。

局限性:

  • 网络较浅(约6万参数),无法处理复杂视觉任务。

2. AlexNet网络

AlexNet在2012年ImageNet竞赛中取得突破,主要特点包括:

  • 网络结构: 5个卷积层 + 3个全连接层,约6000万参数。

  • 关键改进:

    • 使用ReLU激活函数解决梯度消失问题;

    • 引入Dropout防止过拟合;

    • 采用最大池化代替平均池化;

    • 使用双GPU并行训练策略;

    • 数据增强:随机裁剪、水平翻转、光照变化等。

3. VGG-16网络

VGG-16通过使用小卷积核(3×3)和增加网络深度获得更好性能:

  • 网络结构: 13个卷积层 + 3个全连接层,约1.38亿参数。

  • 特点:

    • 所有卷积层使用相同超参数,结构规整;

    • 随网络深入,特征图尺寸减小而通道数增加;

    • 证明了深度对网络性能的重要性。

4. 残差网络(ResNet)

ResNet通过残差连接解决了深层网络训练难题:

  • 核心思想: 引入跳跃连接(shortcut connection),使网络能够学习残差 F(x)=H(x)−xF(x) = H(x) - xF(x)=H(x)−x。

  • 优势:

    • 有效缓解梯度消失问题;

    • 可训练极深层网络(如ResNet-152);

    • 训练误差随深度增加而降低。


二、深度学习视觉应用

1. 常用数据集

  • MNIST: 手写数字识别,包含60000个训练样本和10000个测试样本,28×28灰度图。

  • CIFAR-10: 10类物体识别,包含60000个32×32彩色图像,分为50000个训练图像和10000个测试图像。

  • PASCAL VOC: 20类物体检测与分割,含边界框和像素级标注。

  • MS COCO: 包含80类物体,33万图像,150万个实例,支持检测、分割等任务。

  • ImageNet: 1400万图像,2万类别,ILSVRC竞赛基准数据集。

2. 评价指标

  • 精确率(Precision): Precision=TPTP+FP\text{Precision} = \frac{TP}{TP + FP}Precision=TP+FPTP​

  • 召回率(Recall): Recall=TPTP+FN\text{Recall} = \frac{TP}{TP + FN}Recall=TP+FNTP​

  • P-R曲线: 展示不同阈值下Precision与Recall的变化关系。

  • AP(Average Precision): P-R曲线下面积,衡量单类别检测性能。

  • mAP(mean AP): 多类别AP的平均值,综合评估指标。

3. 目标检测与YOLO算法

YOLO基本思想

YOLO(You Only Look Once)算法将目标检测任务转化为回归问题,通过一次前向传播完成目标的位置预测和类别分类。

网络结构:
输入448×448图像,划分为7×7网格。每个网格预测2个边界框以及20类目标的概率,最终输出7×7×30的张量。

损失函数:
包含位置误差、置信度误差和分类误差三部分。

非极大值抑制(NMS):
去除冗余检测框,保留最佳预测。

YOLO v3改进
  • 骨干网络: DarkNet-53,结合残差连接,提升性能。

  • 多尺度预测: 在13×13、26×26、52×52三个尺度上进行预测。

  • Anchor Boxes: 使用K-means聚类得到的9个先验框,改进检测精度。

  • 损失函数: 引入CIoU损失,考虑位置、长宽比和中心点距离。

4. 语义分割与全卷积网络(FCN)

FCN通过将传统CNN的全连接层替换为卷积层,实现了像素级别的图像分割。常用的结构包括编码器-解码器架构,结合下采样和上采样。

  • DeepLab系列: 利用空洞卷积(Dilated Convolution)和条件随机场(CRF)后处理,提升了分割精度。

三、代码示例

import torch
from torch import nn

class YOLOv1(nn.Module):
    def __init__(self, S=7, B=2, C=20):
        super(YOLOv1, self).__init__()
        
        # 卷积层部分
        self.conv_layers = nn.Sequential(
            nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3),
            nn.LeakyReLU(0.1),
            nn.MaxPool2d(2, 2),
            nn.Conv2d(64, 192, kernel_size=3, padding=1),
            nn.LeakyReLU(0.1),
            nn.MaxPool2d(2, 2),
            nn.Conv2d(192, 128, kernel_size=1),
            nn.LeakyReLU(0.1),
            nn.Conv2d(128, 256, kernel_size=3, padding=1),
            nn.LeakyReLU(0.1),
            nn.MaxPool2d(2, 2),
            nn.Conv2d(256, 512, kernel_size=3, padding=1),
            nn.LeakyReLU(0.1),
            nn.Conv2d(512, 1024, kernel_size=3, padding=1),
            nn.LeakyReLU(0.1),
            nn.MaxPool2d(2, 2)
        )
        
        # 全连接层部分
        self.fc_layers = nn.Sequential(
            nn.Flatten(),
            nn.Linear(1024 * S * S, 4096),
            nn.LeakyReLU(0.1),
            nn.Linear(4096, S * S * (B * 5 + C))  # S * S * (B * 5 + C) 是网络的输出尺寸
        )
        
    def forward(self, x):
        # 通过卷积层
        x = self.conv_layers(x)
        
        # 通过全连接层
        x = self.fc_layers(x)
        
        # 输出为7x7的网格,每个网格预测2个边界框和20类物体
        return x.reshape(-1, 7, 7, 30)  # 7x7的网格,每个网格有2个边界框,每个框有5个参数 + 20个类别

# 创建YOLO模型实例
model = YOLOv1(S=7, B=2, C=20)
print(model)

四、总结

通过对卷积神经网络(CNN)及目标检测算法YOLO的学习,我对神经网络的演变及其在视觉任务中的应用有了更加深刻的理解。YOLO的“一步法”检测与传统的两步法相比,在检测速度和效率上具有显著优势,尤其适用于实时目标检测任务。通过实践中的代码实现,进一步加深了对理论内容的理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值