第五章:计算机视觉(Computer Vision)-项目实战之图像分类

第一部分:经典卷积神经网络模型 Backbone 与图像

第五节:经典多分支网络 Inception 的架构讲解


1. 背景与提出动机

在 LeNet、AlexNet、VGGNet 和 ResNet 的发展中,网络深度不断加深,但 卷积核尺寸选择 成为了瓶颈:

  • 大卷积核(如 5×5、7×7)具有更大的感受野,但参数多、计算量大

  • 小卷积核(如 1×1、3×3)计算量小,但感受野有限

那么,是否可以 同时使用不同大小的卷积核,让网络自己去学习合适的特征?

Google 团队在 2014 年提出了 GoogLeNet(Inception v1),其核心思想就是 多分支结构(Inception Module)。通过在同一层同时使用 1×1、3×3、5×5 卷积 以及 池化层,再将结果拼接起来,从而高效提取多尺度特征。

GoogLeNet 在 2014 年 ImageNet 竞赛中取得冠军,Top-5 错误率仅为 6.67%,震惊业界。


2. Inception Module 的核心思想

Inception 模块包含 多个并行分支

  1. 1×1 卷积:用于降维,减少计算量,并提取局部特征

  2. 3×3 卷积:提取中等感受野特征

  3. 5×5 卷积:提取大感受野特征

  4. 3×3 最大池化:增强模型的鲁棒性

最终将各个分支的结果在 通道维度上拼接(Concat),形成输出。


3. Inception 模块结构示意

            Input
              │
 ┌──────────┬───────────────────┬───────────────────┬───────────────────┐
 │ 1×1 Conv │ 1×1 Conv+3×3 Conv │ 1×1 Conv+5×5 Conv │ 3×3 Pool+1×1 Conv │
 └──────────┴───────────────────┴───────────────────┴───────────────────┘
              │
           Concatenate
              │
            Output

说明

  • 在 3×3、5×5 卷积之前加上 1×1 卷积层,用来 减少输入通道数,降低计算成本(即网络的“瓶颈层”)。

  • 池化后也通过 1×1 卷积调整通道数,避免通道数不平衡。


4. GoogLeNet(Inception v1)的整体架构

  • 使用了 9 个 Inception 模块,层数达到 22 层,但参数量却远小于 VGGNet

  • 在每个 Inception 模块中采用多分支并行卷积

  • 在训练过程中加入 辅助分类器(Auxiliary Classifier),缓解梯度消失问题


5. Inception 系列的演化

  • Inception v1(GoogLeNet, 2014):提出多分支结构,22 层深度

  • Inception v2/v3(2015):引入因式分解卷积(如 5×5 → 两个 3×3),降低计算量,并使用 Batch Normalization

  • Inception v4 & Inception-ResNet(2016):结合 ResNet 的残差思想,进一步提高训练稳定性和准确率


6. PyTorch 实现示例

import torch
import torch.nn as nn

# Inception 模块
class Inception(nn.Module):
    def __init__(self, in_channels, out1, red3, out3, red5, out5, pool_proj):
        super(Inception, self).__init__()
        # 分支1: 1×1 卷积
        self.branch1 = nn.Conv2d(in_channels, out1, kernel_size=1)

        # 分支2: 1×1 卷积 + 3×3 卷积
        self.branch2 = nn.Sequential(
            nn.Conv2d(in_channels, red3, kernel_size=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(red3, out3, kernel_size=3, padding=1)
        )

        # 分支3: 1×1 卷积 + 5×5 卷积
        self.branch3 = nn.Sequential(
            nn.Conv2d(in_channels, red5, kernel_size=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(red5, out5, kernel_size=5, padding=2)
        )

        # 分支4: 3×3 池化 + 1×1 卷积
        self.branch4 = nn.Sequential(
            nn.MaxPool2d(kernel_size=3, stride=1, padding=1),
            nn.Conv2d(in_channels, pool_proj, kernel_size=1)
        )

    def forward(self, x):
        out1 = self.branch1(x)
        out2 = self.branch2(x)
        out3 = self.branch3(x)
        out4 = self.branch4(x)
        # 在通道维度拼接
        return torch.cat([out1, out2, out3, out4], dim=1)

# 测试 Inception 模块
x = torch.randn(1, 192, 28, 28)
model = Inception(192, 64, 96, 128, 16, 32, 32)
y = model(x)
print("输出维度:", y.shape)

输出结果:

输出维度: torch.Size([1, 256, 28, 28])

说明:经过 Inception 模块后,通道数增加(64+128+32+32=256),同时保持空间分辨率不变。


7. Inception 的优势

  • 多尺度特征提取:不同大小卷积核同时学习特征

  • 计算高效:利用 1×1 卷积降维,减少参数量

  • 深度更深但更轻量:GoogLeNet 参数量约 500 万,而 VGGNet 高达 1.38 亿

  • 应用广泛:被广泛应用于图像分类、目标检测、视频理解等任务


8. 小结

  • Inception 提出了多分支卷积结构,使网络能同时关注不同尺度的特征

  • 通过 1×1 卷积降低计算量,是高效 CNN 的典范

  • Inception 系列与 ResNet 一起,成为深度学习视觉任务中的两大经典基石

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