彻底搞懂CNN中的卷积和反卷积 |
您所在的位置:网站首页 › 图像处理卷积的作用 › 彻底搞懂CNN中的卷积和反卷积 |
前言
卷积和反卷积在CNN中经常被用到,想要彻底搞懂并不是那么容易。本文主要分三个部分来讲解卷积和反卷积,分别包括概念、工作过程、代码示例,其中代码实践部分主结合TensorFlow框架来进行实践。给大家介绍一个卷积过程的可视化工具,这个项目是github上面的一个开源项目。 卷积(Convolutional):卷积在图像处理领域被广泛的应用,像滤波、边缘检测、图片锐化等,都是通过不同的卷积核来实现的。在卷积神经网络中通过卷积操作可以提取图片中的特征,低层的卷积层可以提取到图片的一些边缘、线条、角等特征,高层的卷积能够从低层的卷积层中学到更复杂的特征,从而实现到图片的分类和识别。 反卷积:反卷积也被称为转置卷积,反卷积其实就是卷积的逆过程。大家可能对于反卷积的认识有一个误区,以为通过反卷积就可以获取到经过卷积之前的图片,实际上通过反卷积操作并不能还原出卷积之前的图片,只能还原出卷积之前图片的尺寸。那么到底反卷积有什么作用呢?通过反卷积可以用来可视化卷积的过程,反卷积在GAN等领域中有着大量的应用。 工作过程 卷积
上图展示一个反卷积的工作过程,乍看一下好像反卷积和卷积的工作过程差不多,主要的区别在于反卷积输出图片的尺寸会大于输入图片的尺寸,通过增加padding来实现这一操作,上图展示的是一个strides(步长)为1的反卷积。下面看一个strides不为1的反卷积 为了便于大家理解卷积和反卷积工作过程,将会使用图示的方式来展示卷积和反卷积的工作过程,并利用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来加速卷积,默认是Truedata_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的卷积,卷积开始的时候保证卷积核的中心位于输入矩阵角的顶点位置。 下面看一个卷积的计算例子 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,设置反卷积输出矩阵的shapestrides:反卷积的步长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)
|
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |