卷积与反卷积

1.前言

          
          传统的CNN网络只能给出图像的LABLE,但是在很多情况下需要对识别的物体进行分割实现end to end,然后FCN出现了,给物体分割提供了一个非常重要的解决思路,其核心就是卷积与反卷积,所以这里就详细解释卷积与反卷积。
           对于1维的卷积,公式(离散)与计算过程(连续)如下,要记住的是其中一个函数(原函数或者卷积函数)在卷积前要翻转180度。
卷积神经网络CNN——图像卷积与反卷积(后卷积,转置卷积)

             卷积神经网络CNN——图像卷积与反卷积(后卷积,转置卷积)
  图1
        对于离散卷积,f的大小是n1,g的大小是n2,卷积后的大小是n1+n2-1
         一维卷积的简单介绍
      在这个部分,我们主要从数学的角度看一看卷积,也就是看一下卷积是怎么运算的。这里要说明一下,卷积分为连续卷积和离散卷积。在此为了方便大家理解,在此先 以离散卷积举例 ,本文也就不再专门讨论连续卷积(因为连续卷积和离散卷积的区别也就是 连续和离散的区别 )。说到数学角度,那首先就要给出卷积运算的公式定义:

一维卷积公式        
       这个公式中有三个序列(y,h,u),其中h长度为lh=3,u的长度为lu=6。那么就有y的长度ly=lh+lu-1=8(至于为什么后面会说)。如何计算这个卷积呢?我们先将一个序列从小到大排列(U0,U1,U2,U3,U4,U5)在一维直线上,因为公式中U的序号i是从小到大。而将H序列从大到小排列(H2,H1,H0),因为H的序号是-i。再将两个序列的开头对齐,如下图:
 卷积神经网络CNN——图像卷积与反卷积(后卷积,转置卷积)
K=0
卷积神经网络CNN——图像卷积与反卷积(后卷积,转置卷积)
K=7 
       排列好之后,我们就可以开始进行卷积运算。当位移K=0时,下面H序列不移动,上下两个序列中都存在的项相乘后相加,即y(0)=H0*U0。当位移K=1时,下面H序列移动1位,之后对应项相乘后相加得到y(1)=H1*U0+H0*U1。依此移动,直到取到K的最大值停止。可见,一维卷积就是卷积核H,在被卷积信号U的一维直线上的移动之后的对应项相乘后求和运算。那么K的取值范围时多少呢?从图中我们可以看出当K=8时,H序列和U序列对应项都不存在了,那么K=8也就没有意义。因此的最大长度要使得两个序列至少有1个项重合,即两个序列长度求和再减去重合的一项的长度      

2.图像卷积

卷积神经网络CNN——图像卷积与反卷积(后卷积,转置卷积)
图2
       同样地,卷积的时候需要对卷积核进行180的旋转,同时卷积核中心与需计算的图像像素对齐,输出结构为中心对齐像素的一个新的像素值,计算例子如下
卷积神经网络CNN——图像卷积与反卷积(后卷积,转置卷积)
图三
       这样计算出左上角(即第一行第一列)像素的卷积后像素值。 给出一个更直观的例子,从左到右看,原像素经过卷积由1变成-8。
卷积神经网络CNN——图像卷积与反卷积(后卷积,转置卷积)
图4

       通过滑动卷积核,就可以得到整张图片的卷积结果,
卷积神经网络CNN——图像卷积与反卷积(后卷积,转置卷积)
图5
       到了这里,大致可以明白图像卷积。但是我们可以看出,通过图像卷积后,新图像的大小跟原来一样,或者变小。图2计算后图像大小不变,如图5卷积后图像变小是因为没有对所用像素进行卷积计算。但是1维的卷积结果不是变大了吗? 下面对其解释。
       在matlb中对2维卷积的计算分为了3类,1.full   2.same   3. valid
       图2对应的卷积就是就是所谓的same,图5对应的就是valid。那么full又是什么呢?如下图
       卷积神经网络CNN——图像卷积与反卷积(后卷积,转置卷积)
