2D卷积本质上就是相关运算,二者只差一个转置的关系。今天记一下2D卷积层输出维度和参数(input shape,kernel size,padding,stride)之间的关系,虽然是小学数学,但还是怕以后忘了。
查阅pytorch的官方文档torch.nn.Conv2d,参数和输出维度如下:
解释几个重要的参数:
因此暂先不考虑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 h−k0次,加上起点,因此输出的维度应该是 ( h − k 0 + 1 , w − k 1 + 1 ) (h-k_0+1,w-k_1+1) (h−k0+1,w−k1+1)
\space
2.考虑stride
stride就相当于跨步走,设高和宽的stride分别为 s 0 , s 1 s_0,s_1 s0,s1。
因此移动前的计算不变,移动后的计算出的结果数应当为 ( h − k 0 ) (h-k_0) (h−k0)和 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 ⌊s0h−k0⌋+1,⌊s1w−k1⌋+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 ⌊s0h−k0+1⌋,⌊s1w−k1+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+2p0−k0+1⌋,⌊s1w+2p1−k1+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+(d0−1)(k0−1)
代入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+(d0−1)(k0−1)]+1⌋,⌊s1w+2p1−[k1+(d1−1)(k1−1)]+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+2p0−d0(k0−1)−1+1⌋,⌊s1w+2p1−d1(k1−1)−1+1⌋