- GAvP (1st–order) In-between Network
- GSoP (2nd–order) at Network Net
- position-wise GSoP
- Mechanism of GSoP Block
- https://github.com/ZilinGao/Global-Second-order-Pooling-Convolutional-Networks/blob/master/torchvision/models/resnet.py">https://github.com/ZilinGao/Global-Second-order-Pooling-Convolutional-Networks/blob/master/torchvision/models/resnet.py
- init
- 针对resnet引入GSop block
- forward
论文原味: Global Second-order Pooling Convolutional Networks_2018 代码地址: GSop-Net codes
事实上对文中所说的:
To better characterize complex boundaries of thousands of classes in a very high dimensional space, one possible solution is to learn higher order representations for enhancing nonlinear modeling capability of ConvNets
不懂……他们看待深度学习的方式和自己可能存在比较大的差异,所以我们在掌握技术的时候也需要了解别人是如何看待CNN的(当然,他们的看法可能是从某一特定角度而言,不同的角度往往产生不同的灵感)。
在本文之前,事实上GSoP主要用在网络的最后一层可以替代全局平均池化(GAVP)。值得一提的是,SE-Net和CBAM模块在引入注意力机制时,同样是采用的全局池化的方式产生权重(本文亦是受SE-Net启发)!
与SE-Block,CBAM-Module类似,GSop也是一个模块,能够运用于网络中间层。其架构如下图所示:
ablation study: An ablation study typically refers to removing some “feature” of the model or algorithm, and seeing how that affects performance. ImageNet benchmark: ImageNet 数据集上达到的性能基准。
GAvP (1st–order) In-between Network
事实上GAvP即是一个平均操作,平均操作是一个一阶的统计特征。
一阶统计特征,
GSoP (2nd–order) at Network Net
GSop进行二阶统计,利用高阶统计特征。本文设计了两个GSop-Net,分别叫做GSop-Net1和GSop-Net2,GSop-Net1在中间插入GSoP模块,GSop-Net2在末尾插入GSop模块。GSoP和SE-Block一样由squeeze module and excitation module组成,GSop操作如上图b所示:
挤压阶段:
- 首先,利用
进行维度压缩:
;
- 然后,计算两两通道相关性,产生
的协方差矩阵;
- 协方差公式:
(图像数据如何求相关性?)
- 协方差
行表示了
通道和其它通道的相关性;
- 由于协方差矩阵计算时,平方操作将数据进行了一次升阶操作,我们关于行进行标准化;(没有搞明白)
- 值得注意的是,协方差矩阵的计算,综合了不同通道的全局信息;
- 协方差公式:
激活阶段:
- 两次关于行的卷积操作;(如何卷积?)
- 就是把整行一下操作,见下面图片;
- 第一次利用Leaky Relu作为激活函数,第二次利用Sigmoid作为激活函数;
- 第一次使用4个filter,产生
;
- 第二次采样
个filter;
- conv操作可以参考下文resnet GSop引入的图片(不是代码);
- 第一次使用4个filter,产生
- 最后,将权重向量和原通道数据进行点乘,从而在通道的维度上进行权重赋值,实现注意力机制;
以上是channelwise GSoP!
与SE-Block相比,本文的权重获取更偏向于自动化,获取的方式通过学习得到(卷积操作的参数)。 值得注意的是,我们在引入模块的时候,往往还需要考虑计算量的问题,当然有可能权重的获取可以直接用全连接类似的操作,但是那样会产生较大的计算量。
position-wise GSoP
和channelwise GSoP很相似。步骤如下:
- 首先,为了减少计算量,通过
卷积进行维度压缩为
,下采样为
;
- 计算协方差矩阵,最终产生的协方差矩阵size
;
- 然后进行row-wise convolution+LReLU and convolution+sigmoid操作;
- 再进行合适的reshape,产生
权重矩阵;
- 最后进行上采样,得到
的权重,最后基于元素乘法乘到原数据;
Mechanism of GSoP Block
如上图所示,经典的卷积网络无法获取全局的信息,当然随着网络深度的加深,其感受野变大,但是其仍旧很难从全局上来把握信息(Non-local neural networks)(论文中说的是long-range dependency)
下面代码是resnet中引入GSop模块,主要是GSop_mode == 2处代码(原项目中有对应的文件) ```pythonhttps://github.com/ZilinGao/Global-Second-order-Pooling-Convolutional-Networks/blob/master/torchvision/models/resnet.py
init
针对resnet引入GSop block
if GSoP_mode == 1: self.avgpool = nn.AvgPool2d(14, stride=1) self.fc = nn.Linear(512 block.expansion, num_classes) print(“GSoP-Net1 generating…”) else : self.isqrt_dim = 256 self.layer_reduce = nn.Conv2d(512 block.expansion, self.isqrt_dim, kernel_size=1, stride=1, padding=0, bias=False) self.layer_reduce_bn = nn.BatchNorm2d(self.isqrt_dim) self.layer_reduce_relu = nn.ReLU(inplace=True) self.fc = nn.Linear(int(self.isqrt_dim * (self.isqrt_dim + 1) / 2), num_classes) print(“GSoP-Net2 generating…”)
forward
if self.GSoP_mode == 1: x = self.avgpool(x) else : x = self.layer_reduce(x) x = self.layer_reduce_bn(x) x = self.layer_reduce_relu(x)
# 下面三个模块,代码很复杂的样子,不知道是否分别对应:协方差求取、row-wise conv、第二个conv
x = MPNCOV.CovpoolLayer(x)
x = MPNCOV.SqrtmLayer(x, 3)
x = MPNCOV.TriuvecLayer(x)
总结
提高网络性能的一个方式:构造合理的捕获全局信息的方式。很多论文都有提到,全局信息的获取能够提高忘了性能。
深度学习其它问题:计算量大、数据集、可解释性;
注意力机制其实就是一种加权方式,注意力模块的目的就是希望通过对原数据的分析,在channel维度,position维度进行权重的获取。