Padding,Stride,Channels

Note

padding,stride,channels都是卷积运算的参数,有了它们我们能更好地控制卷积运算

Padding

观察前一节的运算我们可以注意到,边缘像素参与的卷积运算次数会比中心像素更少,这在某种程度上丢失了边缘像素的信息。

为了修正这一点,我们在input外层人为地加若干圈0,目的是让所有像素参与的运算次数一致,这就是padding。

jupyter

假设我们上下各填充 ph 行,左右各填充 pw 列, 那么输出的shape:

(nhkh+2ph+1)×(nwkw+2pw+1)

kh,kw 为奇数,我们可以令 ph=kh12,pw=kw12 使得输入和输出的shape相同。

Stride

jupyter

相邻subset的信息是差不多的,为了减少冗余的运算,我们可以一次跨越多个格。

stride即一次跨多少个格,假设我们一次横跨 sw 格,纵跨 sh 格,那么输出的shape:

nhkh+2ph+1sh×nwkw+2pw+1sw

Channels

每个 RGB 彩色图片的shape: 3×h×w.

在图像处理中,除了长、宽,还有通道这个维度。kernel的通道数必须和input的通道数相同,结果还是对应元素相加再相乘:

jupyter

有几个kernel,输出的通道数就是几:

jupyter

import torch
import torch.nn.functional as F

# (batch_size, in_channel, in_h, in_w)
inputs = torch.rand(1, 3, 9, 9)
# (out_channel, in_channel, kernel_h, kernel_w)
kernels = torch.rand(2, 3, 3, 3)
Copy to clipboard

output的高和宽:

93+21+13×93+21+13=3×3
output = F.conv2d(inputs, kernels, padding=1, stride=3)
# as expected
output.shape
Copy to clipboard
torch.Size([1, 2, 3, 3])
Copy to clipboard