every blog every motto: We would rather reuse an active dwarf than a sleeping giant.
0. 前言
一直划水。。。
1. 正文
1.1 Conv2D
说明: 关于这部分之前有写过,所以就不详细展开了,具体可以参考参考文章1 参考文章2
输出特征图计算:
1.2 Conv2DTranspose
Conv2DTranspose一般称为反卷积、逆卷积等,对图片进行一个上采样过程,即放大图片。
主要通过三步进行:
- 对输入特征图m进行变换,生成新的输入特征图m’
- 对卷积核k进行变换,生成新的卷积核k’
- 用上面产生的新的输入特征图和新的卷积核进行1.1中的常规卷积操作
变量说明:
输入特征图:(H,W)
卷积核:(K,K),步幅:S,填充padding
1.2.1 分步骤讲解
第一步:对输入特征图进行变换
对输入特征图进行插值,输入特征图值之间插0,如下图
当然,具体来说:
两个相邻位置中间的插0个数: S-1
对应输入的高为H,中间有(H-1)个空隙,则
高度方向上总插0个数: (H-1)*(S-1)
新的输入特征图的大小,以高度为例:
H’ = H + (H-1)*(S-1)
第二步:对卷积核进行变换
说明: 准确说是填充变换。
- 卷积核大小不变:(K,K)
- 步幅,S’=1 ,这里不好理解,后面解释
- 填充:padding’ = K-padding-1
第三步:普通卷积操作
由1.1知,普通卷积的特征图变换为
H
o
u
t
=
(
H
i
n
+
2
p
−
k
)
S
+
1
Hout = \frac{ (Hin+2p-k)}{S}+1
Hout=S(Hin+2p−k)+1
将第一、二步中变换的结果代入上式,的
H
o
u
t
=
H
+
H
S
−
H
−
S
+
1
+
2
K
−
2
p
a
d
d
i
n
g
−
2
−
k
S
′
+
1
Hout = \frac{H+HS-H-S+1+2K-2padding-2-k}{S'}+1
Hout=S′H+HS−H−S+1+2K−2padding−2−k+1
化简,得:
H
o
u
t
=
(
H
−
1
)
S
+
K
−
2
p
a
d
d
i
n
g
−
1
S
′
+
1
Hout = \frac{(H-1)S+K-2padding-1}{S'}+1
Hout=S′(H−1)S+K−2padding−1+1
上式中分母步幅为1,则
最终结果为:
H
o
u
t
=
(
H
−
1
)
S
+
K
−
2
p
a
d
d
i
n
g
Hout = (H-1)S+K-2padding
Hout=(H−1)S+K−2padding
至此, Conv2D和Conv2DTranspose 在输入和输出形状方面互为倒数。
关于步幅:
说明: 仅做一般性说明,非严格计算,此部分不理解可以跳过,回头再看。
- 正常卷积(大图变小图)情况下:
输入(5,5),步幅(2,2),输出(3,3)
- 逆卷积操作中,
小图变大图,输入(3,3)输出(5,5)
强调:
逆卷积Conv2DTranspose中有步幅这一个参数,具体来说应该是卷积(大图变小图)的步幅,即有(5,5)到(3,3)的步幅,逆卷积操作的步幅永远为1。
逆卷积Conv2DTranspose中有步幅这一个参数,具体来说应该是卷积(大图变小图)的步幅,即有(5,5)到(3,3)的步幅,逆卷积操作的步幅永远为1。
逆卷积Conv2DTranspose中有步幅这一个参数,具体来说应该是卷积(大图变小图)的步幅,即有(5,5)到(3,3)的步幅,逆卷积操作的步幅永远为1。
其中有两个步幅的概念!
- Conv2DTranspose中的参数步幅实际是大图变小图的步幅。
- 上面第三步的步幅始终为1。
1.2.2 案例练习
1.2.2.1 当步幅stride=1
(1) 卷积
输入特征图(蓝色):(Hin,Wout)=(4,4)
卷积核:K=3,stride(S) = 1,padding=0
输出特征图(绿色):(Hout,Wout)=(2,2)
代入1.1中,输出特征图为:
H
o
u
t
=
4
−
3
+
2
∗
0
1
+
1
=
2
Hout = \frac{4-3+2*0}{1}+1=2
Hout=14−3+2∗0+1=2
(2) 逆卷积
输入特征图(蓝色):(2,2)
卷积核:K=3,stride(S)=1, padding=0
输出特征图(绿色):(4,4)
说明: 上图中的padding是Conv2DTranspose 经过三步变换以后的padding
- 代入1.2 公式中,
H
o
u
t
=
(
H
i
n
−
1
)
∗
S
−
2
p
+
k
Hout = ( Hin -1)*S- 2p+k
Hout=(Hin−1)∗S−2p+k
H
o
u
t
=
(
2
−
1
)
∗
1
−
2
∗
0
+
3
=
4
Hout = ( 2 -1)*1- 2*0+3=4
Hout=(2−1)∗1−2∗0+3=4
- 分步骤讲解:
- 输入特征图变换: 步幅stride=1,输入特征图不变,即:(2,2)
- 卷积核变换:
卷积核不变(3,3)步幅:strdie=1
padding’ = K-p-1
即:padding = 3-0-1=2 - 卷积
H o u t = 2 + 2 ∗ 2 − 3 1 + 1 = 4 Hout = \frac{2+2*2-3}{1}+1 =4 Hout=12+2∗2−3+1=4
说明: 至此,逆卷积的两种方法结果一致。
1.2.2.2 当步幅stride=2
(1) 卷积
输入特征图(蓝色):(Hin,Wout)=(5,5)
卷积核:K=3,stride(S) = 2,padding=1
输出特征图(绿色):(Hout,Wout)=(3,3)
代入1.1中,输出特征图为:
H
o
u
t
=
5
−
3
+
2
∗
1
2
+
1
=
3
Hout = \frac{5-3+2*1}{2}+1=3
Hout=25−3+2∗1+1=3
(2) 逆卷积
输入特征图(蓝色):(3,3)
卷积核:K=3,stride(S)=2, padding=1
输出特征图(绿色):(5,5)
- 代入1.2 公式中,
H
o
u
t
=
(
H
i
n
−
1
)
∗
S
−
2
p
+
k
Hout = ( Hin -1)*S- 2p+k
Hout=(Hin−1)∗S−2p+k
H
o
u
t
=
(
3
−
1
)
∗
2
−
2
∗
1
+
3
=
5
Hout = ( 3 -1)*2- 2*1+3=5
Hout=(3−1)∗2−2∗1+3=5
- 分步骤讲解:
- 输入特征图变换: 步幅stride=2,输入特征图,(3,3)变为:(5,5)
- 卷积核变换:
卷积核不变(3,3)步幅改变: strdie=1
padding’ = K-p-1
即:padding = 3-1-1=1 - 卷积
H
o
u
t
=
H
i
n
+
2
p
−
k
S
+
1
Hout = \frac{Hin+2p-k}{S}+1
Hout=SHin+2p−k+1
H
o
u
t
=
5
+
2
∗
1
−
3
1
+
1
=
5
Hout = \frac{5+2*1-3}{1}+1 =5
Hout=15+2∗1−3+1=5
1.3 小结
- 正常卷积,特征图变换:
H o u t = H i n − k + 2 p S + 1 Hout = \frac{Hin-k+2p}{S}+1 Hout=SHin−k+2p+1
- 逆卷积,特征图变换
H o u t = ( H i n − 1 ) ∗ S + k − 2 p Hout = (Hin-1)*S+k-2p Hout=(Hin−1)∗S+k−2p
- 卷积和逆卷积特征图变换互为倒数
- 逆卷积(小图变大图,(3,3)到(5,5)),中参数步幅,是(大图变小图,(5,5)到(3,3))的步幅。
- 逆卷积进行卷积操作(前文提到第三步)中的步幅为1。
参考文献
[1] https://www.cnblogs.com/wanghui-garcia/p/10791328.html
[2] https://blog.csdn.net/chen772209/article/details/94998157
[3] https://www.tensorflow.org/api_docs/python/tf/keras/layers/Conv2DTranspose
[4] https://zhuanlan.zhihu.com/p/31988761
[5] https://blog.csdn.net/qq_27261889/article/details/86304061/