卷积类型
相关文章:
Convolution arithmetic(不同卷积的 gif 图)
一文读懂深度学习中的各种卷积
一文带你了解深度学习中的各种卷积(上)
一文带你了解深度学习中的各种卷积(下)
深度学习中的卷积大致可以为以下几类:
- 2D卷积
- 3D卷积
- 1*1卷积
- 转置卷积(Transposed Convolution)
- 膨胀卷积 / 扩张卷积 / 空洞卷积(Dilated Convolution)
- 可分卷积(Separable Convolution)
a). 空间可分卷积(Spatially Separable Convolution)
b). 深度可分卷积(Depthwise Separable Convolution)
关于转置卷积的详细介绍可以参考另外一篇博客:
【深度学习】转置卷积(Transposed Convolution)
卷积神经网络中的卷积函数
相关文章:
A guide to convolution arithmetic for deep learning
卷积神经网络特征图大小的计算
TensorFlow中CNN的两种padding方式“SAME”和“VALID”
TensorFlow中的Padding到底是怎么在填充?
Tensorflow卷积与反卷积
Pytorch中的卷积函数
2D Convolution:torch.nn.Conv2d
计算特征图大小
I
n
p
u
t
:
(
N
,
C
i
n
,
H
i
n
,
W
i
n
)
Input:\left(N,\;C_{in},\;H_{in},\;W_{in}\right)
Input:(N,Cin,Hin,Win)
O
u
t
p
u
t
:
(
N
,
C
o
u
t
,
H
o
u
t
,
W
o
u
t
)
Output:\left(N,\;C_{out},\;H_{out},\;W_{out}\right)
Output:(N,Cout,Hout,Wout)
H o u t = ⌊ H i n + 2 × p a d d i n g [ 0 ] − d i l a t i o n [ 0 ] × ( k e r n e l _ s i z e [ 0 ] − 1 ) − 1 s t r i d e [ 0 ] + 1 ⌋ H_{out}=\left\lfloor\frac{H_{in}+2\times padding\lbrack0\rbrack-dilation\lbrack0\rbrack\times\left(kernel\_size\lbrack0\rbrack-1\right)-1}{stride\lbrack0\rbrack}+1\right\rfloor Hout=⌊stride[0]Hin+2×padding[0]−dilation[0]×(kernel_size[0]−1)−1+1⌋ W o u t = ⌊ W i n + 2 × p a d d i n g [ 1 ] − d i l a t i o n [ 1 ] × ( k e r n e l _ s i z e [ 1 ] − 1 ) − 1 s t r i d e [ 1 ] + 1 ⌋ W_{out}=\left\lfloor\frac{W_{in}+2\times padding\lbrack1\rbrack-dilation\lbrack1\rbrack\times\left(kernel\_size\lbrack1\rbrack-1\right)-1}{stride\lbrack1\rbrack}+1\right\rfloor Wout=⌊stride[1]Win+2×padding[1]−dilation[1]×(kernel_size[1]−1)−1+1⌋
2D Transposed Convolution:torch.nn.ConvTranspose2d
计算特征图大小
I
n
p
u
t
:
(
N
,
C
i
n
,
H
i
n
,
W
i
n
)
Input:\left(N,\;C_{in},\;H_{in},\;W_{in}\right)
Input:(N,Cin,Hin,Win)
O
u
t
p
u
t
:
(
N
,
C
o
u
t
,
H
o
u
t
,
W
o
u
t
)
Output:\left(N,\;C_{out},\;H_{out},\;W_{out}\right)
Output:(N,Cout,Hout,Wout)
H
o
u
t
=
(
H
i
n
−
1
)
×
s
t
r
i
d
e
[
0
]
−
2
×
p
a
d
d
i
n
g
[
0
]
+
d
i
l
a
t
i
o
n
[
0
]
×
(
k
e
r
n
e
l
_
s
i
z
e
[
0
]
−
1
)
+
o
u
t
p
u
t
_
p
a
d
d
i
n
g
[
0
]
+
1
H_{out}=\left(H_{in}-1\right)\times stride\lbrack0\rbrack-2\times padding\lbrack0\rbrack+dilation\lbrack0\rbrack\times\left(kernel\_size\lbrack0\rbrack-1\right)+output\_padding\lbrack0\rbrack+1
Hout=(Hin−1)×stride[0]−2×padding[0]+dilation[0]×(kernel_size[0]−1)+output_padding[0]+1
W
0
u
t
=
(
W
i
n
−
1
)
×
s
t
r
i
d
e
[
1
]
−
2
×
p
a
d
d
i
n
g
[
1
]
+
d
i
l
a
t
i
o
n
[
1
]
×
(
k
e
r
n
e
l
_
s
i
z
e
[
1
]
−
1
)
+
o
u
t
p
u
t
_
p
a
d
d
i
n
g
[
1
]
+
1
W_{0ut}=\left(W_{in}-1\right)\times stride\lbrack1\rbrack-2\times padding\lbrack1\rbrack+dilation\lbrack1\rbrack\times\left(kernel\_size\lbrack1\rbrack-1\right)+output\_padding\lbrack1\rbrack+1
W0ut=(Win−1)×stride[1]−2×padding[1]+dilation[1]×(kernel_size[1]−1)+output_padding[1]+1
Tensorflow中的卷积函数
2D Convolution:tf.nn.conv2d
计算特征图大小
I
n
p
u
t
:
(
N
,
C
i
n
,
H
i
n
,
W
i
n
)
Input:\left(N,\;C_{in},\;H_{in},\;W_{in}\right)
Input:(N,Cin,Hin,Win)
O
u
t
p
u
t
:
(
N
,
C
o
u
t
,
H
o
u
t
,
W
o
u
t
)
Output:\left(N,\;C_{out},\;H_{out},\;W_{out}\right)
Output:(N,Cout,Hout,Wout)
-
padding = “SAME” :
H o u t = ⌈ H i n s t r i d e [ 0 ] ⌉ H_{out}=\left\lceil\frac{H_{in}}{stride\lbrack0\rbrack}\right\rceil Hout=⌈stride[0]Hin⌉ W o u t = ⌈ W i n s t r i d e [ 1 ] ⌉ W_{out}=\left\lceil\frac{W_{in}}{stride\lbrack1\rbrack}\right\rceil Wout=⌈stride[1]Win⌉
等价于
H o u t = ⌊ H i n + 2 × p a d d i n g [ 0 ] − k e r n a l _ s i z e [ 0 ] s t r i d e [ 0 ] + 1 ⌋ = ⌊ H i n s t r i d e [ 0 ] + s t r i d e [ 0 ] − 1 s t r i d e [ 0 ] ⌋ H_{out}=\left\lfloor\frac{H_{in}+2\times padding\lbrack0\rbrack-kernal\_size\lbrack0\rbrack}{stride\lbrack0\rbrack}+1\right\rfloor=\left\lfloor\frac{H_{in}}{stride\lbrack0\rbrack}+\frac{stride\lbrack0\rbrack-1}{stride\lbrack0\rbrack}\right\rfloor Hout=⌊stride[0]Hin+2×padding[0]−kernal_size[0]+1⌋=⌊stride[0]Hin+stride[0]stride[0]−1⌋ W o u t = ⌊ W i n + 2 × p a d d i n g [ 1 ] − k e r n a l _ s i z e [ 1 ] s t r i d e [ 1 ] + 1 ⌋ = ⌊ W i n s t r i d e [ 1 ] + s t r i d e [ 1 ] − 1 s t r i d e [ 1 ] ⌋ W_{out}=\left\lfloor\frac{W_{in}+2\times padding\lbrack1\rbrack-kernal\_size\lbrack1\rbrack}{stride\lbrack1\rbrack}+1\right\rfloor=\left\lfloor\frac{W_{in}}{stride\lbrack1\rbrack}+\frac{stride\lbrack1\rbrack-1}{stride\lbrack1\rbrack}\right\rfloor Wout=⌊stride[1]Win+2×padding[1]−kernal_size[1]+1⌋=⌊stride[1]Win+stride[1]stride[1]−1⌋
其中 p a d d i n g = ( k e r n a l _ s i z e − 1 ) / 2 padding=\left(kernal\_size-1\right)/2 padding=(kernal_size−1)/2,此时可以保证所有的内容都参与卷积,不会丢弃任何列
根据上述公式可以逆向推导padding值:
p a d d i n g [ 0 ] = 1 2 [ ( H o u t − 1 ) × s t r i d e [ 0 ] + k e r n a l _ s i z e [ 0 ] − H i n ] padding\lbrack0\rbrack=\frac12\left[\left(H_{out}-1\right)\times stride\lbrack0\rbrack+kernal\_size\lbrack0\rbrack-H_{in}\right] padding[0]=21[(Hout−1)×stride[0]+kernal_size[0]−Hin] p a d d i n g [ 1 ] = 1 2 [ ( W o u t − 1 ) × s t r i d e [ 1 ] + k e r n a l _ s i z e [ 1 ] − W i n ] padding\lbrack1\rbrack=\frac12\left[\left(W_{out}-1\right)\times stride\lbrack1\rbrack+kernal\_size\lbrack1\rbrack-W_{in}\right] padding[1]=21[(Wout−1)×stride[1]+kernal_size[1]−Win] -
padding = “VALID” :
H o u t = ⌈ H i n − k e r n a l _ s i z e [ 0 ] + 1 s t r i d e [ 0 ] ⌉ H_{out}=\left\lceil\frac{H_{in}-kernal\_size\lbrack0\rbrack+1}{stride\lbrack0\rbrack}\right\rceil Hout=⌈stride[0]Hin−kernal_size[0]+1⌉ W o u t = ⌈ W i n − k e r n a l _ s i z e [ 1 ] + 1 s t r i d e [ 1 ] ⌉ W_{out}=\left\lceil\frac{W_{in}-kernal\_size\lbrack1\rbrack+1}{stride\lbrack1\rbrack}\right\rceil Wout=⌈stride[1]Win−kernal_size[1]+1⌉
等价于
H o u t = ⌊ H i n − k e r n a l _ s i z e [ 0 ] s t r i d e [ 0 ] + 1 ⌋ = ⌊ H i n − k e r n a l _ s i z e [ 0 ] s t r i d e [ 0 ] ⌋ + 1 H_{out}=\left\lfloor\frac{H_{in}-kernal\_size\lbrack0\rbrack}{stride\lbrack0\rbrack}+1\right\rfloor=\left\lfloor\frac{H_{in}-kernal\_size\lbrack0\rbrack}{stride\lbrack0\rbrack}\right\rfloor+1 Hout=⌊stride[0]Hin−kernal_size[0]+1⌋=⌊stride[0]Hin−kernal_size[0]⌋+1 W o u t = ⌊ W i n − k e r n a l _ s i z e [ 1 ] s t r i d e [ 1 ] + 1 ⌋ = ⌊ W i n − k e r n a l _ s i z e [ 1 ] s t r i d e [ 1 ] ⌋ + 1 W_{out}=\left\lfloor\frac{W_{in}-kernal\_size\lbrack1\rbrack}{stride\lbrack1\rbrack}+1\right\rfloor=\left\lfloor\frac{W_{in}-kernal\_size\lbrack1\rbrack}{stride\lbrack1\rbrack}\right\rfloor+1 Wout=⌊stride[1]Win−kernal_size[1]+1⌋=⌊stride[1]Win−kernal_size[1]⌋+1
卷积神经网络感受野(receptive field)计算
相关文章:
Receptive Field Calculator
calculate-receptive-field-for-vgg-16
如何计算感受野(Receptive Field)——原理
卷积神经中感受野的计算
待补充… …
卷积神经网络的计算参数及复杂度分析
相关文章:
待补充… …