【CV夏令营】Task 2

写在前面

111

Part 2:深度学习的训练

梯度下降算法

原理

损失函数的梯度指向函数增长最快的方向

img

训练过程
  • 首先加载一小批量数据,将其输入到神经网络中进行前向传播,计算出网络的输出
  • 然后使用损失函数来计算当前批次的损失,并通过反向传播算法计算损失函数关于每个参数的梯度。
  • 梯度→如何调整权重和偏置以减少损失。
  • 当数据集非常大时,一次性处理所有数据可能会导致内存不足或计算过于缓慢。通过将数据分成小批量,可以更频繁地更新模型参数,这使得训练过程更加高效

Pytorch训练代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
'''
事先准备:
一批图片数据(通过train_loader)和这些图片对应的正确标签(target)
'''
def train(train_loader, model, criterion, optimizer, epoch):

# switch to train mode 将模型设置为训练模式
model.train()

end = time.time()
for i, (input, target) in enumerate(train_loader):
'''给模型喂图片数据,让它尝试预测这些图片的内容'''
input = input.cuda(non_blocking=True)
target = target.cuda(non_blocking=True)

# compute output
output = model(input) # 预测结果
loss = criterion(output, target) # 预测结果与实际标签之间的差异

# -------更新内部参数来减少错误|模型自我调整------
optimizer.zero_grad()
loss.backward()
optimizer.step()
  • 总结:(图像|文本|音频数据)的深度学习训练步骤
    • 训练开始前,对数据进行加载、预处理和分割
    • 涉及到数据加载器。其将数据集分成小批量,确保数据在训练过程中被正确地处理
    • 训练代码包括:前向传播 | 计算损失 | 反向传播 | 参数更新
    • 这个过程会重复进行多轮(epoch),直到模型性能达到预期目标

Part 3:深度学习与迁移学习

概念

  • 迁移学习是一种机器学习技术,它将已在一个任务上学到的知识(如模型参数、特征表示等)应用到另一个相关任务上。这种技术特别有用,因为它允许模型在数据稀缺的情况下也能表现出色。
  • 通常使用在大规模数据集上预训练的模型作为起点,例如在ImageNet数据集上预训练的卷积神经网络(CNN)。在预训练模型的基础上,使用少量标记数据对模型进行微调,以适应新任务

使用到ImageNet

  • 它的规模之大使得它成为深度学习模型训练和评估的理想数据集
  • https://www.image-net.org/
  • ImageNet 数据集中的图像包含了各种场景、物体、背景和遮挡情况,这为算法提供了极大的挑战。这种多样性使得在 ImageNet 上训练的模型能够学习到鲁棒的特征

迁移学习的实现方法

微调

微调(Fine-tuning)是深度学习中一种有效的迁移学习策略,它允许我们利用预训练模型对特定任务进行优化

基本原理
  • 首先在一个大规模的数据集上预训练一个深度学习模型,捕捉通用的特征表示

  • 然后将这个预训练模型作为起点,在目标任务上进行进一步的训练以提升模型的性能

过程
  • 通常开始于选择一个在大型数据集上预训练的模型,这个预训练模型已经学到了丰富的特征表示,这些特征在广泛的领域内都是通用的
  • 接着,我们将这个预训练模型适配到新的目标任务上
    • 替换模型的输出层,以匹配目标任务的类别数量和类型
      • 例如,如果目标任务是图像分类,而预训练模型原本用于不同的分类任务,我们就需要将模型的最后一层替换成适合新任务类别数的新层
    • 【可做可不做】冻结预训练模型中的大部分层,这样可以防止在微调过程中这些层学到的通用特征被破坏。通常情况下,只对模型的最后一部分层进行解冻,这些层负责学习任务特定的特征
    • 使用目标任务的数据集对模型进行训练。在这个过程中,我们会用梯度下降等优化算法更新模型的权重,从而使模型能够更好地适应新的任务。训练时,可能会使用比预训练时更低的学习率,以避免过度拟合目标数据集
