1、卷积运算和代码示例
一个简单的例子,我们给一个等待这被卷积的矩阵
[
1
2
3
4
5
6
7
8
9
]
\begin{bmatrix} 1 & 2 & 3\\ 4& 5 & 6\\ 7 & 8 & 9\\ \end{bmatrix}
⎣
⎡147258369⎦
⎤
再给一个简单的卷积核为
[
1
1
1
1
]
\begin{bmatrix} 1 & 1\\ 1& 1\\ \end{bmatrix}
[1111]
不设置padding
,并且stride=1
,我们可以简单的计算得到
[
12
16
24
28
]
\begin{bmatrix} 12 & 16\\ 24& 28\\ \end{bmatrix}
[12241628]
在torch中就是如此计算的
model = nn.Conv2d(in_channels=1, out_channels=1, kernel_size=2,stride=1,padding=0)
x = torch.tensor([[[1,2,3],[4,5,6],[7,8,9]]], dtype=torch.float32).unsqueeze(0)
model.weight.data = torch.tensor([[[[1,1],[1,1]]]], dtype=torch.float32)
model.bias.data = torch.zeros(1)
model(x)
结果可以看见为
tensor([[[[12, 16],
[24, 28]]]], grad_fn=<ThnnConv2DBackward>)
2、反卷积运算和代码示例
假设我们对
[
12
16
24
28
]
\begin{bmatrix} 12 & 16\\ 24& 28\\ \end{bmatrix}
[12241628]
进行反卷积,padding=0,stride=1
,卷积核为
[
1
1
1
1
1
1
1
1
1
]
\begin{bmatrix} 1 & 1 & 1\\ 1& 1 & 1\\ 1& 1 & 1\\ \end{bmatrix}
⎣
⎡111111111⎦
⎤
这等价于对(见下面解释)
[
0
0
0
0
0
0
0
0
0
0
0
0
0
0
12
16
0
0
0
0
24
28
0
0
0
0
0
0
0
0
0
0
0
0
0
0
]
(1)
\begin{bmatrix} 0 &0 &0 & 0 &0 &0 \\ 0 &0 &0 & 0 &0 &0 \\ 0 &0 &12 & 16 &0 &0\\ 0 &0 & 24& 28 &0 &0\\ 0 &0 &0 & 0 &0 &0 \\ 0 &0 &0 & 0 &0 &0 \\ \end{bmatrix}\tag{1}
⎣
⎡0000000000000012240000162800000000000000⎦
⎤(1)进行卷积操作。结果应该为
[
12
28
28
16
36
80
80
44
36
80
80
44
24
52
52
28
]
\begin{bmatrix} 12 & 28 & 28 & 16\\ 36& 80 & 80 &44\\ 36& 80 & 80 &44\\ 24& 52 & 52 &28\\ \end{bmatrix}
⎣
⎡12363624288080522880805216444428⎦
⎤
看下pytorch计算结果
model = nn.ConvTranspose2d(in_channels=1, out_channels=1, kernel_size=3,stride=1,padding=0)
x = torch.tensor([[[12,16],[24,28]]], dtype=torch.float32).unsqueeze(0)
model.weight.data = torch.tensor([[[[1,1,1],[1,1,1],[1,1,1]]]], dtype=torch.float32)
model.bias.data = torch.zeros(1)
print(model(x))
结果为
tensor([[[[12., 28., 28., 16.],
[36., 80., 80., 44.],
[36., 80., 80., 44.],
[24., 52., 52., 28.]]]], grad_fn=<SlowConvTranspose2DBackward>)
提一下计算方式
{
i
+
2
p
−
k
s
+
1
=
o
i
′
+
2
p
′
−
k
s
+
1
=
o
′
\begin{cases} \frac{i +2p -k}{s} + 1=o \\ \frac{i' +2p' -k}{s} + 1=o' \end{cases}
{si+2p−k+1=osi′+2p′−k+1=o′
第一行是4->2的卷积过程,第二行是6->4的卷积过程。
反卷积是2->4的的过程
所以这里,有 i = o ′ , o = i ′ i=o',o=i' i=o′,o=i′。我们的输入x 就是第一行的o, 也就是第二行的 i ′ i' i′,为2
通过消去 i , o ′ i,o' i,o′,我们可以得到 p ′ = k − p − 1 = 3 − 0 − 1 = 2 p'=k-p-1=3-0-1=2 p′=k−p−1=3−0−1=2
所以才有的矩阵(1)