当前位置: 首页 > java >正文

Python训练营打卡 Day54

Inception网络及其思考

知识点回顾:

  1. 传统计算机视觉发展史:LeNet-->AlexNet-->VGGNet-->nceptionNet-->ResNet,之所以说传统,是因为现在主要是针对backbone-neck-head这样的范式做文章
  2. inception模块和网络
  3. 特征融合方法阶段性总结:逐元素相加、逐元素相乘、concat通道数增加等
  4. 感受野与卷积核变体:深入理解不同模块和类的设计初衷

Inception 网络及其思考

知识点回顾
  1. 传统计算机视觉发展史

    • LeNet:像是早期的简单食谱,为后续复杂模型奠定基础。

    • AlexNet:引入了深度和ReLU激活函数,如同在厨房中引入了新的烹饪工具和方法。

    • VGGNet:通过增加网络深度来提升性能,如同增加菜谱的步骤以丰富菜品。

    • InceptionNet:引入多尺度特征提取,如同在烹饪中考虑不同食材的处理方式。

    • ResNet:引入残差连接解决梯度消失问题,如同在厨房中引入新的流程优化方法。

  2. Inception 模块和网络

    • Inception 模块通过多分支结构提取不同尺度的特征,类似在厨房中使用多种工具同时处理食材以提高效率。

    • 网络由多个 Inception 模块堆叠而成,类似于多个高效工作站的组合。

  3. 特征融合方法阶段性总结

    • 逐元素相加:如同将多种处理过的食材按特定方式混合,使味道相互补充。

    • 逐元素相乘:如同根据特定比例混合食材,使味道相互增强。

    • Concat 通道数增加:如同将多种食材的特性拼接在一起,形成丰富的菜品。

  4. 感受野与卷积核变体

    • 感受野决定了模型能“看到”的输入区域大小,类似于厨师的视野范围决定其对菜品的整体把控。

    • 不同大小的卷积核用于提取不同尺度的特征,如同使用不同尺寸的刀具切割食材以适应不同的烹饪需求。

作业:一次稍微有点学术感觉的作业:

  1. 对inception网络在cifar10上观察精度
  2. 消融实验:引入残差机制和cbam模块分别进行消融

作业

对 Inception 网络在 CIFAR-10 上观察精度,并进行消融实验:引入残差机制和 CBAM 模块分别进行消融。

  • 引入残差机制:如同在原有菜谱中增加一种新的调味方法,以提升菜品的口感层次。

  • 引入 CBAM 模块:如同在厨房中增加智能设备,动态调整每一步骤的火力和时间,以提升菜品质量。

  • 消融实验:通过比较不同配置下的模型性能,了解每个模块对整体效果的贡献,如同测试不同烹饪步骤对菜品质量的影响。

class CBAM(nn.Module):def __init__(self, in_channels, reduction_ratio=16):super(CBAM, self).__init__()# 通道注意力self.channel_attention = nn.Sequential(nn.AdaptiveAvgPool2d(1),nn.Conv2d(in_channels, in_channels // reduction_ratio, kernel_size=1),nn.ReLU(),nn.Conv2d(in_channels // reduction_ratio, in_channels, kernel_size=1),nn.Sigmoid())# 空间注意力self.spatial_attention = nn.Sequential(nn.Conv2d(2, 1, kernel_size=7, padding=3),nn.Sigmoid())def forward(self, x):channel_attention = self.channel_attention(x)x = x * channel_attentionspatial_attention = self.spatial_attention(torch.cat([torch.mean(x, dim=1, keepdim=True), torch.max(x, dim=1, keepdim=True)[0]], dim=1))x = x * spatial_attentionreturn xclass InceptionWithCBAM(nn.Module):def __init__(self, in_channels):super(InceptionWithCBAM, self).__init__()self.branch1x1 = nn.Sequential(nn.Conv2d(in_channels, 64, kernel_size=1),nn.ReLU())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())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())self.branch_pool = nn.Sequential(nn.MaxPool2d(kernel_size=3, stride=1, padding=1),nn.Conv2d(in_channels, 32, kernel_size=1),nn.ReLU())self.cbam = CBAM(256)def forward(self, x):branch1x1 = self.branch1x1(x)branch3x3 = self.branch3x3(x)branch5x5 = self.branch5x5(x)branch_pool = self.branch_pool(x)outputs = [branch1x1, branch3x3, branch5x5, branch_pool]x = torch.cat(outputs, dim=1)x = self.cbam(x)return xclass InceptionNetWithCBAM(nn.Module):def __init__(self, num_classes=10):super(InceptionNetWithCBAM, 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))self.inception1 = InceptionWithCBAM(64)self.inception2 = InceptionWithCBAM(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# 主函数
def main_cbam():device = torch.device("cuda" if torch.cuda.is_available() else "cpu")model = InceptionNetWithCBAM().to(device)criterion = nn.CrossEntropyLoss()optimizer = optim.Adam(model.parameters(), lr=0.001)for epoch in range(5):train(model, device, trainloader, criterion, optimizer, epoch)test(model, device, testloader)if __name__ == "__main__":main_cbam()

实验结果分析

通过比较基础 Inception 网络、引入残差机制的 Inception 网络,以及引入 CBAM 模块的 Inception 网络在 CIFAR-10 数据集上的准确率,可以得出以下结论:

  1. 基础 Inception 网络:提供了多尺度特征提取的能力,能够有效捕捉不同尺度的特征。

  2. 引入残差机制:通过残差连接,缓解了深层网络的梯度消失问题,提高了模型的训练效率和性能。

  3. 引入 CBAM 模块:通过通道和空间注意力机制,增强了模型对关键特征的关注能力,进一步提高了模型的性能。

@浙大疏锦行

http://www.xdnf.cn/news/14342.html

相关文章:

  • ONLYOFFICE 协作空间 企业版使用秘籍-5.企业电子文件如何管理?便于查找、访问和协作,轻松提升效率
  • 操作系统八股文
  • Python密码加密与校验详解
  • python profiling
  • (十六)GRU 与 LSTM 的门控奥秘:长期依赖捕捉中的遗忘 - 更新机制对比
  • ShardingSphere 全面学习路径
  • 编译链接实战(31)再论静态库的本质是啥
  • LeetCode 2300.咒语和药水的成功对数
  • leetcode复盘(1)
  • 【项目实训】【项目博客#08】HarmonySmartCodingSystem系统前后端知识图谱与可视化实现(5.12-6.1)
  • 深入理解Redis五种基本数据类型
  • (LeetCode 动态规划(基础版)) 279. 完全平方数 (动态规划dp)
  • java复习 14
  • 深度学习入门知识
  • DP刷题练习(二)
  • 【学习笔记】深入理解Java虚拟机学习笔记——第7章 虚拟机类加载机制
  • 关于layui select option莫名多一行的问题
  • EventSourcing.NetCore:基于事件溯源模式的 .NET Core 库
  • 内部代理服务器单点故障导致后端服务概率性失败
  • 算法的几大模块
  • SpringBoot入门 springboot模版注入问题
  • 单例模式的好处
  • 火山引擎解码生态型增长铁律
  • QMI8658A 六轴惯性测量单元的应用介绍
  • Tomcat配置学习
  • 剑指offer26_顺时针打印矩阵
  • Java单例模式的七种实现方式每种方式的应用场景和最佳使用场景分析
  • LeetCode 第75题:颜色分类
  • 设计模式(10)——创建型模式之抽象工厂
  • 机器学习模型评估与选择