一.填充
1.作用:
为了防止丢失边缘像素。如240x240的像素图像,经过10层5x5卷积,根据输出形状计算公式 (w-k+1) x (h-k+1)计算出输出形状变成了200x200。
2.方法:
最常用的方法是填充0。如下:
3.公式:计算填充原图像后的输出形状
假设填充p行(上面填充p/2行,下面填充p/2行),p列。输出大小为:
w = (原图片h行 + 填充p行 -k + 1)
h = (原图片w列 + 填充p列 -k + 1)
相当于输出的高度和宽度直接增加p行和p列
4.应用:使输入和输出具有相同的形状
设置
p_w = k_w - 1
p_h = k_h - 1
5.补充:为什么卷积核需要设置成奇数?
如果需要输入输出具有相同形状
,那么一般设置卷积核
为奇数
,这样填充的w和h将会是偶数
,就可以让顶部和底部填充相同的行,左侧右侧填充相同的列
。
6.代码
import torch
from torch import nn
def comp_conv2d(conv2d,X):
# 输入X的shape为(8,8),输出为(1,1,8,8),1,1表示批量大小和通道数
X = X.reshape((1,1) + X.shape)
Y = conv2d(X)
return Y
#随机生成一个8*8的X
X = torch.rand(size=(8,8))
# 1,1表示通道数和维度
conv2d = nn.Conv2d(1,1,kernel_size=3,padding=1)
comp_conv2d(conv2d,X).shape
输出结果:torch.Size([1, 1, 8, 8])
二.步幅
1.是什么
卷积窗口每次滑动元素的数量,也叫步长
2.例子
垂直步幅为3,水平步幅为2的卷积运算:
输出形状计算
w = (原图片行数 + 填充行数 - k + 1 + 水平步幅
) / 水平步幅
h = (原图片列数 +填充列数 - k + 1 + 垂直步幅
) / 垂直步幅
如上图:
原图片行数和列数 = (3,3)
填充行数和列数 = (2,2)
k = (2,2)
水平步幅,垂直步幅 = (2,3)
3+2-2+1 +2 / 2 = 4 / 2 = 2
3+2-2+1 +3 / 3 = 7 / 3 = 2.3333取整