full convolution图6
       图6中蓝色为原图像,白色为对应卷积所增加的padding,通常全部为0,绿色是卷积后图片。图6的卷积的滑动是从卷积核右下角与图片左上角重叠开始进行卷积,滑动步长为1,卷积核的中心元素对应卷积后图像的像素点。可以看到卷积后的图像是4X4,比原图2X2大了,我们还记1维卷积大小是n1+n2-1,这里原图是2X2,卷积核3X3,卷积后结果是4X4,与一维完全对应起来了。其实这才是完整的卷积计算,其他比它小的卷积结果都是省去了部分像素的卷积。
       这里,我们可以总结出full,same,valid三种卷积后图像大小的计算公式:
         1.full: 滑动步长为1,图片大小为N1xN1,卷积核大小为N2xN2,卷积后图像大小:             (N1+N2-1) x (N1+N2-1); 如图6, 滑动步长为1,图片大小为2x2,卷积核大小为3x3,卷积后图像大小:4x4
         2.same:  滑动步长为1,图片大小为N1xN1,卷积核大小为N2xN2,卷积后图像大小:N1xN1
         3.valid:   滑动步长为S,图片大小为N1xN1,卷积核大小为N2xN2,卷积后图像大小:                        {(N1-N2)+1 }x{(N1-N2)+1}; 如图5,滑动步长为1,图片大小为5x5,卷积核大小为3x3,卷积后图像大小:3x3
      

3.反卷积(后卷积,转置卷积)

       这里提到的反卷积跟1维信号处理的反卷积计算是很不一样的,FCN作者称为backwards convolution,有人称Deconvolution layer is a very unfortunate name and should rather be called a transposed convolutional layer. 我们可以知道,在CNN中有con layer与pool layer,con layer进行对图像卷积提取特征,pool layer对图像缩小一半筛选重要特征,对于经典的图像识别CNN网络,如Image Net,最后输出结果是1X1X1000,1000是类别种类,1x1得到的是。FCN作者,或者后来对end to end研究的人员,就是对最终1x1的结果使用反卷积(事实上FCN作者最后的输出不是1X1,是图片大小的32分之一,但不影响反卷积的使用)。
        这里图像的反卷积与图6的full卷积原理是一样的,使用了这一种反卷积手段使得图像可以变大,FCN作者使用的方法是这里所说反卷积的一种变体,这样就可以获得相应的像素值,图像可以实现end to end。
        卷积神经网络CNN——图像卷积与反卷积(后卷积,转置卷积)
图7
       这里说另外一种反卷积做法,假设原图是3X3,首先使用上采样让图像变成7X7,可以看到图像多了很多空白的像素点。使用一个3X3的卷积核对图像进行滑动步长为1的valid卷积,得到一个5X5的图像,我们知道的是使用上采样扩大图片,使用反卷积填充图像内容,使得图像内容变得丰富,这也是CNN输出end to end结果的一种方法。韩国作者Hyeonwoo Noh使用VGG16层CNN网络后面加上对称的16层反卷积与上采样网络实现end to end 输出,其不同层上采样与反卷积变化效果如下,
卷积神经网络CNN——图像卷积与反卷积(后卷积,转置卷积)
 
上采样与下采样
 缩小图像(或称为下采样(subsampled)或降采样(downsampled))的主要目的有两个:1、使得图像符合显示区域的大小;2、生成对应图 像的 缩略图 。放大图像(或称为上采样(upsampling)或图像插值(interpolating))的主要目的是放大原图像,从而可以显示在更高分辨率的显示设备上。 对图像的缩放操作并不能带来更多关于该图像的信息, 因此图像的质量将不可避免地受到影响。然而,确实有一些缩放方法能够增加图像的信息,从而使得缩放后的图像质量超过原图质量的。

------------新增反卷积过程解释-------------

经过上面的解释与推导,对卷积有基本的了解,但是在图像上的deconvolution究竟是怎么一回事,可能还是不能够很好的理解,因此这里再对这个过程解释一下。
      目前使用得最多的deconvolution有2种,上文都已经介绍。 
      方法1:full卷积, 完整的卷积可以使得原来的定义域变大
      方法2:记录pooling index,然后扩大空间,再用卷积填充
图像的deconvolution过程如下,
卷积神经网络CNN——图像卷积与反卷积(后卷积,转置卷积)
        输入:2x2, 卷积核:4x4, 滑动步长:3, 输出:7x7
        即输入为2x2的图片经过4x4的卷积核,再进行步长为3的反卷积的过程
       1.输入图片每个像素进行一次full卷积,根据full卷积大小计算可以知道每个像素的卷积后大小为   1+4-1=4, 即4x4大小的特征图,输入有4个像素所以4个4x4的特征图
       2.将4个特征图进行步长为3的fusion(即相加); 例如红色的特征图仍然是在原来输入位置(左上角),绿色还是
即输出的 在原来的位置(右上角),步长为3是指每隔3个像素进行fusion,重叠部分进行相加,第1行第4列是由红色特阵图的第一行第四列与绿色特征图的第一行第一列相加得到,其他如此类推。

       可以看出反卷积的大小是由卷积核大小与滑动步长决定, in是输入大小, k是卷积核大小, s是滑动步长, out是输出大小
       得到 out = (in - 1) * s + k
      上图过程就是, (2 - 1) * 3 + 4 = 7
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值