彻底搞懂CNN中的卷积和反卷积

article/2025/9/19 22:33:34

前言

卷积反卷积在CNN中经常被用到,想要彻底搞懂并不是那么容易。本文主要分三个部分来讲解卷积和反卷积,分别包括概念工作过程代码示例,其中代码实践部分主结合TensorFlow框架来进行实践。给大家介绍一个卷积过程的可视化工具,这个项目是github上面的一个开源项目。
在这里插入图片描述

卷积和反卷积

卷积(Convolutional):卷积在图像处理领域被广泛的应用,像滤波边缘检测图片锐化等,都是通过不同的卷积核来实现的。在卷积神经网络中通过卷积操作可以提取图片中的特征,低层的卷积层可以提取到图片的一些边缘线条等特征,高层的卷积能够从低层的卷积层中学到更复杂的特征,从而实现到图片的分类和识别。
反卷积:反卷积也被称为转置卷积,反卷积其实就是卷积的逆过程。大家可能对于反卷积的认识有一个误区,以为通过反卷积就可以获取到经过卷积之前的图片,实际上通过反卷积操作并不能还原出卷积之前的图片,只能还原出卷积之前图片的尺寸。那么到底反卷积有什么作用呢?通过反卷积可以用来可视化卷积的过程,反卷积在GAN等领域中有着大量的应用。

工作过程

卷积

在这里插入图片描述
上图展示了一个卷积的过程,其中蓝色的图片(4*4)表示的是进行卷积的图片,阴影的图片(3*3)表示的是卷积核,绿色的图片(2*2)表示是进行卷积计算之后的图片。在卷积操作中有几个比较重要的参数,输入图片的尺寸、步长、卷积核的大小、输出图片的尺寸、填充大小
下面用一个图来详细介绍这些参数:
在这里插入图片描述
输入图片的尺寸:上图中的蓝色图片(55),表示的是需要进行卷积操作的图片,在后面的公式中有 i i i来表示输入图片的尺寸。
卷积核的大小:上图中的会移动阴影图片表示的是卷积核(4
4),通过不同参数不同大小的卷积核可以提取到图片的不同特征,后面用 k k k表示卷积核的尺寸。
步长:是指卷积核移动的长度,通过上图可以发现卷积核水平方向移动的步长和垂直方向移动的步长是一样的都是1,后面用 s s s表示步长。
填充大小:是指在输入图片周围填充的圈数,通常都是用0来进行填充的,上图中蓝色图片周围两圈虚线的矩形表示的是填充的值,所以填充掉是2,后面用 p p p来表示填充大小。
输出图片的尺寸:经过卷积操作之后获取到的图片的大小,上图的绿色图片(6*6),后面用o来表示。
如果已知 i 、 k 、 p 、 s i、k、p、s ikps,可以求得 o o o,计算公式如下:
o = i − k + 2 ∗ p s + 1 o=\frac{i-k+2*p}{s}+1 o=sik+2p+1

反卷积

在这里插入图片描述

上图展示一个反卷积的工作过程,乍看一下好像反卷积和卷积的工作过程差不多,主要的区别在于反卷积输出图片的尺寸会大于输入图片的尺寸,通过增加padding来实现这一操作,上图展示的是一个strides(步长)为1的反卷积。下面看一个strides不为1的反卷积
在这里插入图片描述
上图中的反卷积的stride为2,通过间隔插入padding来实现的。同样,可以根据反卷积的 o 、 s 、 k 、 p o、s、k、p oskp参数来计算反卷积的输出 i i i,也就是卷积的输入。公式如下: i = ( o − 1 ) ∗ s + k − 2 ∗ p i=(o-1)*s+k-2*p i=(o1)s+k2p,其实就是根据上式推导出来的。

代码示例

为了便于大家理解卷积和反卷积工作过程,将会使用图示的方式来展示卷积和反卷积的工作过程,并利用tensorflow的卷积和反卷积函数来进行验证。

卷积