1
2
3
4
5
import timm
model = timm.create_model('resnet18', pretrained=True, num_classes=2)
"""加载一个预训练的ResNet-18模型,pretrained=True表示使用在ImageNet数据集上预训练的权重,num_classes=2表示模型的输出层被修改为有2个类别的输出,以适应二分类任务(例如区分真实和Deepfake图像)"""
model = model.cuda()
# model = model.cuda()将模型移动到GPU上进行加速

Part 4:常见的图像分类网络

  • 图像分类是计算机视觉中的一个基本任务,它涉及到将给定的图像分配到一个或多个预定义的类别中

AlexNet

  • https://en.wikipedia.org/wiki/AlexNet

  • AlexNet包含八个层次结构,前五个是卷积层,其中一些后跟最大池化层,最后三个是全连接层。具体结构如下:

    1. 卷积层:AlexNet的前五个层次都是卷积层,每个卷积层后面跟着一个ReLU激活函数,以引入非线性。这些卷积层旨在提取图像的特征。
    2. 局部响应归一化(LRN):在某些卷积层后使用了局部响应归一化,这是一种提高模型泛化能力的正则化方法。
    3. 最大池化层:在部分卷积层之后使用最大池化层来降低特征的空间维度,减少计算量和过拟合的风险。
    4. 全连接层:网络的最后三个层次是全连接层,其中最后两个全连接层后跟有Dropout,以进一步防止过拟合。
    5. 输出层:最后一个全连接层后是线性层,然后是softmax激活函数,输出1000个类别上的概率分布。

ResNet

  • https://en.wikipedia.org/wiki/Residual_neural_network
  • 主要创新点:引入了残差学习的概念,允许训练非常深的网络,从而缓解了深度神经网络训练中的梯度消失和梯度爆炸问题
  • 核心:残差块(residual block),网络通过堆叠这些残差块来构建。一个基本的残差块包含以下几部分:
    1. 跳跃连接(Skip Connections):这是ResNet最关键的创新,通过跳跃连接,输入可以直接绕过一个或多个层传到输出,输出是输入与这些层的输出的加和。这种结构使得网络可以学习输入到输出的残差,而不是直接学习输出,这有助于缓解梯度消失问题。
    2. 卷积层:残差块内部包含多个卷积层,通常使用小尺寸的卷积核(如3x3),并且通常会有批量归一化(Batch Normalization)和ReLU激活函数。
    3. 池化层:在某些残差块之间会插入最大池化层来降低特征图的空间维度。
  • ResNet有多个变种,包括ResNet-50、ResNet-101、ResNet-152等,数字代表了网络中权重层的数量。这些变种在网络的深度和宽度上有所不同,但都基于相同的残差学习架构。ResNet能够成功训练超过100层的网络,这在之前是不可能实现的

EfficientNet

  • https://paperswithcode.com/method/efficientnet
  • 是一种高效的卷积神经网络(CNN)架构,它通过一种新颖的网络缩放方法来提升模型的性能和效率。
  • 核心:其 compound scaling 方法.
    • 该方法通过一个复合系数统一缩放网络的深度、宽度和分辨率。
    • 在过去,网络缩放通常是通过任意选择深度、宽度或分辨率的增加来实现的,而EfficientNet的方法则是通过一系列固定的缩放系数来同时增加这三个维度。
      • 例如,如果想要使用更多的计算资源,可以通过增加网络深度、宽度和图像大小的特定比例来实现,其中的比例系数是通过在小型模型上进行小规模的网格搜索确定的
    • EfficientNet的复合缩放方法的直觉在于,如果输入图像更大,网络就需要更多的层来增加感受野,以及更多的通道来捕捉更细粒度的模式。
    • EfficientNet的架构本质上并不复杂。基本的EfficientNet-B0网络作为后续缩放的基础。作者指出,他们使用NAS来构建基本网络,利用了多目标搜索来同时优化网络的准确性和计算效率
  • Copyrights © 2024-2025 brocademaple
  • 访问人数: | 浏览次数:

      请我喝杯咖啡吧~

      支付宝
      微信