基本概念
1 卷积层的尺寸计算
- feature map有四个维度,分别是N×H×W×C,而卷积核的输入通道数由feature map的C决定,输出通道数有它本身决定
- 输出矩阵的feature map
F
o
u
t
F_{out}
Fout的
H
o
u
t
和
W
o
u
t
H_{out}和W_{out}
Hout和Wout由卷积核大小决定,计算如下:
2感受野的计算
- 举一个例子,原始图像为
5
∗
5
5*5
5∗5 ,卷积核(Kernel Size)为
3
∗
3
3*3
3∗3 ,padding 为 1,stride为 2 ,依照此卷积规则,连续做两次卷积。熟悉卷积过程的朋友都知道第一次卷积结果是
3
∗
3
3*3
3∗3 大小的feature map,第二次卷积结果是
2
∗
2
2*2
2∗2大小的feature map。计算如下:第一层feature的大小
F
1
=
(
5
−
3
+
2
∗
1
)
/
2
+
1
=
3
F_{1}=(5-3+2*1)/2+1=3
F1=(5−3+2∗1)/2+1=3,第二层feature map的大小
F
2
=
(
3
−
3
+
2
∗
1
)
/
2
+
1
=
2
F_{2}=(3-3+2*1)/2+1=2
F2=(3−3+2∗1)/2+1=2整个过程如图所示:
一个多层卷积构成的FCN感受野等于一个conv rxr,即一个卷积核很大的单层卷积,其kernelsize=r,padding=P,stride=S。感受野的计算有两种方式一是从前到后,另一种从后到前。
2.1从前往到后计算
上图第一层的感受野计算为
r
=
1
∗
2
+
(
3
−
2
)
=
3
r=1*2+(3-2)=3
r=1∗2+(3−2)=3,第二层为
r
=
3
∗
2
+
(
3
−
2
)
=
7
r=3*2+(3-2)=7
r=3∗2+(3−2)=7,上述的r,S,P的值为:r=7
S
=
2
∗
2
=
4
S=2*2=4
S=2∗2=4
P=floor(r/2-0.5)=3
即上述两个连续的卷积可由一个
5
∗
5
5*5
5∗5 padding为3的feature map 由kernel为
7
∗
7
7*7
7∗7 stride为4的卷积核得到。
2.2由后往前的计算
计算公式为
R
F
n
−
1
=
(
R
F
n
−
1
)
∗
S
+
k
e
r
n
e
l
RF_{n-1}=(RF_{n}-1)*S+kernel
RFn−1=(RFn−1)∗S+kernel。
推荐一个感受野的计算网站Fomoro AI
3反卷积(deconvolution,Transposed Convolution)
反卷积起到的是增大featuremap的作用,方法是将输入的featuremap按照stride进行扩充,然后在进行卷积运算。
输出层的尺寸计算是正常卷积的反过程 在
(
o
+
2
∗
p
−
k
)
%
s
=
0
(o+2*p-k) \% s =0
(o+2∗p−k)%s=0情况下,若取余不为0,输出的尺寸要加上余数。实际上没人关注反卷积的感受野,但是理论层面上感受野是降低的。反卷积相比upsample的优势在于,反卷积有参数可学,能更加的逼近原图,填充其中的细节。
import torch
import torch.nn as nn
from torch.autograd import Variable
class Net(nn.Module):
def __init__(self):
super().__init__()
self.conv1=nn.Conv2d(2,4,3,1,1)
self.conv2=nn.Conv2d(4,8,3,1,padding=1,dilation=3)
self.conv3=nn.ConvTranspose2d(8,16,3,2,1,0)
def forward(self, input):
x=self.conv1(input)
x1=self.conv2(x)
x2=self.conv3(x1)
return x2
my_net=Net()
input=Variable(torch.rand(1,2,7,7))
out=my_net(input)
4空洞卷积(Dilated convolution)
空洞卷积的设计是为了增大感受野,其featuremap理论上只会变小或不变。其输出featuremap的计算方式
o
=
(
i
−
(
k
+
(
k
−
1
)
∗
(
d
−
1
)
+
2
∗
p
)
/
s
+
1
)
o=(i-(k+(k-1)*(d-1)+2*p)/s +1)
o=(i−(k+(k−1)∗(d−1)+2∗p)/s+1),填充后的卷积核大小为7,空洞卷积的感受野为
(
k
+
1
)
∗
(
d
−
1
)
+
k
(k+1)*(d-1)+k
(k+1)∗(d−1)+k,空洞卷积会增大感受野,但由于填充后的卷积核除了图中红色点的位置外都为0,会导致原来连续的图片经过空洞卷积后不连续。
5 卷积中的批处理
卷积中的批处理,需要将在各层间传递的数据保存为4维数据,即(batch_num, channel, height, width)的顺序保存数据,下图中N就是batch_num。