使用tensorflow来实现卷积的时候,主要利用tf.nn.conv2d函数来实现的,先介绍一下函数的参数
功能说明:通过4维的input和filter来计算2维卷积

  • input:4维的tensor,需要进行卷积的矩阵
  • filter:4维的tensor,卷积核的参数,需要和input具有相同的数据类型,[filter_height,filter_width,in_channels,out_channels],其中filter_height表示卷积核的高,filter_width表示卷积核的宽,in_channels表示需要进行卷积图片的通道数,out_channels卷积之后输出的通道数
  • strides:int类型的列表,设置卷积核滑动的步长
  • padding:填充类型有"SAME"和"VALID"两种模式,当步长为1时,padding为"SAME"可以保持输出与输入的尺寸具有相同的大小。
  • use_cudnn_on_gpu:使用cudnn来加速卷积,默认是True
  • data_format:输入数据的格式,有"NHWC"和"NCHW"两种模式,默认使用的是"NHWC",表示[batch,height,width,channels],"NCHW"数据格式[batch,channels,height,width]
  • dilations:一维的list,默认是[1,1,1,1],用来设置卷积核的扩展
  • name:操作的名称

TensorFlow提供的卷积函数padding只有"SAME""VALID"两种模式,所以输出矩阵的尺寸大小与之前的公式有所不同,下面介绍这两种模式下输出矩阵尺寸的计算公式:
padding为SAME时 c e i l ( i / s ) ceil(i/s) ceil(i/s),其中 i i i表示输入矩阵的大小,s表示卷积核的步长,ceil函数表示向上取整。下图展示是一个padding为SAME的卷积,卷积开始的时候保证卷积核的中心位于输入矩阵角的顶点位置
在这里插入图片描述
padding为VALID时 c e i l ( ( i − k + 1 ) / s ) ceil((i-k+1)/s) ceil((ik+1)/s) k k k表示卷积核的尺寸。下图展示的是一个padding为VALID的卷积过程,卷积核始终都是位于输入矩阵内进行移动
在这里插入图片描述

    x1 = tf.constant(1.0, shape=[1,4,4,3])x2 = tf.constant(1.0,shape=[1,6,6,3])kernel = tf.constant(1.0,shape=[3,3,3,1])y1_1 = tf.nn.conv2d(x1,kernel,strides=[1,2,2,1],padding="SAME")y1_2 = tf.nn.conv2d(x1,kernel,strides=[1,2,2,1],padding="VALID")y2_1 = tf.nn.conv2d(x2,kernel,strides=[1,2,2,1],padding="SAME")y2_2 = tf.nn.conv2d(x2,kernel,strides=[1,2,2,1],padding="VALID")sess = tf.InteractiveSession()tf.global_variables_initializer()x1,y1_1,y1_2,x2,y2_1,y2_2 = sess.run([x1,y1_1,y1_2,x2,y2_1,y2_2])print(x1.shape)         #(1, 4, 4, 3)print(y1_1.shape)       #(1, 2, 2, 1)print(y1_2.shape)       #(1, 1, 1, 1)print(x2.shape)         #(1, 6, 6, 3)print(y2_1.shape)       #(1, 3, 3, 1)print(y2_2.shape)       #(1, 2, 2, 1)

下面看一个卷积的计算例子

    x1 = tf.constant([i*0.1 for i in range(16)],shape=[1,4,4,1],dtype=tf.float32)kernel = tf.ones(shape=[3,3,1,1],dtype=tf.float32)conv1 = tf.nn.conv2d(x1,kernel,strides=[1,1,1,1],padding="VALID")sess = tf.InteractiveSession()tf.global_variables_initializer()conv1 = sess.run(conv1)print(conv1)

在这里插入图片描述
在这里插入图片描述
将卷积核与输入矩阵对应的位置进行乘加计算即可,对于多维输入矩阵和多维卷积核的卷积计算,将卷积后的结果进行堆叠,作为最终卷积的输出结果。

反卷积

tensorflow提供了tf.nn.conv2d_transpose函数来计算反卷积
功能说明:计算反卷积(转置卷积)

  • value:4维的tensor,float类型,需要进行反卷积的矩阵
  • filter:卷积核,参数格式[height,width,output_channels,in_channels],这里需要注意output_channels和in_channels的顺序
  • output_shape:一维的Tensor,设置反卷积输出矩阵的shape
  • strides:反卷积的步长
  • padding:"SAME"和"VALID"两种模式
  • data_format:和之前卷积参数一样
  • name:操作的名称
if __name__ == "__main__":x1 = tf.constant([4.5,5.4,8.1,9.0],shape=[1,2,2,1],dtype=tf.float32)dev_con1 = tf.ones(shape=[3,3,1,1],dtype=tf.float32)y1 = tf.nn.conv2d_transpose(x1,dev_con1,output_shape=[1,4,4,1],strides=[1,1,1,1],padding="VALID")sess = tf.InteractiveSession()tf.global_variables_initializer()y1,x1 = sess.run([y1,x1])print(y1)print(x1)

