动手学深度学习-20
卷积层里的填充和步幅
填充
在应用多层卷积时,我们常常丢失边缘像素。由于我们通常使用小卷积核,因此对于任何单个卷积,我们可能只会丢失几个像素。但随着我们应用许多连续卷积层,累积丢失的像素数就多了。解决这个问题的简单方法即为填充(padding):在输入图像的边界填充元素(通常填充元素是
通常,如果我们添加
这意味着输出的高度和宽度将分别增加
在许多情况下,我们需要设置
这样可以在构建网络时更容易地预测每个图层的输出形状。假设
如果
卷积神经网络中卷积核的高度和宽度通常为奇数,例如1、3、5或7。选择奇数的好处是,保持空间维度的同时,我们可以在顶部和底部填充相同数量的行,在左侧和右侧填充相同数量的列。
此外,使用奇数的核大小和填充大小也提供了书写上的便利。对于任何二维张量X
,当满足:
- 卷积核的大小是奇数;
- 所有边的填充行数和列数相同;
- 输出与输入具有相同高度和宽度
则可以得出:输出Y[i, j]
是通过以输入X[i, j]
为中心,与卷积核进行互相关计算得到的。
在下面的例子中,我们创建一个高度和宽度为3的二维卷积层,并在所有侧边填充1个像素。给定高度和宽度为8的输入,则输出的高度和宽度也是8。
1 | import torch |
步幅
在计算互相关时,卷积窗口从输入张量的左上角开始,向下、向右滑动。通常,我们默认每次滑动一个元素。但是,有时候为了高效计算或是缩减采样次数,卷积窗口可以跳过中间位置,每次滑动多个元素。
我们将每次滑动元素的数量称为步幅(stride)。
通常,当垂直步幅为
如果我们设置了
更进一步,如果输入的高度和宽度可以被垂直和水平步幅整除,则输出形状将为
我们将高度和宽度的步幅设置为2,从而将输入的高度和宽度减半。
1 | conv2d = nn.Conv2d(1, 1, kernel_size=3, padding=1, stride=2) |
在实践中,我们很少使用不一致的步幅或填充,也就是说,我们通常有
小结
- 填充可以增加输出的高度和宽度。这常用来使输出与输入具有相同的高和宽。
- 步幅可以减小输出的高和宽,例如输出的高和宽仅为输入的高和宽的
( 是一个大于 的整数)。 - 填充和步幅可用于有效地调整数据的维度。
- 标题: 动手学深度学习-20
- 作者: 敖炜
- 创建于 : 2023-08-19 14:03:55
- 更新于 : 2024-04-19 09:28:40
- 链接: https://ao-wei.github.io/2023/08/19/动手学深度学习-20/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。