概述
在第 1 部分中,我们讨论了适用于文本的预训练模型的重要性及其在当今世界的相关性。大型语言模型 (LLM),尤其是 GPT-3 和随后的 GPT-3.5,已经获得了极大的欢迎,从而在 AI 讨论中引起了越来越多的关注。我们已经看到了用于构建强大 LLM 的各种预训练模型。
在第 2 部分中,我们将了解适用于图像处理的模型,这是包括人类在内的生物的一项关键能力。“视觉”是我们学习和理解周围世界的主要方式之一。
婴儿通过视觉学习,这就是计算机视觉在人工智能领域至关重要的原因。机器可以通过机器视觉与周围世界互动。图像识别模型已经超越了文本生成,现在可以生成声音和图像。甚至 GPT-4 和 Gemini 也可以进行图像识别和分析。DALLE、Midjourney 和表意文字模型等图像生成模型已经出现,OpenAI 最近推出了强大的视频生成模型 Sora。
在本部分中,我们将讨论与图像相关的预训练模型、它们的引入时间以及它们的发展历程。我们将比较这些模型,以了解它们的本质,并认识到每个模型都有其优点和缺点。例如,像 Inception 或 ResNet 这样的重型模型可能不适合移动设备上的任务。我们还将讨论这些模型中的错误百分比如何随着时间的推移而下降,以及实现这一目标所采用的理念。
与我一起踏上这段激动人心的旅程,探索图像处理预训练模型的世界!
AlexNet
2012 年,一种名为 AlexNet 的开创性深度学习模型问世,标志着数据科学和深度学习历史上的重要时刻。该模型由 Alex Krizhevsky、Ilya Sutskever 和 Geoffrey Hinton 开发,以惊人的准确率赢得了 ImageNet 大规模视觉识别挑战赛 (ILSVRC),证明了深度 CNN(卷积神经网络)能够实现高精度图像识别。
AlexNet 是一个深度神经网络,包含 8 层,其中 5 层为卷积层,3 层为全连接层。为了提高训练速度,该模型使用 ReLU 激活函数代替 sigmoid 或 tanh 函数。AlexNet 还采用了 Dropout 技术来防止过度拟合。
AlexNet 与 LeNet
在左上图中,您可以看到 LeNet 的架构。虽然与 Yann LeCun 于 1989 年首次推出的 CNN 网络略有不同,但其基础和功能相似。该 CNN 网络用于识别图像中的手写数字,并且是同类网络中第一个利用卷积层和池化层从图像中提取特征的网络。
LeNet 架构专为具有单通道(灰度)的较小图像( 28x28x1 )而设计,而 AlexNet 则专为具有三个通道的较大图像( 224×224×3)而设计。LeNet 由 2 个卷积层(具有5×5内核)组成,后面是平均池化层。相比之下,AlexNet 包含 5 个卷积层(具有各种大小的内核),后面是最大池化层。池化类型的选择取决于图像的特征和网络的目标问题。在 AlexNet 中,使用最大池化通常可以增强对重要图像特征的检测。
LeNet 使用 sigmoid 激活函数,而 AlexNet 在网络中使用 ReLU。ReLU更适合更深、更复杂的网络,因为它可以提高训练速度并防止梯度消失问题。
LeNet 模型包含三个全连接层,神经元数量较少:120、84 和 10。最后一层有10 个神经元,因为它是为识别手写数字0-9而设计的。同样,AlexNet 也有三个密集层,其中两层每层有 4096 个神经元,一层有1000 个神经元,因为它是为1000 类问题设计的。神经元数量的差异与每个网络的可区分特征和输入数据(图像)的大小有关。在像 AlexNet 这样的深度网络中使用更多神经元可以帮助网络检测更复杂的特征。
另外值得注意的是,由于模型的复杂性和防止过拟合,AlexNet 采用了Dropout之类的技术。AlexNet 是最早使用 Dropout 的 CNN 之一。而在 LeNet 中,不需要Dropout,因为它是在 Dropout 技术尚未提出时引入的。
由于 AlexNet 是最早的深度 CNN 模型之一,与我们将要研究的后期模型(例如 VGG 和 ResNet)相比,它可能存在一些限制和弱点。最显著的限制是它的深度较浅,因为在其引入时计算能力有限,无法训练更深的网络。另一点是 AlexNet 中使用了 Dropout,一方面可以增强模型稳定性,但另一方面,可能导致训练过程中有用信息的丢失。
块结构
CNN 架构使用块,即由相似且连续的层组合而成的组。使用块有助于网络更有效地提取特征,同时降低模型复杂性。
在块结构中,参数在本地共享,从而减少了模型参数的总数,从而降低了模型复杂度和内存消耗。这意味着一个块中的多个卷积层的参数不是针对每一层单独计算的,而是使用一组共享参数。由于参数在本地共享,因此会针对它们计算梯度。它们在所有卷积层上取平均值,这可以防止梯度消失。此外,这些块中经常使用 ReLU 等非线性激活函数。这些函数将不同的输入转换为非线性输出,在梯度中引起局部冲击,并防止梯度消失。
此外,不同的图像特征是分层提取的。较低层寻找边缘或角落等简单特征,而较高层寻找更复杂的特征,如图案、对象以及最终不同的图像类别。这些特征作为输入分层发送到后续层,从而提高了网络的功能和效率。如果没有这种分层结构,并且所有特征都是并行从图像中提取的,则模型可能无法检测到图像中更复杂、更有意义的特征,从而导致模型的准确性和性能下降。在后面章节中我们将看到的模型中,这些块结构使我们能够更深入地研究神经网络,从而使其更深入、更强大。
VGG(视觉几何组)
VGG 架构由大量重复的块组成。使用块的概念最初由牛津大学的视觉几何组 (VGG)于 2014 年提出。Karen Simonyan 和 Andrew Zisserman 在一篇概述其 CNN 架构的论文中提出了这一概念。
VGG 模型采用由堆叠的卷积层和池化层组成的重复块的结构。这些块按顺序排列,逐渐减小输入图像的大小并提取其特征。这种结构增强了网络的能力和深度,使其能够识别图像中更复杂的模式和特征。
该模型具有简单易懂的架构,由多个卷积层堆叠而成。每层均采用3×3的小尺寸卷积滤波器和零填充。这使模型在检测边缘等细节特征时能够实现更高的准确率。
VGG 是一种由重复层构成的卷积神经网络。上图显示了层和块结构,以不同的颜色表示。该网络由多个卷积层和池化层组成,以交替方式应用。这种安排使网络能够从图像中提取更复杂的特征。例如,VGG-16 和 VGG-19 网络分别具有 16 个和 19 个卷积层,并与池化层相结合。
VGG 的缺点
VGG 架构在整个网络中使用3×3 卷积滤波器,根据图像中的点周围的点对其进行变换。这导致整个网络中重复出现类似的信息,从而导致过多的信息冗余,增加过拟合的风险,并降低训练和执行效率。为了防止过拟合,通常使用dropout、正则化和数据增强等方法。VGG 和 AlexNet 之间的主要区别在于层数和块的结构。VGG 使用尺寸较小的卷积滤波器,使其能够检测更详细和精确的特征。最重要的是,借助 VGG 架构,我们可以更深入地渗透。请继续关注进一步的探索。
我们需要更深入地研究!
初始阶段(GoogLeNet)
谷歌研究团队于2014年推出了Inception模型,也通常称为GoogLeNet。
Inception 模型,通常也称为 GoogLeNet,是一种用于图像识别的著名而复杂的深度 CNN 模型。Inception 模型的主要结构基于“ Inception 块”的概念,该块通常由多个并行的具有不同大小和池化的卷积操作分支组成。然后,这些分支沿通道维度连接起来以形成块的输出。术语“通道维度”是指在卷积层中提取的特征图的数量。简单来说,Inception 模型通过组合来自 Inception 块不同分支的特征来生成更全面、更通用的图像特征。通道维度大小是各层的输入和输出的大小。Inception 模型中的每一层都可以应用多个卷积滤波器,并提供一组由这些滤波器表示的特征作为输出。例如,如果 Inception 模型的某一层的输入尺寸为128x32x32,则此处的通道维度将等于128。
这种设计允许网络同时提取不同尺度和抽象级别的特征,从而提高网络检测图像中模式和复杂结构的能力。Inception 通常适用于与图像检测和分类相关的任务。
初始块
GoogleNet 模型中的 Inception 模块有两个版本。
上图展示了Inception 块的“简单” Inception,它由并行运行的多个图像处理操作组成。该架构使用不同大小的卷积滤波器。神经网络是计算密集型的,因此为了减少工作量,在3×3 和 5×5卷积层之前包含一个1×1 卷积层。但是,这种方法可能存在缺点,因为增加网络深度会显著增加其复杂性和参数数量,从而导致过度拟合。此外,基本版本使用3×3 Max 池化,这有助于识别图像不同区域中的重要特征,并且是减少网络中参数数量的有效方法。这有助于缓解过度拟合。但是,选择正确的架构取决于特定的网络条件、数据类型和手头的问题。为了应对这些挑战,已经提出了一种 Inception 块的替代架构,并且被广泛使用,如下图所示。下一个模型是具有降维的 Inception 模块,您可以在图中看到它。请注意图片中的细节。
我们在此讨论的 Inception 模块版本使用了一些工具来降低计算复杂度和参数数量。为此,它在其架构中采用了1×1 卷积。1×1、3×3 和 5×5 卷积的使用顺序取决于模型设置和手头的问题。但是,通常首先应用1×1 卷积。这允许模型收集和组合来自不同通道的信息,从而提高模型的表示能力。然后,使用3×3 和 5×5 卷积进行复杂的特征提取。此外,在Max Pooling操作之后应用1×1 卷积,这有助于减少特征的空间维度并减少参数数量。这可以有效地减少计算负担和模型复杂度并防止过度拟合。
Inception 与 VGG、AlexNet
Inception 与 VGG 和 AlexNet 等流行模型的主要区别在于它们的结构和架构。Inception 使用 Inception 块,它是具有不同大小和窗口的卷积运算的组合。另一方面,VGG 和 AlexNet 由各种卷积层和池化层的组合构成。Inception 被认为是一种深度模型,而 VGG 和 AlexNet 都具有中等深度。由于 Inception 模型的复杂性很高,因此与 VGG 和 AlexNet 相比,它需要更多的计算资源。但是,这些模型之间的选择取决于所需的准确性和可用的计算资源。您现在想进入下一部分吗?
ResNet(残差网络)
在 ResNet 论文发表之前发表的一篇论文中,“Kaiming He” 认为,增加神经网络的深度并不一定能提高性能。这是因为更深的网络可能会遭受过度拟合的困扰,这是因为它们能够更快地记忆训练数据。
ResNet(残差网络)模型是一种 CNN 架构,它最早是在题为“深度残差学习用于图像识别”的论文中提出的。该论文由何凯明、张翔宇、任少卿和孙健于 2015 年发表。ResNet 论文在 2016 年的 CVPR(计算机视觉和模式识别会议)会议上发表。
ResNet 是在那篇文章之后引入的一种神经网络。它通过使用称为残差块 (Residual Blocks)的结构来解决过拟合问题,这些结构具有更深的层。这些块由两个深层 CNN 层组成,并使用快捷连接 (shortcut connections),也称为跳过连接 (skip connections)。快捷连接将信息从较低层直接传输到较高层,而不是添加新层。网络的输入通过一条称为身份路径 (Identity Path)的直接路径增强到输出层。快捷连接可防止整个网络深度中的信息丢失,并允许梯度更有效地从一层传播到另一层。梯度传播的这种改进可实现更稳定、更准确的网络训练。然后,将直接路径与附加层的输出相结合,并输入到ReLU激活等非线性操作中。
让我们看看它的结构。
随着深度神经网络深度的增加,我们面临着由于层数和参数数量过多而导致的梯度消失问题。这个问题可以通过使用 ResNet 中的残差块来解决。残差块使网络更容易训练深度模型,并减少整个网络深度的梯度消失问题。
要理解梯度消失问题,重要的是要注意反向传播过程中的梯度可能会变得不稳定。在反向传播过程中,梯度是根据损失函数(通常是误差函数)计算并更新权重的。这会导致与网络较低层相关的梯度显著下降,有时几乎为零。结果,较低层中的重要信息可能会严重减少甚至完全丢失。
为了克服梯度消失问题,通常使用残差块和批量归一化等特殊结构。这些结构显著增强了深度神经网络的稳定性和有效学习。
移动网络
MobileNet 模型是一种深度卷积神经网络,专为计算资源有限的移动设备和应用而设计。该模型于 2017 年由 Andrew G. Howard 和 Diego FGS Pinto 在他们的研究论文中首次提出。
MobileNet 模型因使用深度可分离卷积等先进技术而引人注目。该技术使 MobileNet 模型能够达到与更深层模型相当的准确度水平,同时减少参数数量和计算开销。因此,MobileNet 是资源有限的移动设备和应用程序的理想选择。
深度卷积阶段使用深度卷积滤波器分别处理每个输入通道。在逐点卷积阶段,使用1×1 卷积滤波器将从上一阶段提取的特征组合在一起。这两个阶段协同工作以减少参数数量和整体模型大小。
MobileNetV2 是 MobileNet 的改进版本,在性能和准确性方面表现出了显著的提升。这是通过增加模型中的参数数量来实现的。
MobileNetV2
MobileNetV2模型在2018年的CVPR会议上被提出,但经过多次修改后最终版本于2019年发布。
MobileNetV2 模型广泛用于需要在移动设备上进行图像检测或对象分类的应用程序和项目。该模型具有称为“倒置残差”的新块,其灵感来自 ResNet 中的残差块,但有显著差异。MobileNetV2 包含两种类型的块:步幅为 1 的残差块和用于缩小尺寸的步幅为 2 的块。术语“步幅”是指块过滤器在每个图像步骤中移动的像素数。您可以参考下图以更好地理解。
MobileNetV2 中的两种类型的块都包含三层。第一层是具有 ReLU6 激活函数的1×1 卷积。ReLU 6 是一种 ReLU 激活函数,它将负值设置为零,并将输出值限制在零到六之间。这是为了防止梯度爆炸 问题,并确保最大合适输出为 6。
对于为移动设备设计的模型,计算效率至关重要。使用 ReLU 6 代替 ReLU 不仅可以有效降低计算成本,还可以减少模型中的参数数量。这反过来又减少了训练和执行所需的容量和内存,从而加快了模型的执行速度。这有助于延长设备的电池寿命并提高能效。
下图可以观察到ReLU 6和ReLU之间的区别。
在某些情况下,当输出值超过 6 时,ReLU 6 约束可能会导致有价值的信息丢失,从而导致准确率下降,尤其是在使用非线性激活函数的模型中。使用 ReLU 6 代替 ReLU 各有利弊,具体取决于数据类型、具体问题和现有约束。
当我们使用步幅为 1 的块时,输出图像的大小与输入图像大小相同。块中的步幅为 2 会将输出图像的大小减小到输入图像大小的一半。这意味着,在步幅为 2 的情况下,过滤器每一步都会向前移动两个像素,从而缩小图像大小。这些块可以有效管理移动设备上有限的资源,同时保持可接受的检测精度。因此,MobileNetV2 被认为是该领域的首选。
残差块与倒置残差
在 ResNet 模型中,Residual Block 同时使用了直接路径和侧路径(Shortcut Connection)将输入添加到更深层的输出。然而,Inverted Residuals 架构中的 Residual Block 进行了修改。
初始层的输入要经过一个较轻的操作层,以进行初始修改和更简单的特征检测。操作层是指神经网络中执行操作或处理(例如卷积、激活、规范化等)的任何层。在倒置残差架构中使用较深的层作为操作层可以增加特征维度,因为较深的层会提取更复杂的特征和更高级的信息。为了降低维度并增加网络灵活性,采用了另一个由 1×1 卷积组成的操作层。因此,先使用较轻的层进行初始修改,然后再使用较深的层进行复杂的更改。目前
有几种基于深度神经网络的模型可用于图像识别任务,包括EfficientNet、DenseNet 和 NASNet。您可以使用 TensorFlow 或 PyTorch 等流行库来利用这些模型。这些库支持访问预先训练的模型,让您可以使用自己的数据对其进行微调或将其用于图像识别任务。
TensorFlow 和 PyTorch 中的预训练模型
上述预训练模型是图像处理领域中最重要的模型之一,可以使用 TensorFlow 或 PyTorch 库导入 Python。例如,您可以使用 ` tf.keras.applications`类在 TensorFlow 中加载预训练模型。以下代码取自keras.io网站,值得注意。
from keras.applications import MobileNet
model = MobileNet(
input_shape=None,
alpha=1.0,
depth_multiplier=1,
dropout=0.001,
include_top=True,
weights="imagenet",
input_tensor=None,
pooling=None,
classes=1000,
classifier_activation="softmax",
)
上面的代码包含用于超参数调整的可调参数。此代码允许我们在导入预训练模型后通过替换其名称来加载图像域中的预训练模型。在 PyTorch 中,您还可以使用“ torchvision.models ”类来加载预训练模型。以下代码演示了如何实现这一点。
import torch
import torchvision.models as models
# Load the pre-trained ResNet model
model = models.resnet50(pretrained=True)
# Display the architecture of the model
print(model)
提供的代码可用于访问除 MobileNet 模型之外的所有针对图像域的预训练模型。这是因为 MobileNet 模型未包含在 ` torchvision ` 库中。但是,您仍然可以使用其他库(如 ` PyTorch Hub`或外部源)来加载 MobileNet 模型并在 PyTorch 中使用它。请参阅下面的代码了解更多详细信息。
import torch
model = torch.hub.load('pytorch/vision:v0.10.0', 'mobilenet_v2', pretrained=True)
model.eval()
您可以使用给定的代码调用 MobileNet 来利用它。
我们如何针对图像任务对预训练模型进行微调?
在第 1 部分中,我们探讨了如何对预训练的文本模型进行微调。同样,我们也可以将微调应用于预训练的图像模型。该过程包括选择适合我们任务的预训练模型,然后通过添加或删除一些层对其进行自定义。正确标记我们的训练数据并确保我们的数据集足够大至关重要,因为深度神经网络需要大量数据才能有效学习。上面的代码示例演示了如何在 TensorFlow 或 PyTorch 中为特定任务加载和微调模型。
微调循环层
如果我们的模型包含像LSTM(长短期记忆)这样的循环层,那么我们必须对这些层进行微调。微调 LSTM 可以帮助处理文本和图像等序列数据。它还可以帮助生成图像标题或识别图像的各种组成部分。双向 LSTM (BiLSTM)模型是 LSTM 的扩展版本,它执行相同的任务,但考虑来自两个不同时间方向的信息。BiLSTM 可以考虑输入数据中特定点之前和之后的信息,这对于预测序列数据或理解时间序列很有用。
另一种循环网络是门控循环单元 (GRU),其功能与 LSTM 类似,但结构更简单。GRU 也用于与 LSTM 类似的任务。
此外,CNN-LSTM模型等模型将卷积神经网络 (CNN) 与 LSTM 或 GRU 等循环网络相结合。这种组合通常用于图像字幕,这是自然语言处理和计算机视觉中的重要任务。在图像字幕中,模型会生成句子,提供对图像内容的完整和准确描述。例如,如果院子里有一只狗的图像,模型会生成句子来描述重要的视觉特征,例如狗的类型及其在院子中的位置。这些只是包含循环层并用于处理图像的模型的几个示例。
调整模型后,我们可以使用可用的训练数据对其进行训练。在下一部分中,我们将讨论从头开始训练模型与使用预训练模型的区别和优势。敬请期待。
从头开始训练与微调
与从头开始相比,微调是一种不同的模型训练方法。在微调中,我们从一个预先训练的模型开始,该模型已经在 ImageNet 等大型数据集上进行过训练,并且已经独立于我们的训练数据获得了权重和参数。然后,我们使用我们的训练数据调整预先训练模型的权重和参数,而不是随机初始化权重并从头开始。
在微调时,我们使用的学习率比从头开始训练要小。这样做是为了对参数进行较小的更改,并逐渐使预训练的权重适应新数据。此外,与从头开始训练相比,训练周期数可能较少。这是因为预训练模型已经从以前的数据中学习了关键特征,通过调整模型的权重和参数,仅需几个周期就足以使其适应新数据并表现良好。
为什么我们要冻结层?
微调是一个只更新网络较高层的权重的过程,这些较高层执行更具体的任务,可能需要根据我们的训练数据集重新调整以执行新任务。我们在此过程中冻结较低层,这意味着我们不会更改它们的权重。
CNN 网络的较低层通过网络初始层的卷积滤波器提取图像的基本和原始特征,例如边缘和纹理。通过在微调过程中冻结最后几层,我们确保它们的权重保持不变。这使得模型能够保留在预训练阶段学到的宝贵知识,并适应新数据集或任务的挑战和特定特征。
这有助于保留从预训练数据中学习到的初始特征,特别是当我们的训练数据集相对较小或者我们要执行的任务与原始模型训练的任务相对相似时。
微调模型的评估
预训练模型的评估阶段类似于从头开始训练模型的过程。这涉及评估准确率、混淆矩阵和其他评估指标,例如准确率、召回率和F1 分数。但是,预训练模型通常在大型数据集(例如 ImageNet)上进行训练,然后再进行微调,这使它们能够利用一般信息和特征来识别图像中的模式。
因此,在评估预训练模型时,至关重要的是确保模型能够有效地将从预训练中学习到的信息应用于给定的任务并提供令人满意的性能。
为了使用新数据评估模型(例如,在狗图像模型的情况下),我们从互联网上下载图像。在将图像输入模型之前,我们必须通过调整图像大小、调整通道数和其他图像特征来预处理图像,以确保与初始训练期间使用的图像特征兼容。这意味着图像的特征尺寸(例如224 x 224和三个通道)应进行相应的规范化,以具有相同的尺寸和特征,从而使模型能够正确响应。
一般来说,使用预训练模型进行微调的目的是使模型能够利用在给定任务中以高精度对大数据集进行预训练而学到的信息和特征,从而比从头开始训练模型获得更好的性能。
结论
在第 2 部分中,我们广泛介绍了图像处理领域中最重要的预训练模型。我们分析了每种模型的架构和特性,并强调了使用预训练模型的显著优势。这些优势包括加快训练速度和促进为各种任务创建新模型。在文章的开头,我们强调了计算机视觉的关键重要性。它不仅具有广泛的适用性,而且是实现通用人工智能 (AGI) 的重要支柱。该领域的快速进步加速了我们向 AGI 迈进的步伐,这个话题曾经只是推测,但现在正在被认真考虑。AGI 虽然可能带来风险,但也有望显著改善人类生活。人们普遍认为,AGI 的关键组成部分之一是机器视觉。
此外,我们还讨论了其他应用,例如安全、面部识别和自动驾驶汽车。由于人工智能的不断进步,所有这些都在迅速发展。在第 3 部分中,我们将深入研究机器人领域的重要模型。机器人技术是人工智能中最重要和最具挑战性的领域之一。它涉及创造能够执行类似于生物体的任务的机器,同时考虑到生物的物理复杂性和能力。然而,人们对机器人技术的道德影响和潜在武器化的担忧仍然存在。
RA/SD 衍生者AI训练营。发布者:chris,转载请注明出处:https://www.shxcj.com/archives/3604