在这里插入图片描述
需要注意的是,通过反卷积并不能还原卷积之前的矩阵,只能从大小上进行还原,反卷积的本质还是卷积,只是在进行卷积之前,会进行一个自动的padding补0,从而使得输出的矩阵与指定输出矩阵的shape相同。框架本身,会根据你设定的反卷积值来计算输入矩阵的尺寸,如果shape不符合,则会报错。
错误提示:InvalidArgumentError (see above for traceback): Conv2DSlowBackpropInput,这时候需要检查反卷积的参数与输入矩阵之间的shape是否符合。计算规则可以根据padding为SAME还是VALID来计算输入和输出矩阵的shape是否相符合。如上例中,根据反卷积的参数来计算输入矩阵的shape:因为padding是VALID模式,所以我们套用 c e i l ( ( i − k + 1 ) / s ) = c e i l ( ( 4 − 3 + 1 ) / 1 ) = 2 ceil((i-k+1)/s)=ceil((4-3+1)/1)=2 ceil((ik+1)/s)=ceil((43+1)/1)=2,而输入矩阵x1的shape刚好是2*2,所以符合。
上面介绍的反卷积的stride是1,接下来看一个stride不为1的例子

    x1 = tf.constant([4.5,5.4,8.1,9.0],shape=[1,2,2,1],dtype=tf.float32)dev_con1 = tf.ones(shape=[3,3,1,1],dtype=tf.float32)y1 = tf.nn.conv2d_transpose(x1,dev_con1,output_shape=[1,6,6,1],strides=[1,2,2,1],padding="VALID")sess = tf.InteractiveSession()tf.global_variables_initializer()y1,x1 = sess.run([y1,x1])print(x1)print(y1)

在这里插入图片描述
需要注意的是,在进行反卷积的时候设置的stride并不是指反卷积在进行卷积时候卷积核的移动步长,而是被卷积矩阵填充的padding,仔细观察红色框内可以发现之前输入矩阵之间有一行和一列0的填充


http://chatgpt.dhexx.cn/article/lObc2SVL.shtml

相关文章

卷积与反卷积

1、卷积 上图展示了一个卷积的过程,其中蓝色的图片(4*4)表示的是进行卷积的图片,阴影的图片(3*3)表示的是卷积核,绿色的图片(2*2)表示是进行卷积计算之后的图片。在卷积操作中有几个比较重要的参数,输入图片的尺寸、步长、卷积核的…

反卷积原理

一 介绍 反卷积,可以理解为卷积操作的逆运算。这里千万不要当成反卷积操作可以复原卷积操作的输入值,反卷积并没有那个功能,它仅仅是将卷积变换过程中的步骤反向变换一次而已,通过将卷积核转置,与卷积后的结果再做一遍…

Tensorflow——反卷积

目标——主要用来进行上采样,使图像形状变大 函数:conv2d_transpose(value, filter, output_shape, strides, padding"SAME", data_format"NHWC", nameNone) Arg: value:指需要做反卷积的输入图像&#xff…

机器学习19:反卷积算法

机器学习19:反卷积算法(转载和整理) 在整理全卷积网络的过程中,被反卷积的概念困扰很久,于是将反卷积算法单独整理为一篇博客,本文主要转载和整理自知乎问题如何通俗易懂地解释反卷积?中的高票答案。 1.反…

卷积和反卷积详解

