卷积和转置卷积的输出尺寸计算
卷积
h'是输出的高,h是输入的高,k_h是卷积核的高
w类似
stride=1
h' = h - k_h + padding*2 + 1
通用公式
stride=1就是上面的公式
h' = (h - k_w + 2*padding + stride)//stride
一些常见的卷积
- 高宽不变的卷积:
kernel_size=3, padding=1
,这样的卷积常用于特征提取、加深网络层数、避免信息丢失,以及在深层网络(如 ResNet)中保持输入输出尺寸一致。 - 宽高减半的卷积:如
kernel_size=3, stride=2, padding=1
,一般是将stride=2
,若kernel_size=5
的话,padding
就要为2了。(也可以用kernel_size=2,stride=2
的池化来做。两者各有优点:卷积核是可学习的参数,可以提取复杂的特征,但计算量比池化更大;池化没有可学习的参数,计算效率高,同时有一定的平滑特征图的作用,但会丢失一些细节信息)。 - 1×1的卷积:1×1 卷积改变特征图的通道数,而不改变空间维度(即图像的高和宽)。通常用于降维从而减少计算复杂度,或者升维进行更丰富的特征表示。1×1也可以认为是逐像素的全连接层(其对每个像素位置上不同通道的特征进行加权线性组合。这与全连接层的机制非常相似,都是对输入的所有特征进行线性组合)。
转置卷积
计算公式,其实就是上面公式的逆运算
h' = h*stride - 2*padding + k_w - stride
若想要将图像高宽扩大p倍,就可以让stride=p,然后调整k_w和padding,比如,input image shape: torch.Size([561, 728, 3])
变为 output image shape: torch.Size([1122, 1456, 3])
,先让stride=2
,然后kernel_size=4
(这样滑动一次只滑过窗口的一半),然后看padding
取多少,可以让 -2*padding + k_w - stride = 0
,这里padding就取1。
再比如,高宽被缩小32倍后为 torch.Size([1, 512, 10, 15])
,想要恢复原尺寸:首先stride = 32
,kernel_size
还是取stride
的两倍64,然后让 -2*padding + k_w -stride=0
,那么padding
就取16