Day 54 Inception 网络及其思考

文章目录

  • [Day 54 · Inception 网络及其思考](#Day 54 · Inception 网络及其思考)
    • [一、Inception 网络介绍](#一、Inception 网络介绍)
      • [1.1 背景与动机](#1.1 背景与动机)
      • [1.2 核心设计理念](#1.2 核心设计理念)
      • [1.3 Inception 模块的组成](#1.3 Inception 模块的组成)
    • [二、Inception 网络架构](#二、Inception 网络架构)
      • [2.1 定义 Inception 模块](#2.1 定义 Inception 模块)
      • [2.2 特征融合方法](#2.2 特征融合方法)
      • [2.3 InceptionNet 网络定义](#2.3 InceptionNet 网络定义)
      • [2.4 Inception 网络的版本演进](#2.4 Inception 网络的版本演进)
    • 三、卷积核的变体
      • [3.1 感受野(Receptive Field)](#3.1 感受野(Receptive Field))
      • [3.2 空洞卷积(Dilated Convolution)](#3.2 空洞卷积(Dilated Convolution))
      • [3.3 空洞卷积示例](#3.3 空洞卷积示例)
    • 四、总结

Day 54 · Inception 网络及其思考

学习目标:

  • 理解 Inception 网络的核心设计理念
  • 掌握多尺度特征融合的实现方法
  • 了解特征融合的常见方式
  • 学习卷积核变体与感受野的概念

一、Inception 网络介绍

1.1 背景与动机

Inception 网络(也称为 GoogLeNet)是 Google 团队在 2014 年提出的经典卷积神经网络架构。

参考资料: 传统计算机视觉的发展史

从历史发展来看,Inception 网络实际上出现在 ResNet 之前。之所以在学习 ResNet 后再介绍它,是因为 Inception 引出了重要的特征融合特征并行处理思想。

1.2 核心设计理念

Inception 网络的核心设计理念是 "并行的多尺度融合",具体表现为:

  • 在同一层网络中使用多个不同大小的卷积核(如 1x1、3x3、5x5)
  • 结合池化操作,从不同尺度提取图像特征
  • 将这些特征进行融合
  • 在不增加过多计算量的情况下,获得更丰富的特征表达

1.3 Inception 模块的组成

Inception 模块是 Inception 网络的基本组成单元。

关键洞察: 在同样的步长下:

  • 卷积核越小,下采样率越低,保留的图片像素越多
  • 卷积核越大,越能捕捉像素周围的信息

一个典型的 Inception 模块包含以下四个并行分支:

分支 描述 作用
1x1 卷积分支 用于降维 减少后续卷积的计算量,同时提取局部特征
3x3 卷积分支 中等尺度卷积 捕捉中等尺度的特征
5x5 卷积分支 较大尺度卷积 捕捉较大尺度的特征
池化分支 最大/平均池化 保留图像的全局信息

二、Inception 网络架构

2.1 定义 Inception 模块

python 复制代码
import torch
import torch.nn as nn

class Inception(nn.Module):
    """
    Inception 模块:实现多尺度特征并行提取与融合
    
    该模块包含四个并行分支:
    - 1x1 卷积分支:降维并提取通道间特征关系
    - 3x3 卷积分支:捕捉中等尺度特征
    - 5x5 卷积分支:捕捉大尺度特征
    - 池化分支:保留全局信息
    
    参数:
        in_channels: 输入特征图的通道数
    """
    
    def __init__(self, in_channels):
        super(Inception, self).__init__()
        
        # ========== 分支1:1x1 卷积 ==========
        # 作用:降维并提取通道间特征关系
        self.branch1x1 = nn.Sequential(
            nn.Conv2d(in_channels, 64, kernel_size=1),
            nn.ReLU()
        )
        
        # ========== 分支2:3x3 卷积 ==========
        # 作用:先降维,再用 3x3 卷积捕捉中等尺度特征
        self.branch3x3 = nn.Sequential(
            nn.Conv2d(in_channels, 96, kernel_size=1),
            nn.ReLU(),
            nn.Conv2d(96, 128, kernel_size=3, padding=1),
            nn.ReLU()
        )
        
        # ========== 分支3:5x5 卷积 ==========
        # 作用:较大的感受野用于提取更全局的结构信息
        self.branch5x5 = nn.Sequential(
            nn.Conv2d(in_channels, 16, kernel_size=1),
            nn.ReLU(),
            nn.Conv2d(16, 32, kernel_size=5, padding=2),
            nn.ReLU()
        )
        
        # ========== 分支4:池化分支 ==========
        # 作用:通过池化操作保留全局信息并降维
        self.branch_pool = nn.Sequential(
            nn.MaxPool2d(kernel_size=3, stride=1, padding=1),
            nn.Conv2d(in_channels, 32, kernel_size=1),
            nn.ReLU()
        )

    def forward(self, x):
        """
        前向传播:并行计算四个分支并在通道维度拼接
        
        输出通道数 = 64 + 128 + 32 + 32 = 256
        """
        branch1x1 = self.branch1x1(x)      # [batch, 64, H, W]
        branch3x3 = self.branch3x3(x)      # [batch, 128, H, W]
        branch5x5 = self.branch5x5(x)      # [batch, 32, H, W]
        branch_pool = self.branch_pool(x)  # [batch, 32, H, W]
        
        outputs = [branch1x1, branch3x3, branch5x5, branch_pool]
        return torch.cat(outputs, dim=1)

维度变化: [B, C, H, W][B, 256, H, W]

无论输入通道数是多少,输出通道数固定为 256(64+128+32+32)。

python 复制代码
# 测试 Inception 模块
model = Inception(in_channels=64)
input_tensor = torch.randn(32, 64, 28, 28)  # batch=32, channels=64, H=W=28
output = model(input_tensor)

print(f"输入形状: {input_tensor.shape}")
print(f"输出形状: {output.shape}")  # 预期: [32, 256, 28, 28]
复制代码
输入形状: torch.Size([32, 64, 28, 28])
输出形状: torch.Size([32, 256, 28, 28])

设计要点:

Inception 模块中不同的卷积核和步长最后输出同样尺寸的特征图,这是经过精心设计的:

  • 必须保证空间尺寸对齐
  • 才能在通道维度正确拼接(concat)

2.2 特征融合方法

Inception 模块采用 Concat(拼接) 的方式将不同尺度的特征融合在一起。

Concat 拼接的特点:
  • 通道数增加
  • 空间尺寸(H, W)保持不变
  • 每个通道的数值保持独立,没有加法运算
深度学习中常见的特征融合方式:

1. 逐元素相加(残差连接)

python 复制代码
output = x + self.residual_block(x)

2. 逐元素相乘(注意力机制)

python 复制代码
attention = self.ChannelAttention(features)
weighted_features = features * attention

3. 通道拼接

python 复制代码
output = torch.cat([f1, f2], dim=1)
方法 维度变化 计算量 典型场景
concat 通道数增加 Inception、U-Net
逐元素相加 维度不变 ResNet、DenseNet 过渡层
逐元素相乘 维度不变 中(需权重) 注意力机制、门控网络
跳跃连接(concat) 通道数增加 U-Net、FPN
加权融合(SE-Net) 维度不变 通道特征重标定
空间金字塔池化(SPP) 通道数增加 目标检测、尺寸自适应任务

2.3 InceptionNet 网络定义

python 复制代码
class InceptionNet(nn.Module):
    """
    简化版 InceptionNet:用于图像分类
    
    网络结构:
    1. 卷积层(初始特征提取)
    2. Inception 模块 x 2(多尺度特征融合)
    3. 全局平均池化 + 全连接层(分类输出)
    """
    
    def __init__(self, num_classes=10):
        super(InceptionNet, self).__init__()
        
        # 初始卷积层
        self.conv1 = nn.Sequential(
            nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
        )
        
        # Inception 模块
        self.inception1 = Inception(64)
        self.inception2 = Inception(256)
        
        # 分类头
        self.avgpool = nn.AdaptiveAvgPool2d((1, 1))
        self.fc = nn.Linear(256, num_classes)

    def forward(self, x):
        x = self.conv1(x)
        x = self.inception1(x)
        x = self.inception2(x)
        x = self.avgpool(x)
        x = torch.flatten(x, 1)
        x = self.fc(x)
        return x
python 复制代码
# 测试 InceptionNet
model = InceptionNet(num_classes=10)
input_tensor = torch.randn(1, 3, 224, 224)
output = model(input_tensor)
print(f"输入形状: {input_tensor.shape}")
print(f"输出形状: {output.shape}")
复制代码
输入形状: torch.Size([1, 3, 224, 224])
输出形状: torch.Size([1, 10])

2.4 Inception 网络的版本演进

版本 特点
Inception v1 (GoogLeNet) 最初版本,引入 Inception 模块
Inception v2 使用 Batch Normalization
Inception v3 进一步分解卷积核
Inception v4 更深的网络结构
Inception-ResNet 引入残差连接

三、卷积核的变体

3.1 感受野(Receptive Field)

感受野是指在 CNN 中,神经元在原始输入图像上所对应的区域大小。

感受野计算示例(3x3 卷积,步长 1):

  • 第一层感受野 = 3x3
  • 第二层感受野 = 5x5(计算公式:3+3-1=5)

小卷积核的优势:

  1. 减少参数量
  2. 引入更多非线性(多次经过激活函数)

3.2 空洞卷积(Dilated Convolution)

空洞卷积在卷积核元素间插入空洞,用 dilation rate (d) 控制间隔大小。

类型 描述
标准卷积(d=1) 卷积核元素紧密排列
空洞卷积(d>1) 卷积核元素间插入 d-1 个空洞

优点:

  • 扩大感受野而不增加参数
  • 保持空间信息(相比池化下采样)

3.3 空洞卷积示例

使用空洞卷积只需添加 dilation 参数:

python 复制代码
# 空洞卷积(dilation=2)
self.conv = nn.Conv2d(16, 32, kernel_size=3, padding=2, dilation=2)
python 复制代码
import torch
import torch.nn as nn
import torchvision
import torchvision.transforms as transforms
from torch.utils.data import DataLoader

# 数据预处理
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])

# 加载 CIFAR-10 数据集
trainset = torchvision.datasets.CIFAR10(
    root='./data', train=True, download=True, transform=transform
)
trainloader = DataLoader(trainset, batch_size=128, shuffle=True)

testset = torchvision.datasets.CIFAR10(
    root='./data', train=False, download=True, transform=transform
)
testloader = DataLoader(testset, batch_size=128, shuffle=False)


class SimpleCNNWithDilation(nn.Module):
    """包含空洞卷积的简单 CNN 模型"""
    
    def __init__(self):
        super(SimpleCNNWithDilation, self).__init__()
        self.conv1 = nn.Conv2d(3, 16, kernel_size=3, padding=1)
        # 空洞卷积,dilation=2
        self.conv2 = nn.Conv2d(16, 32, kernel_size=3, padding=2, dilation=2)
        self.conv3 = nn.Conv2d(32, 64, kernel_size=3, padding=1)
        
        self.pool = nn.MaxPool2d(2, 2)
        self.relu = nn.ReLU()
        
        self.fc1 = nn.Linear(64 * 8 * 8, 256)
        self.fc2 = nn.Linear(256, 10)

    def forward(self, x):
        x = self.pool(self.relu(self.conv1(x)))
        x = self.pool(self.relu(self.conv2(x)))
        x = self.relu(self.conv3(x))
        x = x.view(-1, 64 * 8 * 8)
        x = self.relu(self.fc1(x))
        x = self.fc2(x)
        return x


# 训练配置
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = SimpleCNNWithDilation().to(device)
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)


def train(epoch):
    model.train()
    running_loss = 0.0
    for i, (inputs, labels) in enumerate(trainloader):
        inputs, labels = inputs.to(device), labels.to(device)
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()
        running_loss += loss.item()
        if (i + 1) % 100 == 0:
            print(f'Epoch: {epoch + 1}, Batch: {i + 1}, Loss: {running_loss / 100:.3f}')
            running_loss = 0.0


def test():
    model.eval()
    correct = 0
    total = 0
    with torch.no_grad():
        for images, labels in testloader:
            images, labels = images.to(device), labels.to(device)
            outputs = model(images)
            _, predicted = torch.max(outputs.data, 1)
            total += labels.size(0)
            correct += (predicted == labels).sum().item()
    print(f'Accuracy on test set: {100 * correct / total:.2f}%')


# 训练 5 个 epoch
for epoch in range(5):
    train(epoch)
    test()
复制代码
Epoch: 1, Batch: 100, Loss: 1.835
Epoch: 1, Batch: 200, Loss: 1.508
Epoch: 1, Batch: 300, Loss: 1.399
Accuracy on test set: 54.53%
Epoch: 2, Batch: 100, Loss: 1.222
Epoch: 2, Batch: 200, Loss: 1.184
Epoch: 2, Batch: 300, Loss: 1.115
Accuracy on test set: 62.45%
Epoch: 3, Batch: 100, Loss: 1.020
Epoch: 3, Batch: 200, Loss: 1.008
Epoch: 3, Batch: 300, Loss: 0.986
Accuracy on test set: 65.47%
Epoch: 4, Batch: 100, Loss: 0.895
Epoch: 4, Batch: 200, Loss: 0.899
Epoch: 4, Batch: 300, Loss: 0.873
Accuracy on test set: 66.70%
Epoch: 5, Batch: 100, Loss: 0.788
Epoch: 5, Batch: 200, Loss: 0.783
Epoch: 5, Batch: 300, Loss: 0.796
Accuracy on test set: 70.19%

四、总结

本节要点回顾:

  1. Inception 网络核心思想

    • 并行的多尺度特征融合
    • 使用不同大小的卷积核(1x1、3x3、5x5)+ 池化
    • 通过 1x1 卷积降维减少计算量
  2. 特征融合方式

    • Concat(通道拼接)
    • 逐元素相加(残差连接)
    • 逐元素相乘(注意力机制)
  3. 感受野与卷积变体

    • 感受野决定了网络能"看到"的范围
    • 空洞卷积可以在不增加参数的情况下扩大感受野

@浙大疏锦行

相关推荐
Hcoco_me2 小时前
大模型面试题27:Muon优化器小白版速懂
人工智能·rnn·自然语言处理·lstm·word2vec
过期的秋刀鱼!2 小时前
机器学习-逻辑回归的成本函数
人工智能·机器学习·逻辑回归
老吴学AI2 小时前
第二篇:智能五层模型:定义你的AI应用战略高度
大数据·人工智能·aigc
deephub2 小时前
从贝叶斯视角解读Transformer的内部几何:mHC的流形约束与大模型训练稳定性
人工智能·深度学习·神经网络·transformer·残差链接
CoderJia程序员甲2 小时前
2025年度总结之-如何构建 2025 专属的 GitHub AI 项目情报库
人工智能·ai·大模型·github·ai教程
麦德泽特2 小时前
基于ESP32S3芯片的机器人控制器设计与实现
人工智能·物联网·机器人·esp32·芯片
阿正的梦工坊2 小时前
VisualTrap:一种针对 GUI Agent 的隐蔽视觉后门攻击
人工智能·深度学习·机器学习·语言模型·自然语言处理
渡我白衣2 小时前
从直觉到公式——线性模型的原理、实现与解释
人工智能·深度学习·神经网络·机器学习·计算机视觉·自然语言处理·caffe
大模型任我行2 小时前
美团:统一生成理解多模态大模型
人工智能·计算机视觉·语言模型·论文笔记