论文笔记:Non-Local Neural Network
Abstract
卷积和循环操作都一次只在一个局部neighborhood上操作。
受到传统计算机视觉中非局部中值计算的启发,作者决定使用此方法在深度学习上。
公式
通用公式:
yi=C(x)1∀j∑f(xi,xj)g(xj)
y is output. x 是输入信号。i是输出的值第i位置的值,j代表所有可能位置。
y 与x 具有相同大小的维度。
C(x)是正则化常量
f代表两处变量的关系
非局部模块十分的灵活,可以放在网络的前面,可以很容易与循环层,卷积层放到一起。
实例
为了简便考虑,g就作为一个简单的线性变换g(xj)=Wgxj, 其中Wg是作为需要学习的参数。
接下来我们考虑函数f:
Gaussian
f(xi,xj)=exiTxj
自然的想法就是使用高斯函数。其中C(x)=∑∀jf(xi,xj).
Embedded Gaussian
f(xi,xj)=eθ(xi)Tϕ(xj)
其中θ(xi)=Wθxi and ϕ(xj)=Wϕxj, 我们同样可以设置C(x)=∑∀jf(xi,xj).
于是这个计算就变成了softmax: y=softmax(xTWθTWϕx)g(x)
Dot Product
f(xi,xj)=θ(xi)Tϕ(xj)
设置C(x)=N, 其中N是位置x的个数
Concatenation
f(xi,xj)=ReLU(wfT[θ(xi),ϕ(xj)])
其中Wf是一个将组合映射到标量的权重向量。 我们设置 C(x)=N.
非局部块
定义:
zi=Wzyi+xi
yi是式子(1)的结果, +xi表示残差连接(residual connection)是为了使我们可以添加非局部块到任何提前训练(pre-trained)的模型而不破坏模型结构(比如如果Wz被初始化为0)。图二是一个例子

这里可以通过矩阵乘法和加法巧妙的实现非局部变换。
写下来截图的部分便是前文提到的embedding Gaussian的f

这里θ和ϕ函数都对输入信号进行了降低通道处理。(从T×W×H×1024 降到 T×W×H×512)这样可以降低计算,同时也符合瓶颈算法设计。
同时文中说可以将(1)式修改为
c(x^)1∀j∑f(xi,x^j)g(x^j)
其中x^表示池化后x的子采样。 我们通过给θ和ϕ添加赤化层达到这个效果,从而可以使得计算降低1/4.
实现细节
2D ConvNet baseline (C2D)

输入的是32帧的224x224像素视频。整个模型直接使用 ResNet 在ImageNet pre-trained 的权重。只有在赤化层使用了时域。
Inflated 3D ConvNet (I3D)
把卷积核在时域上膨胀开。比如2D上的k×k 膨胀成 t×k×k
因为3D计算量过于旁大,所以每两个瓶颈只膨胀一个卷积核。要么膨胀3x3成3x3x3;要么膨胀1x1成3x1x1
Non-local Network
作者在两种baseline上分别添加了1,5,10个非局部块做实验
大,所以每两个瓶颈只膨胀一个卷积核。要么膨胀3x3成3x3x3;要么膨胀1x1成3x1x1
Non-local Network
作者在两种baseline上分别添加了1,5,10个非局部块做实验
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-crjZNYL2-1596448249812)(image-20200803174903515.png)]