深度学习|表示学习|卷积神经网络|输出维度公式如何理解?|16
如是我闻: 当我们对输入图像进行卷积时,输出的宽度和高度可以通过以下公式计算:
输出大小
=
输入大小
−
卷积核大小
+
2
⋅
填充大小
步长
+
1
\text{输出大小} = \frac{\text{输入大小} - \text{卷积核大小} + 2 \cdot \text{填充大小}}{\text{步长}} + 1
输出大小=步长输入大小−卷积核大小+2⋅填充大小+1
池化(Pooling)的输出大小公式类似卷积,但更加简单:
输出大小 = 输入大小 − 池化窗口大小 步长 + 1 \text{输出大小} = \frac{\text{输入大小} - \text{池化窗口大小}}{\text{步长}} + 1 输出大小=步长输入大小−池化窗口大小+1
下面让我们用一个直观的例子来加深一下对输出大小的理解
想象一个操场和一块跳格子布
-
操场是输入图片:
- 假设操场很大,我们把它分成一格一格的方块,像下图:
操场(输入图片): [□ □ □ □ □] [□ □ □ □ □] [□ □ □ □ □] [□ □ □ □ □] [□ □ □ □ □]
这里有 5 × 5 5 \times 5 5×5 的方块。我们要用“跳格子布”来覆盖操场的一部分并“滑动”,看我们可以跳多少次。
- 假设操场很大,我们把它分成一格一格的方块,像下图:
-
跳格子布是池化窗口:
- 比如,我们的跳格子布是
3
×
3
3 \times 3
3×3 的大小,它长这样:
跳格子布(池化窗口): [■ ■ ■] [■ ■ ■] [■ ■ ■]
跳格子布每次能覆盖 3 × 3 3 \times 3 3×3 的区域。
- 比如,我们的跳格子布是
3
×
3
3 \times 3
3×3 的大小,它长这样:
-
滑动是步长:
- 每次把跳格子布从操场上向右移动。比如:
- 如果步长是 1,就往右挪 1 格;
- 如果步长是 2,就往右挪 2 格。
- 每次把跳格子布从操场上向右移动。比如:
-
规则:只要跳格子布还在操场范围内,就可以跳一次。
公式背后的意义
我们想知道这个跳格子布能跳多少次(输出的大小)?
公式告诉我们:
跳的次数
=
操场的大小
−
跳格子布的大小
每次滑动的距离
+
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”?
问题:
当滑动窗口从左上角开始往右或往下移动时,滑动的次数按距离计算。如果没有 “+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” 就是为了补上窗口覆盖输入时的第一个位置。
以上