深度学习|表示学习|卷积神经网络|输出维度公式如何理解?|16

如是我闻: 当我们对输入图像进行卷积时,输出的宽度和高度可以通过以下公式计算:

输出大小 = 输入大小 − 卷积核大小 + 2 ⋅ 填充大小 步长 + 1 \text{输出大小} = \frac{\text{输入大小} - \text{卷积核大小} + 2 \cdot \text{填充大小}}{\text{步长}} + 1 输出大小=步长输入大小−卷积核大小+2⋅填充大小+1

池化(Pooling)的输出大小公式类似卷积,但更加简单:

输出大小 = 输入大小 − 池化窗口大小 步长 + 1 \text{输出大小} = \frac{\text{输入大小} - \text{池化窗口大小}}{\text{步长}} + 1 输出大小=步长输入大小−池化窗口大小+1

下面让我们用一个直观的例子来加深一下对输出大小的理解


想象一个操场和一块跳格子布

  1. 操场是输入图片

    • 假设操场很大,我们把它分成一格一格的方块,像下图:

      操场(输入图片):
      [□ □ □ □ □]
      [□ □ □ □ □]
      [□ □ □ □ □]
      [□ □ □ □ □]
      [□ □ □ □ □]
      

    这里有 5 × 5 5 \times 5 5×5 的方块。我们要用"跳格子布"来覆盖操场的一部分并"滑动",看我们可以跳多少次。

  2. 跳格子布是池化窗口

    • 比如,我们的跳格子布是 3 × 3 3 \times 3 3×3 的大小,它长这样:

      跳格子布(池化窗口):
      [■ ■ ■]
      [■ ■ ■]
      [■ ■ ■]
      

    跳格子布每次能覆盖 3 × 3 3 \times 3 3×3 的区域。

  3. 滑动是步长

    • 每次把跳格子布从操场上向右移动。比如:
      • 如果步长是 1,就往右挪 1 格;
      • 如果步长是 2,就往右挪 2 格。
  4. 规则:只要跳格子布还在操场范围内,就可以跳一次


公式背后的意义

我们想知道这个跳格子布能跳多少次(输出的大小)?

公式告诉我们:
跳的次数 = 操场的大小 − 跳格子布的大小 每次滑动的距离 + 1 \text{跳的次数} = \frac{\text{操场的大小} - \text{跳格子布的大小}}{\text{每次滑动的距离}} + 1 跳的次数=每次滑动的距离操场的大小−跳格子布的大小+1


一个直观的例子

假设:
  • 操场大小 是 5 × 5 5 \times 5 5×5;
  • 跳格子布大小 是 3 × 3 3 \times 3 3×3;
  • 步长是 1(每次跳格子布只往右挪 1 格)。
按公式计算:
  • 操场的大小是 5,跳格子布的大小是 3,步长是 1。

  • 横着跳的次数:
    5 − 3 1 + 1 = 3 \frac{5 - 3}{1} + 1 = 3 15−3+1=3

    所以跳格子布在每一行可以跳 3 次。

  • 纵着跳的次数也一样:
    5 − 3 1 + 1 = 3 \frac{5 - 3}{1} + 1 = 3 15−3+1=3

    所以总的输出大小是 ( 3 \times 3 )。

画出来:

跳格子布的位置会是:

  • 第一次跳:

    [■ ■ ■ □ □]
    [■ ■ ■ □ □]
    [■ ■ ■ □ □]
    
  • 第二次跳:

    [□ ■ ■ ■ □]
    [□ ■ ■ ■ □]
    [□ ■ ■ ■ □]
    
  • 第三次跳:

    [□ □ ■ ■ ■]
    [□ □ ■ ■ ■]
    [□ □ ■ ■ ■]
    

换一个更大的步长

如果步长变成 2 呢?

  • 横着跳的次数:
    5 − 3 2 + 1 = 2 \frac{5 - 3}{2} + 1 = 2 25−3+1=2

    所以跳格子布在每一行可以跳 2 次。

  • 纵着跳的次数:
    5 − 3 2 + 1 = 2 \frac{5 - 3}{2} + 1 = 2 25−3+1=2

    所以总的输出大小是 2 × 2 2 \times 2 2×2。

画出来:

跳格子布的位置会是:

  • 第一次跳:

    [■ ■ ■ □ □]
    [■ ■ ■ □ □]
    [■ ■ ■ □ □]
    
  • 第二次跳:

    [□ □ □ ■ ■]
    [□ □ □ ■ ■]
    [□ □ □ ■ ■]
    

