【杂记】对2D卷积层输出维度的理解


2D卷积本质上就是相关运算,二者只差一个转置的关系。今天记一下2D卷积层输出维度和参数(input shape,kernel size,padding,stride)之间的关系,虽然是小学数学,但还是怕以后忘了。


查阅pytorch的官方文档torch.nn.Conv2d,参数和输出维度如下:

在这里插入图片描述

解释几个重要的参数:

  1. dilation:对kernel进行膨胀(在核的元素中间加空格)操作,默认为1,即不膨胀
  2. out_channels:输出维度,没记错应是kernel的数目.

因此暂先不考虑out channels,主要说高和宽。

对dilation进一步解释, 参照github的动图:

在这里插入图片描述

也就是,dilation就是跨元素进行卷积,如果是3x3的卷积核,在dilation=2的时候,就相当于在元素之间进行空格填充(效果上等同于填充0),也就相当于一个5x5的卷积核。
  \space  

对输出维度的理解

1.最简单的情形:no padding,no stride, no dilation

假设:输入的二维图像的高和宽分别为 ( h , w ) (h,w) (h,w),kernel size为 ( k 0 , k 1 ) (k_0,k_1) (k0,k1),两个维度(高和宽)都是等价的,因此我们只需要关注一个维度的大小即可。

在这里插入图片描述

如图,kernel从起点开始,为了方便以后的讨论,我们将起点分离出来,也就是将移动前(虚线左)和移动后(虚线右)分别讨论。

很简单,要走完全程,要移动(也就是计算) h − k 0 h-k_0 hk0次,加上起点,因此输出的维度应该是 ( h − k 0 + 1 , w − k 1 + 1 ) (h-k_0+1,w-k_1+1) (hk0+1wk1+1)
  \space  
2.考虑stride

stride就相当于跨步走,设高和宽的stride分别为 s 0 , s 1 s_0,s_1 s0,s1

因此移动前的计算不变,移动后的计算出的结果数应当为 ( h − k 0 ) (h-k_0) (hk0) s 0 s_0 s0的商再向下取整,理解请看图:

在这里插入图片描述
  \space  
图的解释:考虑8个点,核大小为3,步幅为2.移动后原函数还剩余5个点,步幅为2刚好够走2次,还余下的点就不走了。 因此余下的点就是对 s 0 s_0 s0的商,这个数一定小于 s 0 s_0 s0。这就是向下取整的来由。最后再有移动前的一次。

因此输出维度为:

⌊ h − k 0 s 0 ⌋ + 1 , ⌊ w − k 1 s 1 ⌋ + 1 \lfloor \frac{h-k_0}{s_0} \rfloor + 1,\lfloor \frac{w-k_1}{s_1} \rfloor + 1 s0hk0+1,s1wk1+1

也即:

⌊ h − k 0 s 0 + 1 ⌋ , ⌊ w − k 1 s 1 + 1 ⌋ \lfloor \frac{h-k_0}{s_0} + 1\rfloor,\lfloor \frac{w-k_1}{s_1} + 1\rfloor s0hk0+1,s1wk1+1
  \space  
3.考虑padding

padding的本质是为了不丢失边缘信息,进而对原图像进行扩充。因此padding相当于改变了原图像的大小,注意pytorch的padding参数是单边的,高和宽的padding参数分别设为 p 0 , p 1 p_0,p_1 p0,p1,因此相应大小变为 h + 2 p 0 , w + 2 p 1 h+2p_0,w+2p_1 h+2p0,w+2p1,代入2. 中的式子,输出维度为:

⌊ h + 2 p 0 − k 0 s 0 + 1 ⌋ , ⌊ w + 2 p 1 − k 1 s 1 + 1 ⌋ \lfloor \frac{h+2p_0-k_0}{s_0} + 1\rfloor,\lfloor \frac{w+2p_1-k_1}{s_1} + 1\rfloor s0h+2p0k0+1,s1w+2p1k1+1

  \space  
4. 考虑dilation

假设高,宽维度的dilation分别为 d 0 , d 1 d_0,d_1 d0,d1 d 0 = 1 d_0=1 d0=1时表示不填充,等于2时表示在元素间填充一个space,因此填充后的kernel size变为:
k 0 ′ = k 0 + ( d 0 − 1 ) ( k 0 − 1 ) k_0'=k_0+(d_0-1)(k_0-1) k0=k0+(d01)(k01)

代入3. 中的式子,输出维度为:
⌊ h + 2 p 0 − [ k 0 + ( d 0 − 1 ) ( k 0 − 1 ) ] s 0 + 1 ⌋ , ⌊ w + 2 p 1 − [ k 1 + ( d 1 − 1 ) ( k 1 − 1 ) ] s 1 + 1 ⌋ \lfloor \frac{h+2p_0-[k_0+(d_0-1)(k_0-1)]}{s_0} + 1\rfloor,\lfloor \frac{w+2p_1-[k_1+(d_1-1)(k_1-1)]}{s_1} + 1\rfloor s0h+2p0[k0+(d01)(k01)]+1,s1w+2p1[k1+(d11)(k11)]+1

也即:

⌊ h + 2 p 0 − d 0 ( k 0 − 1 ) − 1 s 0 + 1 ⌋ , ⌊ w + 2 p 1 − d 1 ( k 1 − 1 ) − 1 s 1 + 1 ⌋ \lfloor \frac{h+2p_0-d_0(k_0-1)-1}{s_0} + 1\rfloor,\lfloor \frac{w+2p_1-d_1(k_1-1)-1}{s_1} + 1\rfloor s0h+2p0d0(k01)1+1,s1w+2p1d1(k11)1+1

猜你喜欢

转载自blog.csdn.net/wjpwjpwjp0831/article/details/121714172
2D