卷积神经网络CNN(1)——图像卷积与反卷积(后卷积,转置卷积)

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

大家好,又见面了,我是你们的朋友全栈君。

1.前言

   传统的CNN网络只能给出图像的LABLE,但是在很多情况下需要对识别的物体进行分割实现end to end,然后FCN出现了,给物体分割提供了一个非常重要的解决思路,其核心就是卷积与反卷积,所以这里就详细解释卷积与反卷积。

    对于1维的卷积,公式(离散)与计算过程(连续)如下,要记住的是其中一个函数(原函数或者卷积函数)在卷积前要翻转180度

卷积神经网络CNN(1)——图像卷积与反卷积(后卷积,转置卷积)

卷积神经网络CNN(1)——图像卷积与反卷积(后卷积,转置卷积)

图1

    对于离散卷积,f的大小是n1,g的大小是n2,卷积后的大小是n1+n2-1

2.图像卷积

卷积神经网络CNN(1)——图像卷积与反卷积(后卷积,转置卷积)

图2

同样地,卷积的时候需要对卷积核进行180的旋转,同时卷积核中心与需计算的图像像素对齐,输出结构为中心对齐像素的一个新的像素值,计算例子如下

卷积神经网络CNN(1)——图像卷积与反卷积(后卷积,转置卷积)

图3

这样计算出左上角(即第一行第一列)像素的卷积后像素值。

 

给出一个更直观的例子,从左到右看,原像素经过卷积由1变成-8。

卷积神经网络CNN(1)——图像卷积与反卷积(后卷积,转置卷积)

图4

在信号处理上,反转180度称作卷积,直接滑动计算称作自相关,在大部分深度学习框架上都没有反转180度的操作。

通过滑动卷积核,就可以得到整张图片的卷积结果,

卷积神经网络CNN(1)——图像卷积与反卷积(后卷积,转置卷积)

图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又是什么呢?如下图

卷积神经网络CNN(1)——图像卷积与反卷积(后卷积,转置卷积)

图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,图片大小为2×2,卷积核大小为3×3,卷积后图像大小:4×4

2.same: 滑动步长为1,图片大小为N1xN1,卷积核大小为N2xN2,卷积后图像大小:N1xN1

3.valid:滑动步长为S,图片大小为N1xN1,卷积核大小为N2xN2,卷积后图像大小:(N1-N2)/S+1 x (N1-N2)/S+1

如图5,滑动步长为1,图片大小为5×5,卷积核大小为3×3,卷积后图像大小:3×3

 

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是类别种类,1×1得到的是。FCN作者,或者后来对end to end研究的人员,就是对最终1×1的结果使用反卷积(事实上FCN作者最后的输出不是1X1,是图片大小的32分之一,但不影响反卷积的使用)。

    这里图像的反卷积与图6的full卷积原理是一样的,使用了这一种反卷积手段使得图像可以变大,FCN作者使用的方法是这里所说反卷积的一种变体,这样就可以获得相应的像素值,图像可以实现end to end。

卷积神经网络CNN(1)——图像卷积与反卷积(后卷积,转置卷积)

图7

    这里说另外一种反卷积做法,假设原图是3X3,首先使用上采样让图像变成7X7,可以看到图像多了很多空白的像素点。使用一个3X3的卷积核对图像进行滑动步长为1的valid卷积,得到一个5X5的图像,我们知道的是使用上采样扩大图片,使用反卷积填充图像内容,使得图像内容变得丰富,这也是CNN输出end to end结果的一种方法。韩国作者Hyeonwoo Noh使用VGG16层CNN网络后面加上对称的16层反卷积与上采样网络实现end to end 输出,其不同层上采样与反卷积变化效果如下,

卷积神经网络CNN(1)——图像卷积与反卷积(后卷积,转置卷积)

                                                                                                                                                   图8

 

    到这里就把图像卷积与反卷积解释完成,如有不妥,请学者们指证。
   
    补充一个资料:
    图6与图7出处,https://github.com/vdumoulin/conv_arithmetic    

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

