标签:
这是一份很新的Paper(2015.6),来自于Google旗下的新锐AI公司DeepMind的三位剑桥Phd研究员。
他们针对CNN的特点,构建了一个新的局部网络层,称为空间变换层,如其名,它能将输入图像做任意空间变换。
在我的论文[深度神经网络在面部情感分析系统中的应用与改良]中,提出了一个有趣观点:
大数据不如小数据,如果大数据不能被模型有效利用。
该现象是比较常见的,如ML实战的一个经典问题:数据不均衡,这样模型就会对大类数据过拟合,忽略小类数据。
另外,就是[Evolving Culture vs Local Minima:文化、进化与局部最小值]提到的课程学习观点:
将大数据按照难易度剖分,分批学习,要比直接全部硬塞有效得多。
当前,我们炙手可热的模型仍然是蒟蒻的,而数据却是巧夺天工、超乎想象的。
因而,想要通过模型完全摸清数据的Distribution是不现实的,发明、改良模型结构仍然是第一要务,
而不单纯像Li Feifei教授剑走偏锋,用ImageNet这样的大数据推进深度学习进程。
在我的论文[深度神经网络在面部情感分析系统中的应用与改良]中,分析了CNN的三个强大原因:
[局部性]、[平移不变性]、[缩小不变性],还对缺失的[旋转不变性]做了相应的实验。
这些不变性的本质就是图像处理的经典手段,[裁剪]、[平移]、[缩放]、[旋转]。
这些手段又属于一个家族:空间变换,又服从于同一方法:坐标矩阵的仿射变换。
那么,神经网络是否有办法,用一种统一的结构,自适应实现这些变换呢?DeepMind用一种简易的方式实现了。
实现[裁剪]、[平移]、[缩放]、[旋转],只需要一个$[2,3]$的变换矩阵:
$\begin{bmatrix}\theta_{11} & \theta_{12} & \theta_{13} \\ \theta_{21}& \theta_{22} & \theta_{23}\end{bmatrix}$
—————————————————————————————————————————————————————————
对于平移操作,坐标仿射矩阵为:
$\begin{bmatrix}1 & 0 & \theta_{13} \\ 0& 1 & \theta_{23}\end{bmatrix}\begin{bmatrix}x\\ y\\1\end{bmatrix}=\begin{bmatrix}x+\theta_{13}\\
y+\theta_{23}\end{bmatrix}$
—————————————————————————————————————————————————————————
对于缩放操作,坐标仿射矩阵为:
$\begin{bmatrix}\theta_{11} & 0 & 0 \\ 0& \theta_{22} & 0\end{bmatrix}\begin{bmatrix}x\\ y\\1\end{bmatrix}=\begin{bmatrix}\theta_{11}x\\
\theta_{22}y\end{bmatrix}$
—————————————————————————————————————————————————————————
对于旋转操作,设绕原点顺时针旋转$\alpha$度,坐标仿射矩阵为:
$\begin{bmatrix}cos(\alpha) & sin(\alpha) & 0 \\ -sin(\alpha)& cos(\alpha) & 0\end{bmatrix}\begin{bmatrix}x\\ y\\1\end{bmatrix}=\begin{bmatrix}
cos(\alpha)x+sin(\alpha)y\\ -sin(\alpha)x+cos(\alpha)y\end{bmatrix}$
这里有个trick,由于图像的坐标不是中心坐标系,所以只要做下Normalization,把坐标调整到[-1,1]。
这样,就绕图像中心旋转了,下文中会使用这个trick。
—————————————————————————————————————————————————————————
至于裁剪操作,没有看懂Paper的关于左2x2 sub-matrix的行列式值的解释,但可以从坐标范围解释:
只要$x^{‘}$、$y^{‘}$的范围比$x$,$y$小,那么就可以认为是目标图定位到了源图的局部。
这种这种仿射变换没有具体的数学形式,但肯定是可以在神经网络搜索过程中使用的。
在线性代数计算中,一个经典的求解思路是:
$\begin{bmatrix}\theta_{11} & \theta_{12} & \theta_{13} \\ \theta_{21}& \theta_{22} & \theta_{23}\end{bmatrix}\begin{bmatrix}x^{Source}\\ y^{Source}\\ 1\end{bmatrix}=\begin{bmatrix}x^{Target}\\ y^{Target}\end{bmatrix}$
这种做法在做图像处理时,会给并行矩阵程序设计造成尴尬——需要牺牲额外的空间存储映射源,:
由于$(x^{Target},y^{Target})$必然是离散的,当我们需要得到$Pixel(x^{Target},y^{Target})$的值时,
如果不及时保存$(x^{Source},y^{Source})$,那么就必须即时单点复制$Pixel(x^{Source},y^{Source})->Pixel(x^{Target},y^{Target})$
显然,这种方法的实现依赖于$For$循环:
$For(0....i....Height)\\ \quad For(0....j....Width) \\ \quad \quad Calculate\&Copy$
为了能让矩阵并行计算成为可能,我们需要逆转一下思路:
$\begin{bmatrix}\theta_{11} & \theta_{12} & \theta_{13} \\ \theta_{21}& \theta_{22} & \theta_{23}\end{bmatrix}^{‘}\begin{bmatrix}x^{Target}\\ y^{Target}\\ 1\end{bmatrix}=\begin{bmatrix}x^{Source}\\ y^{Source}\end{bmatrix}$
之后,构建变换目标图就转化成了,数组下标取元素问题:
$PixelMatrix^{Target}=PixelMatrix^{Source}[x^{Source},y^{Source}]$
这依赖于仿射矩阵的一个性质:
$\begin{bmatrix}\theta_{11} & \theta_{12} & \theta_{13} \\ \theta_{21}& \theta_{22} & \theta_{23}\end{bmatrix}^{‘}=\begin{bmatrix}\theta_{11} & \theta_{12} & \theta_{13} \\ \theta_{21}& \theta_{22} & \theta_{23}\end{bmatrix}^{-1}$
即,由Target变换为Source时,新仿射矩阵为源仿射矩阵的逆矩阵。
考虑一个$[1,10]$图像放大10倍问题,我们需要将10个像素,扩展到为100的数轴上,整个图像应该有100个像素。
但其中90个对应Source图的像素坐标是非整数的,是不存在的,如果我们用黑色( $RGB(0,0,0)$ ) ,此时图像是惨不忍睹的。
所以需要对缺漏的像素进行插值,利用图像数据的局部性近似原理,取邻近像素做平均生成。
双线性插值是一个兼有质量与速度的方法(某些电子游戏里通常这么排列:线性插值、双线性插值....):
如果$(x^{Source},y^{Source})$是实数坐标,那么先取整(截尾),然后沿轴扩展$d$个坐标单位,得到$P_{21}$、$P_{12}$、$P_{22}$
一般的(源码中),取$d=1$,式中分母全被消去,再利用图中双线性插值式进行插值,得到$Pixel(x^{Source},y^{Source})$的近似值。
Spatial Transformer Networks(空间变换神经网络)
标签:
原文地址:http://www.cnblogs.com/neopenx/p/4851806.html