20- 填充和步幅
20- 填充和步幅
1. 填充
填充

维度变化:

两种不同的卷积方式:
①
②

2. 步幅
想法来源:如果按照原来的操作
步幅是指行

维度变化

3. 总结
-
填充和步幅是卷积层的超参数
-
填充
(padding) 在输入周围添加额外的行/ 列,来控制输出形状的减少量 -
步幅
(stride) 是每次滑动核窗口时的行/ 列的步长,可以成倍地减少输出形状
4. 代码
4.1 填充和步幅
导入包,定义
import torch
from torch import nn
def comp_conv2d(conv2d, X):
X = X.reshape((1, 1) + X.shape) #X的维度之前加入批量大小数(batch_size)和输入通道数(channel_in)
Y = conv2d(X)
return Y.reshape(Y.shape[2:]) #去掉前面的两维后(原来四维) 进行输出
4.2 padding
在所有侧边填充
conv2d = nn.Conv2d(1, 1, kernel_size=3, padding=1) #输入输出通道数为1, 卷积核大小3x3, 填充为1(上下左右各填充一行)
X = torch.rand(size=(8, 8))
comp_conv2d(conv2d, X).shape
>>> torch.Size([8, 8])
填充不同的高度和宽度
conv2d = nn.Conv2d(1, 1, kernel_size=(5, 3), padding=(2, 1))
comp_conv2d(conv2d, X).shape
>>> torch.Size([8, 8])
4.3 stride
将高度和宽度的步幅设置为
conv2d = nn.Conv2d(1, 1, kernel_size=3, padding=1, stride=2)
comp_conv2d(conv2d, X).shape
>>> torch.Size([4, 4])
一个稍微复杂的例子
conv2d = nn.Conv2d(1, 1, kernel_size=(3, 5), padding=(0, 1), stride=(3, 4))
comp_conv2d(conv2d, X).shape
>>> torch.Size([2, 2])