填充和步幅
假设输入形状是 ,卷积核窗口形状是 ,则输出形状是
这里介绍卷积层的两个超参数填充和步幅,它们可以改变输出形状。
1. 填充
填充()是指在输入高和宽的两侧填充元素(通常是0元素)。
输入形状 ,卷积核 ,如果在高的两侧一共填充 行,宽的两侧一共填充 列,那么输出形状是
输出的高和宽会分别增加 。
大多情况下,设置 、 来使输入和输出具有相同的高和宽。假设 是奇数,在高的两侧填充 行。 是偶数,在输入的顶端一侧填充 ,在底端一侧填充 。在宽的两侧填充同理。
示例:输入形状 ,二维卷积层 ,填充数 。求输出形状。
import torch
from torch import nn
# 定义一个函数来计算卷积层。它对输入和输出做相应的升维和降维
def comp_conv2d(conv2d, X):
X = X.view((1, 1) + X.shape) # (1, 1)代表批量大小和通道数均为1
Y = conv2d(X)
return Y.view(Y.shape[2:]) # 排除不关心的前两维:批量和通道
# 注意这里是两侧分别填充1行或列,所以在两侧一共填充2行或列
conv2d = nn.Conv2d(in_channels=1, out_channels=1, kernel_size=(3,3), padding=1)
X = torch.rand(8, 8)
print(comp_conv2d(conv2d, X).shape)
torch.Size([8, 8])
当卷积核的高、宽不同时,可以设置高、宽不同的填充数使输出和输入有相同的形状。
示例 1:卷积核 ,填充数 。求输出形状。
# 使用高为5、宽为3的卷积核。在高和宽两侧的填充数分别为2和1
conv2d = nn.Conv2d(in_channels=1, out_channels=1, kernel_size=(5, 3), padding=(2, 1))
print(comp_conv2d(conv2d, X).shape)
torch.Size([8, 8])
2. 步幅
卷积窗口每次滑动的行数和列数称为步幅()。
图 展示了在高上步幅为 、宽上步幅为 的二维互相关运算。
示例 2:令高和宽上的步幅均为 ,从而使输入的高和宽减半。
conv2d = nn.Conv2d(1, 1, kernel_size=3, padding=1, stride=2)
comp_conv2d(conv2d, X).shape
torch.Size([4, 4])
示例 3:
conv2d = nn.Conv2d(1, 1, kernel_size=(3, 5), padding=(0, 1), stride=(3, 4))
comp_conv2d(conv2d, X).shape
torch.Size([2, 2])
3. 小结
- 填充可以增加输出的高和宽。这常用来使输出与输入具有相同的高和宽。
- 步幅可以减小输出的高和宽,例如输出的高和宽仅为输入的高和宽的 ( 为大于 的整数)。
来自:《动手学深度学习》
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
2017-12-28 Oracle(order by)