1.前言

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

2.图像卷积

图2
同样地,卷积的时候需要对卷积核进行180的旋转,同时卷积核中心与需计算的图像像素对齐,输出结构为中心对齐像素的一个新的像素值,计算例子如下
图3
这样计算出左上角(即第一行第一列)像素的卷积后像素值。
给出一个更直观的例子,从左到右看,原像素经过卷积由1变成-8。
图4
通过滑动卷积核,就可以得到整张图片的卷积结果,
图5
到了这里,大致可以明白图像卷积。但是我们可以看出,通过图像卷积后,新图像的大小跟原来一样,或者变小。图2计算后图像大小不变,如图5卷积后图像变小是因为没有对所用像素进行卷积计算。但是1维的卷积结果不是变大了吗? 下面对其解释。
在matlb中对2维卷积的计算分为了3类,1.full   2.same   3. valid   参考:https://cn.mathworks.com/help/matlab/ref/conv2.html?requestedDomain=www.mathworks.com
图2对应的卷积就是就是所谓的same,图5对应的就是valid。那么full又是什么呢?如下图
图6

图6中蓝色为原图像,白色为对应卷积所增加的padding,通常全部为0,绿色是卷积后图片。图6的卷积的滑动是从卷积核右下角与图片左上角重叠开始进行卷积,滑动步长为1,卷积核的中心元素对应卷积后图像的像素点。可以看到卷积后的图像是4X4,比原图2X2大了,我们还记1维卷积大小是n1+n2-1,这里原图是2X2,卷积核3X3,卷积后结果是4X4,与一维完全对应起来了。其实这才是完整的卷积计算,其他比它小的卷积结果都是省去了部分像素的卷积。下面是WIKI对应图像卷积后多出部分的解释:

Kernel convolution usually requires values from pixels outside of the image boundaries. There are a variety of methods for handling image edges.意思就是多出来的部分根据实际情况可以有不同的处理方法。(其实这里的full卷积就是后面要说的反卷积)

这里,我们可以总结出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)/S+1 x (N1-N2)/S+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网络,如IMAGENET,最后输出结果是1X1X1000,1000是类别种类,1x1得到的是。FCN作者,或者后来对end to end研究的人员,就是对最终1x1的结果使用反卷积(事实上FCN作者最后的输出不是1X1,是图片大小的32分之一,但不影响反卷积的使用)。
这里图像的反卷积与图6的full卷积原理是一样的,使用了这一种反卷积手段使得图像可以变大,FCN作者使用的方法是这里所说反卷积的一种变体,这样就可以获得相应的像素值,图像可以实现end to end。
图7
这里说另外一种反卷积做法,假设原图是3X3,首先使用上采样让图像变成7X7,可以看到图像多了很多空白的像素点。使用一个3X3的卷积核对图像进行滑动步长为1的valid卷积,得到一个5X5的图像,我们知道的是使用上采样扩大图片,使用反卷积填充图像内容,使得图像内容变得丰富,这也是CNN输出end to end结果的一种方法。韩国作者Hyeonwoo Noh使用VGG16层CNN网络后面加上对称的16层反卷积与上采样网络实现end to end 输出,其不同层上采样与反卷积变化效果如下,
图8
到这里就把图像卷积与反卷积解释完成,如有不妥,请学者们指证。
   
    补充一个资料:
    图6与图7出处,https://github.com/vdumoulin/conv_arithmetic

————新增反卷积过程解释—————-
经过上面的解释与推导,对卷积有基本的了解,但是在图像上的deconvolution究竟是怎么一回事,可能还是不能够很好的理解,因此这里再对这个过程解释一下。
目前使用得最多的deconvolution有2种,上文都已经介绍。
方法1:full卷积, 完整的卷积可以使得原来的定义域变大
方法2:记录pooling index,然后扩大空间,再用卷积填充


图像的deconvolution过程如下,

输入: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