反卷积(deconvolution),也叫转置卷积,分部卷积(fractionally-strided convolution),在论文中也叫upconv。 1. Pytorch中2D卷积和反卷积的函数 class torch.nn.Conv2d(in_channels, out_channe…

什么是反卷积(快速理解)

什么是反卷积 参考博客 我们知道输入图像通过卷积神经网络(CNN)提取特征后,输出的尺寸往往会变小,而又是我们需要将图像恢复到原来的尺寸以便进行进一步的计算,整个扩大图像尺寸,实现图像由小分辨率到大分辨…

反卷积(Transposed Convolution, Fractionally Strided Convolution or Deconvolution)

反卷积(Deconvolution)的概念第一次出现是Zeiler在2010年发表的论文 Deconvolutional networks 中,但是并没有指定反卷积这个名字,反卷积这个术语正式的使用是在其之后的工作中( Adaptive deconvolutional networks for mid an…

反卷积详解

一.概述 反卷积又称转秩卷积(Transposed Convolution),上采样(Upsampled )。 其作用举例如下: 1.当我们用神经网络生成图片的时候,经常需要将一些低分辨率的图片转换为高分辨率的图片。 2.在语义分割中,会使用卷积层在编码器中…

反卷积通俗详细解析与nn.ConvTranspose2d重要参数解释

文章目录 反卷积的作用卷积中padding的几个概念No PaddingHalf(Same) PaddingFull Padding 反卷积反卷积中的Padding参数反卷积的stride参数反卷积的output_padding参数 反卷积总结参考资料 反卷积的作用 传统的卷积通常是将大图片卷积成一张小图片,而反卷积就是反…

反卷积(Transposed conv deconv)实现原理(通俗易懂)

什么是卷积 卷积就是把卷积核放在输入上进行滑窗,将当前卷积核覆盖范围内的输入与卷积核相乘,值进行累加,得到当前位置的输出,其本质在于融合多个像素值的信息输出一个像素值,本质上是下采样的,所以输出的…

Mysql的基本使用——Mysql教案(一)

文章目录 Mysql的基本使用1. Mysql的安装2. Mysql基本操作数据库操作表操作SQL操作练习资源课堂练习 查询(SELECT)去重(distinct)别名(AS)限制查询数(limit)排序(ORDER BY)条件查询(WHERE)普通查询多条件的查询语句模糊查询BETWEEN AND 内连接查询(inner join)外连接查询(outer…

链表-双链表

双向链表应用实例 双向链表的操作分析和实现 使用带 head 头的双向链表实现 管理单向链表的缺点分析: 单向链表,查找的方向只能是一个方向,而双向链表可以向前或者向后查找。单向链表不能自我删除,需要靠辅助节点 ,而双向链表&…

八股文之mysql

1、MySQL性能优化解决思路 SQL优化 表结构优化 程序配置优化 架构设计优化 硬件和操作系统优化 SQL语句优化 索引失效情况 最左前缀匹配原则 索引下推 表结构优化 将字段很多的表分解成多个表 对于字段较多的表,如果有些字段的使用频率很低,可以将…

数据库-MySQL

1.数据库基础概念 1.查看数据库-SQLsever学习基础概念 2.MySQL数据类型 1.MySQL支持多种数据类型,大致可分为四类 1.数值类型2.日期和时间类型3.字符串(字符)类型4.二进制类型 1.数值类型 1.整数类型 1.TINYINT(小整型数&#xff…

【爆肝题解】❤️24❤️新手也能理解并学会的剑指offer题目❤️❤️剑指 Offer 24. 反转链表

本文章是❤️剑指 offer(第2版)❤️的内容,该专栏还有多篇优质内容在等待你观看,现在点击右上角点击这个————🚀订阅专栏🚀 🔆坚持刷算法 💎每天进步一点点 🚀冲冲冲冲…

mysql 表结构反转,【数据结构】单向链表的反转/倒置的一种实现方法

【背景】 单向链表由于其存储灵活,所有的元素位置是通过额外开辟的指针作为指向的,于是在复习过程中,不由得想象一下如何将链表进行反转。 参考网上的教程,大多是用改变指针的指向进行实现,当然也有利用递归栈的特殊性…

Mysql数据库面经

目录 1、SQL1.1 介绍一下数据库分页1.2 介绍一下SQL中的聚合函数1.3 表跟表是怎么关联的?1.4 说一说你对外连接的了解1.5 说一说数据库的左连接和右连接1.6 SQL中怎么将行转成列?1.7 谈谈你对SQL注入的理解如何解决SQL注入1.8 将一张表的部分数据更新到另…

MySQL进阶

一、索引 1.1 索引概述 MySQL官方对索引的定义为:索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据…

MySQL经典100问

目录 常规篇 1、说一下数据库的三大范式? 2、只查询一条数据,但是也执行非常慢,原因一般有哪些? 3、count(*)、count(0)、count(id)实现方式的区别? 4、误删数据怎么办? 5、drop、truncate 和 delet…

Mysql常见面试题

文章目录 1. SQL1.1 介绍一下数据库分页1.2 SQL中怎么将行转成列?1.3 谈谈你对SQL注入的理解1.4 WHERE和HAVING有什么区别? 2. 索引2.1 说一说你对MySQL索引的理解2.2 如何创建及保存MySQL的索引?2.3 如何判断数据库的索引有没有生效&#xf…