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

ResNet中使用expansion放大维度特征

ResNet中使用expansion放大维度特征

在 ResNet 的实现里,block.expansion 用来表示“该残差块输出通道数相对于它内部基准通道数(base_channels)的放大倍数”,它主要用于两处:
在这里插入图片描述
注意:34-layer输入BasicBlock,152-layer属于BottleneckBasicBlock的kenel卷积核始终保持3*3,而Bottleneck的卷积核会进行一个降维,压缩在升维的操作,使用expansion定义提升的倍率可以放大特征。

  1. Bottleneck 模块内部维度变化

    • 对于标准的 BasicBlock,它只有两层 3×3 卷积,输入和输出通道数是相同的,所以我们设定

      class BasicBlock(nn.Module):expansion = 1

      这意味着:

      • 内部的 out_channels = base_channels * expansion = base_channels * 1
      • shortcut 分支对齐时,若需要扩维或缩维,也就是对齐到 base_channels * 1
    • 对于 Bottleneck 块,它有三层卷积:

      1. 1×1 降维到 base_channels
      2. 3×3 保持 base_channels
      3. 1×1 升维到 base_channels * expansion

      因此,我们设定

      class Bottleneck(nn.Module):expansion = 4

      这意味着:

      • 最后一层 1×1 卷积的输出通道数 = base_channels * 4
      • shortcut 分支(如果通道或步幅不匹配时)也需要对齐到这个 base_channels * 4
  2. _make_layer 中维护 in_channels
    每次堆叠一个新的 block,都要更新下一次 block 的输入通道数:

    for s in strides:layers.append(block(self.in_channels, base_channels, stride=s))# 更新 in_channels 为上一个 block 的输出通道数self.in_channels = base_channels * block.expansion
    
    • 对于 BasicBlock:self.in_channels = base_channels * 1
    • 对于 Bottleneck:self.in_channels = base_channels * 4

小结

  • expansion 告诉我们 “每个 block 输出的通道数是 base_channels 的多少倍”。
  • BasicBlock 输出通道 = base_channels × 1
  • Bottleneck 输出通道 = base_channels × 4
  • 它在 shortcut 对齐和后续层 in_channels 的设置上都起到了关键作用。

为什么要进行扩展输出维度
此外,在 Bottleneck 设计里把输出通道数“放大”四倍,看似多余,实际上是一个精心权衡了 表达能力计算效率 的技巧:

  1. “先降维再升维”——降低整体计算量

    • 直接在高维空间(比如 256 或 512 通道)上做大量的 3×3 卷积,计算量和显存占用都非常高。
    • Bottleneck 模块的第一步用 1×1 卷积把维度 降到 base_channels(通常是 1/4 的输出维度),在低维空间里做一次 3×3 卷积,然后再用 1×1 卷积 升回 高维。
    • 这样一来,绝大多数耗算力的 3×3 操作都在低维空间进行,节省了计算成本,却保留了处理高维特征的能力。
  2. 扩展输出维度——提供更丰富的特征表达

    • 在经过 3×3 卷积后,我们需要一个更高维度的表示来捕捉更多元的特征关系。
    • 把输出通道数放大(expansion=4),就能在每个残差块输出端生成更多的特征图,丰富了信息流入后续层的内容。
  3. 残差结构与通道扩张的平衡

    • 1×1 降维 + 3×3 挤压 + 1×1 升维 的组合,既能 保持信息流(借助残差跳跃连接),又在 计算开销(FLOPs)和 参数量 上比直接在高维做 3×3 卷积要经济得多。
    • 实践证明,这种 Bottleneck 形式能在更深的网络(ResNet‑50/101/152)上稳定训练并取得优秀性能。

小结

  • 降维:让大部分 3×3 卷积在低维空间进行,节省大量计算;
  • 升维:输出端通道扩张,保证足够的特征表达能力;
  • 通过残差连接再把“原始高维信息”与“压缩后重建的信息”相加,两者优势兼得。
http://www.xdnf.cn/news/4794.html

相关文章:

  • ESP32 DAC音频应用示例与场景
  • Java 的 Monitor 机制:原理与源码详解
  • c语言与c++到底有什么区别?
  • Alpha3DCS公差分析系统_国产替代的3D精度管控方案-SNK施努卡
  • 力扣热题——到达最后一个房间的最少时间 I
  • 云原生应用全生命周期管理实战:从开发、部署到运维的一体化方案
  • 华为首款鸿蒙电脑正式亮相,开启国产操作系统新篇章
  • 20250508在WIN10下使用移远的4G模块EC200A-CN直接上网
  • 【整形数字转化为字符串,求有几位相同(汉明距离)】2021-11-20 20:15
  • EMQX 作为 MQTT Broker,支持 ​MQTT over TCP​ 和 ​MQTT over WebSocket​ 两种协议
  • 数据分析平台选型与最佳实践:如何打造高效、灵活的数据生态?
  • 编译原理头歌实验:词法分析程序设计与实现(C语言版)
  • 人工智能的自动驾驶新纪元:端到端智能系统挑战与前沿探索方案
  • Java 17配置Jenkins
  • robot_lab中rsl_rl的replay_amp_data.py简洁解析
  • 支持鸿蒙next的uts插件
  • 线代第二章矩阵第五、六、七节矩阵的转置、方阵的行列式、方阵的伴随矩阵
  • Android开发报错解决
  • mysql 复习
  • Webug4.0靶场通关笔记22- 第27关文件包含
  • 用递归实现各种排列
  • 使用Jmeter进行核心API压力测试
  • 如何进行APP安全加固
  • 计算机视觉与深度学习 | 基于Transformer的低照度图像增强技术
  • 用react实现一个简单的三页应用
  • nut-form表单:实现动态新增、校验
  • android ViewModel liveData无法监听之多线程下activityViewModels不安全
  • ISP gamma校正简介
  • 如何对外包团队进行有效的管理?
  • JAVA房屋租售管理系统房屋出租出售平台房屋销售房屋租赁房屋交易信息管理源码