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知,普通卷积的特征图变换为
将第一、二步中变换的结果代入上式,的
化简,得: 上式中分母步幅为1,则最终结果为:
至此, 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中,输出特征图为:
(2) 逆卷积
输入特征图(蓝色):(2,2) 卷积核:K=3,stride(S)=1, padding=0 输出特征图(绿色):(4,4)
说明: 上图中的padding是Conv2DTranspose 经过三步变换以后的padding
- 代入1.2 公式中,
- 分步骤讲解:
- 输入特征图变换: 步幅stride=1,输入特征图不变,即:(2,2)
- 卷积核变换: 卷积核不变(3,3)步幅:strdie=1 padding’ = K-p-1 即:padding = 3-0-1=2
- 卷积
说明: 至此,逆卷积的两种方法结果一致。
1.2.2.2 当步幅stride=2
(1) 卷积
输入特征图(蓝色):(Hin,Wout)=(5,5)
卷积核:K=3,stride(S) = 2,padding=1
输出特征图(绿色):(Hout,Wout)=(3,3)
代入1.1中,输出特征图为:
(2) 逆卷积
输入特征图(蓝色):(3,3)
卷积核:K=3,stride(S)=2, padding=1
输出特征图(绿色):(5,5)
- 代入1.2 公式中,
- 分步骤讲解:
- 输入特征图变换: 步幅stride=2,输入特征图,(3,3)变为:(5,5)
- 卷积核变换: 卷积核不变(3,3)步幅改变: strdie=1 padding’ = K-p-1 即:padding = 3-1-1=1
- 卷积
1.3 小结
- 正常卷积,特征图变换:
- 逆卷积,特征图变换
- 卷积和逆卷积特征图变换互为倒数
- 逆卷积(小图变大图,(3,3)到(5,5)),中参数步幅,是(大图变小图,(5,5)到(3,3))的步幅。
- 逆卷积进行卷积操作(前文提到第三步)中的步幅为1。
参考文献
[1] [2] [3] https://www.tensorflow.org/api_docs/python/tf/keras/layers/Conv2DTranspose [4] https://zhuanlan.zhihu.com/p/31988761 [5]