【keras/Tensorflow/pytorch】Conv2D和Conv2DTranspose详解

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一般称为反卷积、逆卷积等,对图片进行一个上采样过程,即放大图片
主要通过三步进行:

  1. 对输入特征图m进行变换,生成新的输入特征图m’
  2. 对卷积核k进行变换,生成新的卷积核k’
  3. 用上面产生的新的输入特征图和新的卷积核进行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)

第二步:对卷积核进行变换

说明: 准确说是填充变换。

  1. 卷积核大小不变:(K,K)
  2. 步幅,S’=1这里不好理解,后面解释
  3. 填充: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+2pk)+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=SH+HSHS+1+2K2padding2k+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(H1S+K2padding1+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=(H1S+K2padding

至此, Conv2D和Conv2DTranspose 在输入和输出形状方面互为倒数。

关于步幅:
说明: 仅做一般性说明,非严格计算,此部分不理解可以跳过,回头再看。

  1. 正常卷积(大图变小图)情况下:
    输入(5,5),步幅(2,2),输出(3,3)
    在这里插入图片描述
  2. 逆卷积操作中,
    小图变大图,输入(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=143+20+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=(Hin1)S2p+k
H o u t = ( 2 − 1 ) ∗ 1 − 2 ∗ 0 + 3 = 4 Hout = ( 2 -1)*1- 2*0+3=4 Hout=(21)120+3=4


  • 分步骤讲解:
  1. 输入特征图变换: 步幅stride=1,输入特征图不变,即:(2,2)
  2. 卷积核变换:
    卷积核不变(3,3)步幅:strdie=1
    padding’ = K-p-1
    即:padding = 3-0-1=2
  3. 卷积

H o u t = 2 + 2 ∗ 2 − 3 1 + 1 = 4 Hout = \frac{2+2*2-3}{1}+1 =4 Hout=12+223+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=253+21+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=(Hin1)S2p+k
H o u t = ( 3 − 1 ) ∗ 2 − 2 ∗ 1 + 3 = 5 Hout = ( 3 -1)*2- 2*1+3=5 Hout=(31)221+3=5


  • 分步骤讲解:
  1. 输入特征图变换: 步幅stride=2,输入特征图,(3,3)变为:(5,5)
  2. 卷积核变换:
    卷积核不变(3,3)步幅改变: strdie=1
    padding’ = K-p-1
    即:padding = 3-1-1=1
  3. 卷积

H o u t = H i n + 2 p − k S + 1 Hout = \frac{Hin+2p-k}{S}+1 Hout=SHin+2pk+1
H o u t = 5 + 2 ∗ 1 − 3 1 + 1 = 5 Hout = \frac{5+2*1-3}{1}+1 =5 Hout=15+213+1=5

1.3 小结

  1. 正常卷积,特征图变换:

H o u t = H i n − k + 2 p S + 1 Hout = \frac{Hin-k+2p}{S}+1 Hout=SHink+2p+1

  1. 逆卷积,特征图变换

H o u t = ( H i n − 1 ) ∗ S + k − 2 p Hout = (Hin-1)*S+k-2p Hout=(Hin1)S+k2p

  1. 卷积和逆卷积特征图变换互为倒数
  2. 逆卷积(小图变大图,(3,3)到(5,5)),中参数步幅,是(大图变小图,(5,5)到(3,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/

  • 5
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胡侃有料

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值