【caffe】caffe之反卷积层相关推荐

  1. Caffe源码精读 - 7 - Caffe Layers之deconv_layer(反卷积层)

    Class_7 Caffe Layers之deconv_layer(反卷积层) 1. 概述 deconv_layer是反卷积层,在DL领域又叫转置卷积. 反卷积层到目前最大的用处就是实现上采样.典型的 ...

  2. 【深度学习】深入浅出神经网络框架的模型元件(池化、正则化和反卷积层)

    [深度学习]深入浅出神经网络框架的模型元件(池化.正则化和反卷积层) 文章目录 1 池化层 1.1 MaxPooling2D 1.2 MaxPooling1D: 1.3 AveragePooling2 ...

  3. 反卷积原理 + pytorch反卷积层参数output_padding

    一般我们会认为2维卷积的计算分为了以下3类: 1.full   2.same   3. valid 参考:https://cn.mathworks.com/help/matlab/ref/conv2. ...

  4. 卷积神经网络中卷积层、反卷积层和相关层

    卷积层.反卷积层和相关层三个层之间有很大的相似之处,现在好好分析一下. 1.卷积层 下图较大网格表示一幅图片,有颜色填充的网格表示一个卷积核,卷积核的大小为33.假设我们做步长为1的卷积操作,表示卷积 ...

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

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

  6. 反卷积在神经网络可视化上的成功应用

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

  7. 反卷积(转置卷积)的理解

    参考:打开链接 卷积: 就是这个图啦,其中蓝色部分是输入的feature map,然后有3*3的卷积核在上面以步长为2的速度滑动,可以看到周围还加里一圈padding,用更标准化的参数方式来描述这个过 ...

  8. 卷积与反卷积(转置卷积)关系的公式推导 及其各自的形式

    1. 卷积与反卷积(转置卷积)的关系推导: 2. Transposed Convolution, Fractionally Strided Convolution or Deconvolution h ...

  9. 一文读懂什么是反卷积

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

最新文章

  1. python代码大全o-python文件编码及执行
  2. Java成员变量和局部变量的区别
  3. oracle unused用法,set unused的用法(ORACLE刪除字段)
  4. python字符串转浮点数_Python | 打印不同的值(整数,浮点数,字符串,布尔值)...
  5. 硬干货!一张图弄清楚在ESXi下如何进行网络抓包
  6. encapsulation
  7. 动态引入js文件和css样式表文件
  8. redis 哨兵的原理
  9. 入门级详细USB移植教程——致正在为USB烦恼的朋友
  10. 威纶通触摸屏与仪表通讯_威纶通触摸屏与英威腾变频器通信详细说明
  11. YTU OJ 1329: 手机尾号评分
  12. 以核心素养为导向的计算机教学方式,“雨花学术论坛”再开讲:让核心素养在课堂“落地生根”...
  13. echarts html ppt,PPT美化之echarts
  14. Facebook 如何存储150亿张、1.5PB的照片
  15. Flask学习笔记(一)
  16. Android 各版本 设置 USB 默认连接 MTP 模式 ( Android 6.0+ )
  17. 赛码网: 小明很喜欢打字,今天小红给了小明一个字符串。
  18. 小程序前后台切换运行机制
  19. java spring ioc 实例_Spring 源码阅读(IOC容器)-bean的实例化以及注入
  20. TS 如何解决已声明“XXX”,但从未读取其值

热门文章

  1. 北大操作系统陈向群第六章知识点
  2. AI人工智能识别技术如何助力构建风险监测预警系统?
  3. Python大学生心理健康管理系统django项目源码
  4. 太强了!60 种可视化图表制作工具和使用场景(推荐收藏)
  5. vue中h5项目怎么使用weui
  6. H264编码系列之profile level控制
  7. 5.0 数据库完整性详解(PRIMARY KEY、REFERENCES、CHECK、CONSTRAINT、DOMAIN、TRIGGER)
  8. 说文解字----矩阵分析(一)矩阵中的空间与秩
  9. Qt入门基础知识(vs2017+Qt5.12)
  10. 数字游戏 (number)