卷积的计算 - im2col 1
flyfish
输入
input: [[[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]
[13 14 15 16]]]]
中间过程
tensor([[[[[[ 1., 2., 3.],
[ 5., 6., 7.],
[ 9., 10., 11.]],
[[ 2., 3., 4.],
[ 6., 7., 8.],
[10., 11., 12.]]],
[[[ 5., 6., 7.],
[ 9., 10., 11.],
[13., 14., 15.]],
[[ 6., 7., 8.],
[10., 11., 12.],
[14., 15., 16.]]]]]])
最后
tensor([[ 1., 2., 3., 5., 6., 7., 9., 10., 11.],
[ 2., 3., 4., 6., 7., 8., 10., 11., 12.],
[ 5., 6., 7., 9., 10., 11., 13., 14., 15.],
[ 6., 7., 8., 10., 11., 12., 14., 15., 16.]])
a = 1 W + 2 X + 5 Y + 6 Z b = 2 W + 3 X + 6 Y + 7 Z c = 3 W + 4 X + 7 Y + 8 Z d = 5 W + 6 X + 9 Y + 10 Z e = 6 W + 7 X + 10 Y + 11 Z f = 7 W + 8 X + 11 Y + 12 Z g = 9 W + 10 X + 13 Y + 14 Z h = 10 W + 11 X + 14 Y + 15 Z i = 11 W + 12 X + 15 Y + 16 Z \begin{equation} \begin{aligned} a &= 1W + 2X + 5Y + 6Z \\ b &= 2W + 3X + 6Y + 7Z \\ c &= 3W + 4X + 7Y + 8Z \\ d &= 5W + 6X + 9Y + 10Z \\ e &= 6W + 7X + 10Y + 11Z \\ f &= 7W + 8X + 11Y + 12Z \\ g &= 9W + 10X + 13Y + 14Z \\ h &= 10W + 11X + 14Y + 15Z \\ i &= 11W + 12X + 15Y + 16Z \end{aligned} \end{equation} abcdefghi=1W+2X+5Y+6Z=2W+3X+6Y+7Z=3W+4X+7Y+8Z=5W+6X+9Y+10Z=6W+7X+10Y+11Z=7W+8X+11Y+12Z=9W+10X+13Y+14Z=10W+11X+14Y+15Z=11W+12X+15Y+16Z
(
a
b
c
d
e
f
g
h
i
)
⊤
=
(
1
W
+
2
X
+
5
Y
+
6
Z
2
W
+
3
X
+
6
Y
+
7
Z
3
W
+
4
X
+
7
Y
+
8
Z
5
W
+
6
X
+
9
Y
+
10
Z
6
W
+
7
X
+
10
Y
+
11
Z
7
W
+
8
X
+
11
Y
+
12
Z
8
W
+
9
X
+
12
Y
+
13
Z
10
W
+
11
X
+
14
Y
+
15
Z
11
W
+
12
X
+
15
Y
+
16
Z
)
⊤
{\begin{align} \left( \begin{array}{c} a \\ b \\ c \\ d \\ e \\ f \\ g \\ h \\ i \end{array} \right)^{\top} &= \left( \begin{array}{c} 1W + 2X + 5Y + 6Z \\ 2W + 3X + 6Y + 7Z \\ 3W + 4X + 7Y + 8Z \\ 5W + 6X + 9Y + 10Z \\ 6W + 7X + 10Y + 11Z \\ 7W + 8X + 11Y + 12Z \\ 8W + 9X + 12Y + 13Z \\ 10W + 11X + 14Y + 15Z \\ 11W + 12X + 15Y + 16Z \end{array} \right)^{\top} \end{align} }
abcdefghi
⊤=
1W+2X+5Y+6Z2W+3X+6Y+7Z3W+4X+7Y+8Z5W+6X+9Y+10Z6W+7X+10Y+11Z7W+8X+11Y+12Z8W+9X+12Y+13Z10W+11X+14Y+15Z11W+12X+15Y+16Z
⊤
拆开
(
a
b
c
d
e
f
g
h
i
)
⊤
=
(
W
X
Y
Z
)
(
1
2
3
5
6
7
9
10
11
2
3
4
6
7
8
10
11
12
5
6
7
9
10
11
13
14
15
6
7
8
10
11
12
14
15
16
)
=
(
1
W
+
2
X
+
5
Y
+
6
Z
2
W
+
3
X
+
6
Y
+
7
Z
3
W
+
4
X
+
7
Y
+
8
Z
5
W
+
6
X
+
9
Y
+
10
Z
6
W
+
7
X
+
10
Y
+
11
Z
7
W
+
8
X
+
11
Y
+
12
Z
8
W
+
9
X
+
12
Y
+
13
Z
10
W
+
11
X
+
14
Y
+
15
Z
11
W
+
12
X
+
15
Y
+
16
Z
)
⊤
{\begin{align} \left( \begin{array}{c} a \\ b \\ c \\ d \\ e \\ f \\ g \\ h \\ i \end{array} \right)^{\top} &= \left( \begin{array}{cccc} W & X & Y & Z \end{array} \right) \left( \begin{array}{ccccccccc} 1 & 2 & 3 & 5 & 6 & 7 & 9 & 10 & 11 \\ 2 & 3 & 4 & 6 & 7 & 8 & 10 & 11 & 12 \\ 5 & 6 & 7 & 9 & 10 & 11 & 13 & 14 & 15 \\ 6 & 7 & 8 & 10 & 11 & 12 & 14 & 15 & 16 \end{array} \right) \\ &= \left( \begin{array}{c} 1W + 2X + 5Y + 6Z \\ 2W + 3X + 6Y + 7Z \\ 3W + 4X + 7Y + 8Z \\ 5W + 6X + 9Y + 10Z \\ 6W + 7X + 10Y + 11Z \\ 7W + 8X + 11Y + 12Z \\ 8W + 9X + 12Y + 13Z \\ 10W + 11X + 14Y + 15Z \\ 11W + 12X + 15Y + 16Z \end{array} \right)^{\top} \end{align} }
abcdefghi
⊤=(WXYZ)
1256236734785691067101178111291013141011141511121516
=
1W+2X+5Y+6Z2W+3X+6Y+7Z3W+4X+7Y+8Z5W+6X+9Y+10Z6W+7X+10Y+11Z7W+8X+11Y+12Z8W+9X+12Y+13Z10W+11X+14Y+15Z11W+12X+15Y+16Z
⊤
import numpy as np
import torch
# k = kernel
# s = stride
def im2col(img, kernel_size, stride=1,padding=0):
N, C, H, W = img.shape
k_h, k_w = kernel_size
s = stride
out_h = (H - k_h)//s + 1
out_w = (W - k_w)//s + 1
col = torch.zeros((N, C, k_h, k_w, out_h, out_w))
for y in range(k_h):
h_lim = y + s * out_h
for x in range(k_w):
w_lim = x + s*out_w
col[:, :, y, x, :, :] = img[:, :, y:h_lim:s, x:w_lim:s]
print(col)
col = col.permute(1, 2, 3, 0, 4, 5 ).contiguous().reshape(C * k_h * k_w,N * out_h * out_w)
return col
image = np.arange(1, 17).reshape(-1, 1, 4, 4)#模拟PyTorch用的NCHW
print("input:",image)
x = torch.tensor(image)
# 测试
print(im2col(x,(2,2)))
其他方式的展开
col = col.permute(0, 4, 5, 1, 2, 3).reshape(N*out_h*out_w, -1)
tensor([[ 1., 2., 5., 6.],
[ 2., 3., 6., 7.],
[ 3., 4., 7., 8.],
[ 5., 6., 9., 10.],
[ 6., 7., 10., 11.],
[ 7., 8., 11., 12.],
[ 9., 10., 13., 14.],
[10., 11., 14., 15.],
[11., 12., 15., 16.]])
参考
High Performance Convolutional Neural Networks forDocument Processing