深度学习方法(十二):卷积神经网络结构变化——Spatial Transformer Networks

欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld。
技术交流QQ群:433250724,欢迎对算法、机器学习技术感兴趣的同窗加入。html


今天具体介绍一个Google DeepMind在15年提出的Spatial Transformer Networks,至关于在传统的一层Convolution中间,装了一个“插件”,可使得传统的卷积带有了[裁剪]、[平移]、[缩放]、[旋转]等特性;理论上,做者但愿能够减小CNN的训练数据量,以及减小作data argument,让CNN本身学会数据的形状变换。这篇论文我相信会启发不少新的改进,也就是对卷积结构做出更多变化,仍是比较有创意的。算法

背景知识:仿射变换、双线性插值

在理解STN以前,先简单了解一下基本的仿射变换、双线性插值;其中,双线性插值请跳转至我刚刚写的一篇更详细的介绍“三十分钟理解:线性插值,双线性插值Bilinear Interpolation算法”。这里只放一个示意图[1]:markdown

这里写图片描述

而仿射变换,这里只介绍论文中出现的最经典的2D affine transformation,实现[裁剪]、[平移]、[缩放]、[旋转],只须要一个[2,3]的变换矩阵:网络

这里写图片描述

对于平移操做,仿射矩阵为:架构

这里写图片描述

对于缩放操做,仿射矩阵为:less

这里写图片描述

对于旋转操做,设绕原点顺时针旋转αα度,坐标仿射矩阵为:
(这里有个trick,因为图像的坐标不是中心坐标系,因此只要作下Normalization,把坐标调整到[-1,1])[1]
这里写图片描述机器学习

至于裁剪(Crop)操做,做者在论文中提到:ide

determinant of the left 2×2 sub-matrix has magnitude less than unity学习

其实做用就是让变换后的坐标范围变小了,这样就至关于从原图中裁剪出来一块;atom

Spatial Transformer Networks

OK,开始讲正题。论文中做者讲的比较简略,因此初看有点费劲,并且我看了网上不少资料,很对博主本身也没有理解清楚。最主要的结构图,仍是这张:

这里写图片描述
图1 STN架构

按照做者的说法,STN能够被安装在任意CNN的任意一层中——这里有些同窗有误解,觉得上图中U到V是原来的卷积,而且在卷积的路径上加了一个分支,其实并非,而是将原来的一层结果U,变换到了V,中间并无卷积的操做。看下图右边,经过U到V的变换,至关于又生成了一个新数据,而这个数据变换不是定死的而是学习来的,即然是学习来的,那它就有让loss变小的做用,也就是说,经过对输入数据进行简单的空间变换,使得特征变得更容易分类(往loss更小的方向变化)。另一方面,有了STN,网络就能够动态地作到旋转不变性,平移不变性等本来认为是Pooling层作的事情,同时能够选择图像中最终要的区域(有利于分类)并把它变换到一个最理想的姿态(好比把字放正)。

这里写图片描述

再回到前面图1 STN架构中,分为三个部分:

  1. Localisation net
  2. Grid generator
  3. Sampler

Localisation net
把feature map U做为输入,过连续若干层计算(如卷积、FC等),回归出参数 θ ,在咱们的例子中就是一个[2,3]大小的6维仿射变换参数,用于下一步计算;

Grid generator
名字叫grid生成器,啥意思?理解了这个名字就理解了这一步作啥了——在source图中找到用于作插值(双线性插值)的grid。这也是不少人理解错的地方。仔细看下前面公式1:

这里写图片描述

s表示source(U中的坐标),t表示target(V中的坐标)。是否是很奇怪?由于前向计算中,是已知U的,而这个公式怎么是把V作变换呢?——其实这里的意思是,经过仿射变换,找到目标V中的坐标点变换回source U中的坐标在哪里,而V这时候尚未产生,须要经过下一层采样器sampler来产生。

Sampler
做者也叫这一步Differentiable Image Sampling,是但愿经过写成一种形式上可微的图像采样方法,目的是为了让整个网络保持能够端到端反向传播BP训练,用一种比较简洁的形式表示双线性插值的公式:

这里写图片描述

和最前面双线性插值的示意图含义是同样的,只是由于在图像中,相邻两个点的坐标差是1,就没有分母部分了。而循环中大部分都没用的,只取相邻的四个点做为一个grid。

因此上面 2. Grid generator和 3. Sampler是配合的,先经过V中坐标 (xtarget,ytarget) 以此找到它在U中的坐标,而后再经过双线性插值采样出真实的像素值,放到 (xtarget,ytarget) 。到这里一层STN就结束了。最后再借用一张[1]做者的示意图做为总结,仍是比较清楚的(固然,[1]中做者写的有些理解我看下来也有不许确的,里面的评论区也有讨论,读者本身鉴别一下)。
这里写图片描述


OK,本文就讲到这里,基本上前向过程都提到了,论文中还有关于求导(由于Sampler不连续,只能求Sub-Gradient)和训练loss的一些内容,推荐读者再结合论文看一下,这里不写了。另外,但愿写博客的同窗本身可以多理解清楚一点再写,不要随便糊弄一下~~~

欢迎转载,注明出处便可。预告一下,下一篇讲一下最新MSRA的deformable convolutional network,和STN有不少类似的idea,也比较有意思。

参考资料

[1] http://www.cnblogs.com/neopenx/p/4851806.html
[2] http://blog.csdn.net/shaoxiaohu1/article/details/51809605 [3] Spatial Transformer Networks, DeepMind,2015

相关文章
相关标签/搜索