第5篇 视觉“骨架网”的进化——从VGG、GoogLeNet到ResNet

《人工智能AI之计算机视觉:从像素到智能》· 模块一:视觉之门——从经典特征到CNN革命 

在上一篇,我们见证了2012年AlexNet带来的“创世爆炸”。它就像一把开天辟地的巨斧,劈开了“手工特征”时代的混沌,证明了“深度”CNN是一条可行且强大的道路。

但AlexNet毕竟只是一个开始,它更像是一个“原型机”,虽然惊艳,但结构略显粗糙。它留给全世界一个巨大的悬念:

如果8层网络能做到这样,那18层、50层、甚至100层呢?网络是不是越深越好?

这个问题,在随后的三年里(2014-2015),引发了一场疯狂的“军备竞赛”。全球最顶尖的头脑都在思考同一个问题:如何把网络做得更深、更强?

在这场竞赛中,诞生了三个名字,它们不仅是ImageNet赛场上的冠军,更成为了定义现代计算机视觉的“三大基石架构”。它们是:

  1. VGG:极简主义的丰碑。
  2. GoogLeNet (Inception):复杂精妙的“盗梦空间”。
  3. ResNet:打破“深度诅咒”的天才之作。

今天,我们就来一场深度穿越,去看看这三位“巨人”是如何用截然不同的哲学,搭建起现代AI之眼的“骨架”的。


一、 VGG:极简主义的胜利——“又深又小”的哲学

2014年,来自牛津大学视觉几何组(Visual Geometry Group)的VGG模型登场了。

第一眼看去,VGG简直“土”得掉渣。

  • 熟悉元素:它没有花哨的结构。它就像用同一种乐高积木——3x3的小卷积核——反复堆叠而成。
  • 意外创新(洞察):在VGG之前,大家喜欢用大的卷积核(比如AlexNet用了11x11和5x5),认为大的能看得更“广”。
### LeNet5 到 AlexNet LeNet5 是最早的卷积神经络之一,主要用于手写数字识别,其结构相对简单,包含卷积层、池化层和全连接层。 AlexNet 是首个实用性很强的卷积神经络,由卷积操作、池化层、全连接层、softmax 层以及 RELU、Dropout 构成,于 2012 年的 ILSVRC 大规模视觉识别竞赛上首次提出[^2]。与 LeNet5 相比,AlexNet 的优点和进步体现在以下方面: - **络规模更大**:AlexNet 层数更深,参数更多,能够处理更复杂的图像数据,例如大规模的自然图像数据集。 - **引入 ReLU 激活函数**:ReLU 解决了 Sigmoid 函数在训练过程中出现的梯度消失问题,加快了络的训练速度。 - **使用 Dropout 技术**:Dropout 可以防止过拟合,提高模型的泛化能力。 - **数据增强**:通过随机裁剪、水平翻转等数据增强方法,增加了训练数据的多样性,提高了模型的鲁棒性。 ### AlexNet 到 VGG VGG 络的结构更加规整,主要由多个 3x3 的卷积层和池化层堆叠而成。与 AlexNet 相比,VGG 的优点和进步如下: - **更小的卷积核**:采用多个 3x3 的卷积核代替大卷积核,在减少参数的同时,增加了络的非线性,提高了特征提取能力。 - **更深的络结构**:VGG 络层数进一步加深,能够学习到更高级的特征表示。 ### VGGGoogLeNet GoogLeNet 也称为 Inception - v1,除了 Inception 模块之外,在络结构设计上还有诸多创新[^5]。与 VGG 相比,其优点和进步包括: - **Inception 模块**:Inception 模块通过在同一层中使用不同大小的卷积核和池化操作,并行地提取不同尺度的特征,然后将这些特征拼接在一起,增加了络的宽度,提高了特征的多样性。 - **瓶颈结构**:在计算比较大的卷积层之前,先使用 1×1 卷积对其通道进行压缩以减少计算量,在较大卷积层完成计算之后,根据需要有时候会再次使用 1×1 卷积将其通道数复原。 - **辅助分类器**:从络中间层拉出多条支线,连接辅助分类器,用于计算损失并进行误差反向传播,以缓解梯度消失问题。 - **全局平均池化层**:将第一个全连接层换成全局平均池化层,减少了参数数量,降低了过拟合的风险。 ### GoogLeNetResNet ResNet 是一种残差网络,经过堆叠可以构成一个很深的络,其核心是 H(x) = F(x)+x [^4]。与 GoogLeNet 相比,ResNet 的优点和进步如下: - **残差块**:残差块通过引入跳跃连接,使得络可以训练更深的层数,解决了随着络加深出现的梯度消失和梯度爆炸问题,能够获取更丰富的特征信息。 ```python # 简单示例代码展示 ResNet 中的残差块结构 import torch import torch.nn as nn class ResidualBlock(nn.Module): def __init__(self, in_channels, out_channels, stride=1): super(ResidualBlock, self).__init__() self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=stride, padding=1, bias=False) self.bn1 = nn.BatchNorm2d(out_channels) self.relu = nn.ReLU(inplace=True) self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, stride=1, padding=1, bias=False) self.bn2 = nn.BatchNorm2d(out_channels) self.shortcut = nn.Sequential() if stride != 1 or in_channels != out_channels: self.shortcut = nn.Sequential( nn.Conv2d(in_channels, out_channels, kernel_size=1, stride=stride, bias=False), nn.BatchNorm2d(out_channels) ) def forward(self, x): out = self.relu(self.bn1(self.conv1(x))) out = self.bn2(self.conv2(out)) out += self.shortcut(x) out = self.relu(out) return out ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老马爱知

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值