公式的本质

  1. 操场有多大(输入图片的大小)。
  2. 跳格子布有多大(池化窗口的大小)。
  3. 每次挪动多远(步长)。

公式计算的,就是跳格子布在操场上可以跳多少次(输出大小)。

更大、更密的跳格子布会减少能跳的次数,步长越大,跳的次数也会减少。


为什么有"+1"?

问题:

当滑动窗口从左上角开始往右或往下移动时,滑动的次数按距离计算。如果没有 "+1" ,只会计算窗口滑动了几次完整步长 ,但不会考虑窗口的起始位置

公式分成两部分:

  1. ( 输入大小 − 窗口大小 ) / 步长 (\text{输入大小} - \text{窗口大小}) / \text{步长} (输入大小−窗口大小)/步长:计算滑动窗口最多滑动多少步。

  2. "+1":表示滑动窗口的初始位置也算一次覆盖(因为滑动窗口最开始就覆盖了输入的一部分)。


举个具体例子

假设:
  • 输入大小是 5 5 5 长度为 5 的操场)。
  • 窗口大小是 3 3 3(跳格子布的长度为 3)。
  • 步长是 1 1 1(每次跳格子布挪动 1 格)。

如果没有 "+1"
输入大小 − 窗口大小 步长 = 5 − 3 1 = 2 \frac{\text{输入大小} - \text{窗口大小}}{\text{步长}} = \frac{5 - 3}{1} = 2 步长输入大小−窗口大小=15−3=2

这表示跳格子布只能跳 2 次

但实际上,我们可以从 起点 开始跳,跳格子布覆盖输入的最左侧,这是第 1 次覆盖。

然后向右挪动覆盖第 2 格,接着挪动覆盖第 3 格。

总共 3 次

因此需要 "+1" 来补上初始位置,公式变为:
输入大小 − 窗口大小 步长 + 1 = 3 \frac{\text{输入大小} - \text{窗口大小}}{\text{步长}} + 1 = 3 步长输入大小−窗口大小+1=3


再换一个例子(步长 > 1 的情况)

假设:
  • 输入大小是 6 6 6;
  • 窗口大小是 ( 3 );
  • 步长是 ( 2 )。

如果没有 "+1":
6 − 3 2 = 1.5 \frac{6 - 3}{2} = 1.5 26−3=1.5

这里结果是小数,表示跳了 1.5 次,显然不合理。

考虑加上起始位置:
6 − 3 2 + 1 = 2 \frac{6 - 3}{2} + 1 = 2 26−3+1=2

表示窗口在起点覆盖一次,然后滑动覆盖第 2 次,符合逻辑。


总的来说:

公式的本质就是在问:一个小窗口(池化窗口)在一个大图(输入)里,可以覆盖多少个位置?

"+1" 的意义:
  • 当我们计算滑动窗口的次数时,公式 ((\text{输入大小} - \text{窗口大小}) / \text{步长}) 只算了窗口能滑动的次数,而没有把窗口的初始位置计算进去。
  • "+1" 就是为了补上窗口覆盖输入时的第一个位置。

以上

相关推荐
Stanford_110635 分钟前
C++中常用的排序方法之——冒泡排序
java·学习·算法·微信小程序·排序算法·微信公众平台·微信开放平台
时间很奇妙!1 小时前
神经网络和深度学习
人工智能·深度学习
小菜鸟博士1 小时前
手撕Diffusion系列 - 第十一期 - lora微调 - 基于Stable Diffusion(代码)
网络·人工智能·深度学习·学习·算法·stable diffusion
飞yu流星2 小时前
c++ map/multimap容器 学习笔记
c++·笔记·学习
人工智能教学实践2 小时前
深度学习框架应用开发:基于 TensorFlow 的函数求导分析
人工智能·深度学习·tensorflow
feifeikon2 小时前
NLP&深度学习 DAY4:Word2Vec详解:两种模式(CBOW与Skip-gram)
人工智能·深度学习·自然语言处理
梦云澜8 小时前
论文阅读(十四):贝叶斯网络在全基因组DNA甲基化研究中的应用
论文阅读·人工智能·深度学习
Future_yzx9 小时前
算法基础学习——快排与归并(附带java模版)
学习·算法·排序算法
忆~遂愿10 小时前
3大关键点教你用Java和Spring Boot快速构建微服务架构:从零开发到高效服务注册与发现的逆袭之路
java·人工智能·spring boot·深度学习·机器学习·spring cloud·eureka
三次拒绝王俊凯11 小时前
记忆力训练day08
学习