Convolution Arithmetic

151 阅读1分钟

参考论文:A guide to convolution arithmetic for deep learning 论文地址:arxiv.org/abs/1603.07… 等效卷积核大小计算:K=k+(k−1)∗(r−1) (k为原大小,K为等效大小, r 为 dilation) -> 无空洞时dilation为1

注意: floor(x-1)//2 + 1 == x//2 <- 当且仅当 x为偶数! 这种padding出现在ResNet中的downsample中


1. Convolution arithmetic

核心公式:(根据这个公式,各种卷积的output size的计算其实都是一类

卷积:osize=insize+2pkstride+1逆卷积:o=s(i1)+k2p卷积:o_{size} = \frac{in_{size} + 2p - k}{stride} + 1 \\ 逆卷积:o' = s(i' - 1)+k-2p

i:input size o:output size p:padding size k:kernel size

1. No zero padding, unit strides

o=(ik)+1o = (i-k)+1

2. Zero padding, unit strides

o=(i+2pk)+1o = (i + 2p - k) + 1

3. Half(same) padding, [unit strides - same padding必须要s=1, o = i]

要求:k=2n+1, p = floor(k/2) =n

o=i+2floor(k/2)k+1=io = i + 2*floor(k/2) -k + 1 = i

4. Full padding [o = i + p]

o=i+2(k1)k+1=i+(k1)o = i + 2*(k-1) - k + 1 = i + (k-1)

5. No zero padding , non-unit strides

o=floor(iks)+1o = floor(\frac{i-k}{s}) + 1

6. Zero padding, non-unit strides

o=floor(i+2pks)+1o = floor(\frac{i+2p-k}{s})+1

2. Pooling arithmetic

o=floor(iks)+1o = floor(\frac{i-k}{s})+1

3. Transposed convolution arithmetic

这里相对较难,需要不断重复

在这里插入图片描述

试想,将输出展平作为列,输入展平作为行,矩阵的每个元素就是输入元素计算卷积时所使用的权重,这样一来便可以计算逆。

然后将输入矩阵展平为列向量X,将此权重矩阵与X做矩阵乘法,得到一个4维的列向量,随后resize为(2,2)的矩阵,即输出矩阵。

{convolution:XC=Ytransposed convolution:YCT=X\begin{cases} convolution: X \cdot C = Y \\ transposed\ convolution: Y \cdot C^T = X \end{cases}

1. No zero padding, unit strides, transposed(与前面进行对比)

o=i+(k1)o' = i' + (k-1)

2. Zero padding, unit strides, transposed

o=i+(k1)2po' = i' + (k-1) - 2p

3. Half(same) padding, transposed

假定k=2n+1(即为奇数),p=floor(k/2) = n

o=i+(k1)2p=i+2n2no' = i' + (k-1) - 2p = i' + 2n - 2n

4. Full padding, transposed

p = k-1

o=i+(k1)2p=i(k1)o' = i' + (k-1) - 2p = i' - (k-1)

5. No zero padding, non-unit strides, transposed

假设o'-k能整除s

o=s(i1)+ko' = s(i'-1) + k

6. Zero padding, non-unit strides, transposed

假设o'+2p-k能整除s

o=s(i1)+k2po' = s(i'-1)+k-2p