图像的deconvolution过程如下,
卷积神经网络CNN(1)——图像卷积与反卷积(后卷积,转置卷积)
输入:2×2, 卷积核:4×4, 滑动步长:3, 输出:7×7
即输入为2×2的图片经过4×4的卷积核进行步长为3的反卷积的过程
1.输入图片每个像素进行一次full卷积,根据full卷积大小计算可以知道每个像素的卷积后大小为 1+4-1=4, 即4×4大小的特征图,输入有4个像素所以4个4×4的特征图
2.将4个特征图进行步长为3的fusion(即相加); 例如红色的特征图仍然是在原来输入位置(左上角),绿色还是在原来的位置(右上角),步长为3是指每隔3个像素进行fusion,重叠部分进行相加,即输出的第1行第4列是由红色特阵图的第一行第四列与绿色特征图的第一行第一列相加得到,其他如此类推。

可以看出翻卷积的大小是由卷积核大小与滑动步长决定, in是输入大小, k是卷积核大小, s是滑动步长, out是输出大小
得到 out = (in – 1) * s + k
上图过程就是, (2 – 1) * 3 + 4 = 7
 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/151952.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月21日 上午10:36
下一篇 2022年6月21日 上午10:36


相关推荐

  • 二次开发mysql数据反推_Discuz二次开发之数据库操作

    二次开发mysql数据反推_Discuz二次开发之数据库操作一、discuz数据操作之查:1、fetch_allDB::fetch_all(sql,$arg=array());//取出符合条件的所有数据sql为查询语句,$arg为绑定参数例:$result=DB::fetch_all(‘SELECT*FROM%t’,array(‘table_name’));$result为二维数组2、fetch_firstDB::fetch_first(s…

    2022年5月19日
    39
  • pic单片机c语言 程序,PIC单片机C语言编程教程(1)

    pic单片机c语言 程序,PIC单片机C语言编程教程(1)原代码调试 使用 MPLAB IDE 内的调试工具 ICE2000 ICD2 和软件模拟器都可以实现原代码级的程序调试 非常方便 首先必须在你的计算机中安装 PICC 编译器 无论是完全版还是学习版都可以和 MPLAB IDE 挂接 安装成功后可以进入 IDE 选择菜单项 ProjectSetLa 打开语言工具挂接设置对话框 如图 11 1 所示 C3 82 C

    2025年11月17日
    5
  • Agent开发学习

    Agent开发学习

    2026年3月12日
    2
  • C++ fstream详解[通俗易懂]

    C++ fstream详解[通俗易懂]C语言里面对文件的操作是通过文件指针,以及一些相关的函数,那么C++中是如何对文件进行操作的呢?没错,就是通过fstream这个文件流来实现的。当我们使用#include时,我们就可以使用其中的ifstream,ofstream以及fstream这三个类了(ofstream是从内存到硬盘,ifstream是从硬盘到内存),也就可以用这三个类来定义相应的对象了,这三个类分别代表一个输入文件…

    2026年1月28日
    6
  • 分布式锁有哪些,怎么实现(分布式锁的三种实现的对比)

    一、为什么要使用分布式锁我们在开发应用的时候,如果需要对某一个共享变量进行多线程同步访问的时候,可以使用我们学到的Java多线程的18般武艺进行处理,并且可以完美的运行,毫无Bug!注意这是单机应用,也就是所有的请求都会分配到当前服务器的JVM内部,然后映射为操作系统的线程进行处理!而这个共享变量只是在这个JVM内部的一块内存空间!后来业务发展,需要做集群,一个应用需要部署到几台机器上然后做负载均…

    2022年4月15日
    41
  • Little Sub and Piggybank (杭师大第十二届校赛G题) DP

    Little Sub and Piggybank (杭师大第十二届校赛G题) DP题目传送门题意 每天能往存钱罐加任意实数的钱 每天不能多于起那一天放的钱数 如果某一天的钱数恰好等于那天的特价商品 则可以买 求最后的最大快乐值 思路 先来一段来自出题人的题解 显然的贪心 如果第 i 天买完 准备在第 j 天买 那么显然最优是在 i 1 到 j 天放 wi j i 的钱 于是假定选择的物品是 k1 k2 k3 那么必须满足 a ki

    2026年3月18日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号