目录
一、知识点学习
Part1 深度学习是什么?
深度学习(Deep Learning)是机器学习的一个分支,用神经网络模拟人脑的学习方式,从大量数据中自动学习和提取特征,进行预测和决策。
深度学习依赖于多层神经网络,每一层神经元接受前一层神经元的输出,并通过权重和激活函数进行计算,传递到下一层神经元。
神经元模型——模拟生物神经元行为的计算模型
一个简单的神经元模型包括输入、权重、激活函数和输出。
-
输入就像神经元 树突 接收到的信号,
-
权重则像是调整信号强度的小调节器,
-
激活函数决定是否产生输出,
-
而输出则是传递给其他神经元的信号。
神经网络——神经元模型的组合
深度学习是由这些神经元模型层层堆叠起来的复杂结构。
深度将它们按照一定的层次连接起来,形成一个庞大的网络。这个网络的最底层接收输入数据,比如图片或文本,然后通过每一层的处理,逐渐提取出更高级别的特征,最后在顶层输出结果,比如识别图片中的物体或理解文本的含义。
这些基本的神经元模型组合起来,形成了多层次的网络结构,称之为神经网络。
虽然深度学习成就显著,但深度学习并不能解决所有问题。
Part2 深度学习如何训练的?
深度学习能够通过大量的数据和反复的训练来自动调整这些小开关(权重)的设置,使得整个网络能够越来越准确地完成特定的任务。
梯度下降算法
梯度下降是一种优化算法,用于最小化函数。原理是损失函数的梯度指向函数增长最快的方向。因此,如果我们希望减少损失函数的值,我们就需要沿着梯度的反方向调整模型的参数,让每次迭代都朝着模型参数朝着减少损失的方向移动。
深度学习训练过程
在深度学习中,我们希望最小化损失函数,即模型预测值与真实值之间的差异。
在训练循环中,我们首先加载一小批量数据,将其输入到神经网络中进行前向传播,计算出网络的输出。然后,我们使用损失函数来计算当前批次的损失,并通过反向传播算法计算损失函数关于每个参数的梯度。这些梯度告诉我们如何调整权重和偏置以减少损失。
当数据集非常大时,一次性处理所有数据可能会导致内存不足或计算过于缓慢。我们可以通过将数据分成小批量,更频繁地更新模型参数,使训练过程更加高效。
Pytorch训练代码
- 首先,需要准备一批图片数据(
train_loader
)和这些图片对应的正确标签(target
)。 - 在开始训练之前,将模型设置为训练模式(
model.train()
),这样模型就知道现在是学习时间了。 - 接着,开始喂给模型图片数据,并让它尝试预测这些图片的内容。
- 模型会基于它目前的学习给出预测结果(
output
),而会计算这些预测结果与实际标签之间的差异,这个差异就是损失(loss
)。 - 为了让模型学会准确预测,需要指出它的错误,并更新它的内部参数来减少这些错误(通过
loss.backward()
和optimizer.step()
)。这个过程就像是模型在自我调整,以便在下一次遇到类似图片时能够做出更准确的预测。
def train(train_loader, model, criterion, optimizer, epoch):
# 将模型设置为训练模式
model.train()
end = time.time()
# 遍历数据加载器
for i, (input, target) in enumerate(train_loader):
# 将数据和标签移动到 GPU
input = input.cuda(non_blocking=True)
target = target.cuda(non_blocking=True)
# 前向传播,计算模型对输入数据的预测
output = model(input)
# 计算预测输出和目标标签之间的差异
loss = criterion(output, target)
#清空(重置)之前的梯度
optimizer.zero_grad()
# 反向传播,计算损失相对于模型参数的梯度
loss.backward()
# 根据计算得到的梯度更新模型的参数
optimizer.step()
Part3 深度学习与迁移学习
迁移学习是一种机器学习技术,它将已在一个任务上学到的知识(如模型参数、特征表示等)应用到另一个相关任务上。这种技术特别有用,因为它允许模型在数据稀缺的情况下也能表现出色。
通常使用在大规模数据集上预训练的模型作为起点,例如在ImageNet数据集上预训练的卷积神经网络(CNN)。在预训练模型的基础上,使用少量标记数据对模型进行微调,以适应新任务。
ImageNet介绍
ImageNet 包含超过1400万张注释过的图像,这些图像分布在超过2.2万个类别中。它的规模之大使得它成为深度学习模型训练和评估的理想数据集。ImageNet 数据集中的图像包含了各种场景、物体、背景和遮挡情况,这为算法提供了极大的挑战。这种多样性使得在 ImageNet 上训练的模型能够学习到鲁棒的特征,从而在现实世界应用中表现良好。(ImageNet网址)
ImageNet 提供了一个标准的性能基准,研究者可以通过在 ImageNet 上的表现来比较不同模型的性能。此外许多在 ImageNet 上预训练的模型被用作迁移学习的起点,这些模型在新任务上通常表现出色。
迁移学习的实现方法
微调(Fine-tuning)是深度学习中一种有效的迁移学习策略,它允许我们利用预训练模型对特定任务进行优化。其基本原理是,首先在一个大规模的数据集上预训练一个深度学习模型,捕捉通用的特征表示,然后将这个预训练模型作为起点,在目标任务上进行进一步的训练以提升模型的性能。
微调步骤:
-
替换模型的输出层,以匹配目标任务的类别数量和类型。例如,如果目标任务是图像分类,而预训练模型原本用于不同的分类任务,我们就需要将模型的最后一层替换成适合新任务类别数的新层。
-
【可做可不做】冻结预训练模型中的大部分层,这样可以防止在微调过程中这些层学到的通用特征被破坏。通常情况下,只对模型的最后一部分层进行解冻,这些层负责学习任务特定的特征。
-
使用目标任务的数据集对模型进行训练。在这个过程中,我们会用梯度下降等优化算法更新模型的权重,从而使模型能够更好地适应新的任务。训练时,可能会使用比预训练时更低的学习率,以避免过度拟合目标数据集。
Part4 常见的图像分类网络
AlexNet
AlexNet是一种具有深远影响的卷积神经网络(CNN)架构,包含八个层次结构,前五个是卷积层,其中一些后跟最大池化层,最后三个是全连接层。
具体结构如下:
-
卷积层:AlexNet的前五个层次都是卷积层,每个卷积层后面跟着一个ReLU激活函数,以引入非线性。这些卷积层旨在提取图像的特征。
-
局部响应归一化(LRN):在某些卷积层后使用了局部响应归一化,这是一种提高模型泛化能力的正则化方法。
-
最大池化层:在部分卷积层之后使用最大池化层来降低特征的空间维度,减少计算量和过拟合的风险。
-
全连接层:网络的最后三个层次是全连接层,其中最后两个全连接层后跟有Dropout,以进一步防止过拟合。
-
输出层:最后一个全连接层后是线性层,然后是softmax激活函数,输出1000个类别上的概率分布。
ResNet
ResNet(残差网络)是一种深度卷积神经网络架构,由微软研究院的研究员何恺明等人提出。它的主要创新点是引入了残差学习的概念,允许训练非常深的网络,从而缓解了深度神经网络训练中的梯度消失和梯度爆炸问题。
ResNet的核心是残差块(residual block),网络通过堆叠这些残差块来构建。一个基本的残差块包含以下几部分:
-
跳跃连接(Skip Connections):这是ResNet最关键的创新,通过跳跃连接,输入可以直接绕过一个或多个层传到输出,输出是输入与这些层的输出的加和。这种结构使得网络可以学习输入到输出的残差,而不是直接学习输出,这有助于缓解梯度消失问题。
-
卷积层:残差块内部包含多个卷积层,通常使用小尺寸的卷积核(如3x3),并且通常会有批量归一化(Batch Normalization)和ReLU激活函数。
-
池化层:在某些残差块之间会插入最大池化层来降低特征图的空间维度。
ResNet能够成功训练超过100层的网络,这在之前是不可能实现的。
EfficientNet
EfficientNet是一种高效的卷积神经网络(CNN)架构,它通过一种新颖的网络缩放方法来提升模型的性能和效率。EfficientNet 的核心是其 compound scaling 方法,该方法通过一个复合系数统一缩放网络的深度、宽度和分辨率。在过去,网络缩放通常是通过任意选择深度、宽度或分辨率的增加来实现的,而EfficientNet的方法则是通过一系列固定的缩放系数来同时增加这三个维度。例如,如果想要使用更多的计算资源,可以通过增加网络深度、宽度和图像大小的特定比例来实现,其中的比例系数是通过在小型模型上进行小规模的网格搜索确定的。
EfficientNet的复合缩放方法的直觉在于,如果输入图像更大,网络就需要更多的层来增加感受野,以及更多的通道来捕捉更细粒度的模式。EfficientNet的架构本质上并不复杂。基本的EfficientNet-B0网络作为后续缩放的基础。作者指出,他们使用NAS来构建基本网络,利用了多目标搜索来同时优化网络的准确性和计算效率。
二、导图总结
三、心得体会
目前,该部分内容仍需时间细细梳理与内化,以确保深刻理解。就代码执行而言,基本流畅无阻,但在微调参数的过程中,我还是感觉到有一丝迷茫,仿佛踏入了一场精妙的‘炼丹’之旅。这提醒我,掌握调参的艺术非一日之功,需持续磨砺,勤于实践,方能日益精进。