【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一般称为反卷积、逆卷积等,对图片进行一个上采样过程,即放大图片。
主要通过三步进行:
- 对输入特征图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知,普通卷积的特征图变换为
Hout=(Hin+2p−k)S+1Hout = \frac{ (Hin+2p-k)}{S}+1 Hout=S(Hin+2p−k)+1
将第一、二步中变换的结果代入上式,的
Hout=H+HS−H−S+1+2K−2padding−2−kS′+1Hout = \frac{H+HS-H-S+1+2K-2padding-2-k}{S'}+1 Hout=S′H+HS−H−S+1+2K−2padding−2−k+1
化简,得:
Hout=(H−1)S+K−2padding−1S′+1Hout = \frac{(H-1)S+K-2padding-1}{S'}+1 Hout=S′(H−1)S+K−2padding−1+1
上式中分母步幅为1,则
最终结果为:
Hout=(H−1)S+K−2paddingHout = (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中,输出特征图为:
Hout=4−3+2∗01+1=2Hout = \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 公式中,
Hout=(Hin−1)∗S−2p+kHout = ( Hin -1)*S- 2p+k Hout=(Hin−1)∗S−2p+k
Hout=(2−1)∗1−2∗0+3=4Hout = ( 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 - 卷积
Hout=2+2∗2−31+1=4Hout = \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中,输出特征图为:
Hout=5−3+2∗12+1=3Hout = \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 公式中,
Hout=(Hin−1)∗S−2p+kHout = ( Hin -1)*S- 2p+k Hout=(Hin−1)∗S−2p+k
Hout=(3−1)∗2−2∗1+3=5Hout = ( 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 - 卷积
Hout=Hin+2p−kS+1Hout = \frac{Hin+2p-k}{S}+1 Hout=SHin+2p−k+1
Hout=5+2∗1−31+1=5Hout = \frac{5+2*1-3}{1}+1 =5 Hout=15+2∗1−3+1=5
1.3 小结
- 正常卷积,特征图变换:
Hout=Hin−k+2pS+1Hout = \frac{Hin-k+2p}{S}+1 Hout=SHin−k+2p+1
- 逆卷积,特征图变换
Hout=(Hin−1)∗S+k−2pHout = (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/
【keras/Tensorflow/pytorch】Conv2D和Conv2DTranspose详解相关推荐
- Pytorch的nn.Conv2d()详解
Pytorch的nn.Conv2d()详解 nn.Conv2d()的使用.形参与隐藏的权重参数 in_channels out_channels kernel_size stride = 1 padd ...
- Tensorflow 2.x(keras)源码详解之第十二章:keras中的损失函数之BinaryCrossentropy详解
大家好,我是爱编程的喵喵.双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中.从事机器学习以及相关的前后端开发工作.曾在阿里云.科大讯飞.CCF等比赛获得多次Top名次.现 ...
- Win10 TensorFlow(gpu)安装详解
Win10 TensorFlow(gpu)安装详解 写在前面:TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理.Tensor(张量)意味着 ...
- 【前沿】何恺明大神ICCV2017最佳论文Mask R-CNN的Keras/TensorFlow/Pytorch 代码实现
我们提出了一个概念上简单.灵活和通用的用于目标实例分割(object instance segmentation)的框架.我们的方法能够有效地检测图像中的目标,同时还能为每个实例生成一个高质量的分割掩 ...
- TensorFlow Wide And Deep 模型详解与应用 TensorFlow Wide-And-Deep 阅读344 作者简介:汪剑,现在在出门问问负责推荐与个性化。曾在微软雅虎工作,
TensorFlow Wide And Deep 模型详解与应用 TensorFlow Wide-And-Deep 阅读344 作者简介:汪剑,现在在出门问问负责推荐与个性化.曾在微软雅虎工作,从事 ...
- Tensorflow 2.x源码详解之开宗明义:基本介绍和张量(万文多图)
大家好,我是爱编程的喵喵.双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中.从事机器学习以及相关的前后端开发工作.曾在阿里云.科大讯飞.CCF等比赛获得多次Top名次.现 ...
- Tensorflow 2.x源码详解之第三章:导数(梯度/GradientTape)
大家好,我是爱编程的喵喵.双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中.从事机器学习以及相关的前后端开发工作.曾在阿里云.科大讯飞.CCF等比赛获得多次Top名次.现 ...
- 【小白学PyTorch】12.SENet详解及PyTorch实现
<<小白学PyTorch>> 小白学PyTorch | 11 MobileNet详解及PyTorch实现 小白学PyTorch | 10 pytorch常见运算详解 小白学Py ...
- 【小白学PyTorch】11.MobileNet详解及PyTorch实现
<<小白学PyTorch>> 小白学PyTorch | 10 pytorch常见运算详解 小白学PyTorch | 9 tensor数据结构与存储结构 小白学PyTorch | ...
- TensorFlow Wide And Deep 模型详解与应用
Wide and deep 模型是 TensorFlow 在 2016 年 6 月左右发布的一类用于分类和回归的模型,并应用到了 Google Play 的应用推荐中 [1].wide and dee ...
最新文章
- 运用大数据破局“大城市病”有效支撑首都人口疏解
- Java-Runoob-高级教程-实例-字符串:13. Java 实例 - 字符串格式化
- MySQL数据库的性能优化总结
- java类使用其他类的变量_如何将java类中的变量加载到其他类
- 高级软件工程师的职责范围
- 用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412345等,要求:4不能在第三位,3与5不能相连。...
- 提权命令_利用Linux文本操作命令ed进行提权
- 音视频开发(42)---H.264 SVC 简介
- flag push tcp 作用_TCP协议超详细解析及攻击/防范
- CYQ.Data V4.5.5 版本发布[顺带开源Emit编写的快速反射转实体类FastToT类]
- [渝粤教育] 中国地质大学 数据结构 复习题
- 【Netty-进阶】学习笔记
- Python3.9.10标准库与语言参考等文档下载
- safari浏览网页打开速度很慢如何解决
- 找出m到n水仙花数c语言程序设计,《C语言课程设计输出水仙花数》.doc
- canvas多彩粒子星空背景
- 网络协议之socket协议详解之Unix domain Socket
- python实现刷问卷星份数(面向对象)
- 2016年(第15届)中国软件业务收入前百家企业名单(zz)
- 数据结构之:时间复杂度(T(n)=O(n))
热门文章
- JAVAWeb项目 微型商城项目-------(六)管理员登录
- 吉大计算机学院周柚,周柚
- 小明刚刚看完电影《第39级台阶》离开电影院的时候,他数了一下礼堂前的台阶,刚好是39级 站在台阶前,他突然又想到了一个问题 如果我每步只能迈上一个或者两个台阶,先迈左脚,然后左右交替,也就是说一共
- 耳机使用说明书 jbl ua_JBL UA联名款,全新一代真无线运动耳机“UA小黑盒”今日天猫首发...
- linux tcp 缓冲区 参数,Linux TCP 缓冲区参数调优
- c事件和委托的区别_web前端教程分享JavaScript学习笔记之Event事件二
- linux mmu的实现的讲解_Linux_MMU
- Git:解决Git向码云中push文件报错:! [rejected] master -> master (fetch first)
- 面板x轴模式包括哪些_虎扑轻跃 | 体验一汽大众探岳X
- 随手记_英语_学术写作_常用句型35个