GCT:Gated Channel Transformation for Visual Recognition

2024-03-10 02:10

本文主要是介绍GCT:Gated Channel Transformation for Visual Recognition,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

论文名称:Gated Channel Transformation for Visual Recognition

作者:Zongxin Yang, Linchao Zhu, Y u Wu, and Yi Yang

Code:https://github.com/z-x-yang/GCT

摘要

  • GCT模块是一个普遍适用的门控转换单元,可与网络权重一起优化。
  • 不同于SEnet通过全连接的隐式学习,其使用可解释的变量显式地建模通道间的关系,决定是竞争或是合作。

关键词:可解释性、显式关系、门控

介绍

  • 单个卷积层只对Feature Map中每个空间位置的临近局部上下文进行操作,这可能会导致局部歧义。通常有两种方法解决这种问题:一是增加网络的深度,如VGG,Resnet,二是增加网络的宽度来获得更多的全局信息,如GEnet大量使用领域嵌入,SEnet通过全局嵌入信息来建模通道关系。
  • 然而SEnet中使用fc层会出现两个问题:
    1. 由于使用了fc层,出于节省参数的考虑,无法在所有层上使用
    2. fc层的参数较为复杂,难以分析不同通道间的关联性,这实际上是一种隐式学习
    3. 放在某些层之后会出现问题

相关工作

门控机制

门控机制已经成功地应用于一些循环神经网络结构中。LSTM引入了输入门、输出门和遗忘门,用于调节模块的进出信息流。基于门控机制,一些注意力方法侧重于将计算资源集中于特征信息最丰富的部分。

归一化层

近年来,归一化层被广泛应用于深度网络中。局部响应归一化(LRN)为每个像素计算通道间一个小邻域内的统计信息;批量归一化(BN)利用批维度上的全局空间信息;层归一化(LN)沿着通道维度而不是批处理维度计算;组归一化(GN)以不同的方式将通道划分为组,并在每个组内计算均值和方差来进行归一化。

GCT

设计思路:

  1. 通过p-norm嵌入全局上下文信息
  2. 通过嵌入信息与可训练参数来进行通道归一化
  3. 通过门控权重与偏置来实现通道门控注意力机制

整体结构

image-20210513113146461

GCT模块主要包括三个部分——全局上下文嵌入通道归一化、和门控自适应。其中,归一化操作时无参的。

同时,为了使GCT可学习,引入了三个权重—— α 、 γ 、 β \alpha、\gamma、\beta αγβ α \alpha α负责自适应嵌入输出。门控权重 γ \gamma γ和偏置 β \beta β负责控制门的激活。

另外,GCT的参数复杂度为 O ( C ) O(C) O(C),而SEnet 的复杂度为 O ( C 2 ) O(C^2) O(C2)

则GCT模块的激活特征为:
x ^ = F ( x ∣ α , γ , β ) , α , γ , β ∈ R c \hat x=F(x|\alpha,\gamma,\beta),\alpha,\gamma,\beta \in \mathbb{R}^c x^=F(xα,γ,β),α,γ,βRc

全局上下文嵌入

较大的感受野可以避免局部语义歧义,因此设计了一个全局上下文嵌入模块来聚合每个通道中的全局上下文信息。

GAP(全局平均池化)在某些情况下会失效,如将SE模块部署在LN层之后,因为LN固定了每个通道的平均数,对于任意输入,GAP的输出都是恒定的。

这里选用了p-norm来进行全局上下文嵌入,2-norm的效果最好,1-norm的效果与其十分接近,但是注意,当p=1时,对于非负输入(如部署在ReLU之后),将等价于GAP

其中参数 α \alpha α定义为 α = [ α 1 . . . α C ] \alpha=[\alpha_1...\alpha_C] α=[α1...αC],当 α n \alpha_n αn接近0时,该通道将不参与通道归一化

该模块定义为:
s c = α ∣ ∣ x c ∣ ∣ p = α { [ ∑ i = 1 H ∑ i = 1 W ( x c i , j ) p ] + ε } 1 p s_c=\alpha||x_c||_p=\alpha\{[\sum_{i=1}^H\sum_{i=1}^W(x_c^{i,j})^p]+\varepsilon\}^{\frac{1}{p}} sc=αxcp=α{[i=1Hi=1W(xci,j)p]+ε}p1
其中 ε \varepsilon ε为一个极小的常数避免了零点处求导问题。

通道归一化

归一化方法可以在神经元(或通道)之间建立竞争关系,使得其中通道响应较大的值变得相对更大,并抑制其他反馈较小的通道(该说法最早可能在LRN论文中提出,但是该论文并没有给出任何解释,或许当** C ∣ ∣ s c ∣ ∣ 2 > 1 \frac{\sqrt{C}}{||s_c||_2}>1 sc2C >1**大于1时会起到建立竞争关系的作用),这里使用 l 2 l_2 l2正则化来进行通道归一化。

类似于LRN,其定义如下:
s c ^ = C s c ∣ ∣ s ∣ ∣ 2 = C s c [ ( ∑ i = 1 C s c 2 ) + ε ] 1 2 \hat{s_c}=\frac{\sqrt{C}s_c}{||s||_2}=\frac{\sqrt{C}s_c}{[(\sum_{i=1}^{C}s_c^2)+\varepsilon]^{\frac{1}{2}}} sc^=s2C sc=[(i=1Csc2)+ε]21C sc

门控自适应

定义如下:
x c ^ = x c [ 1 + tanh ⁡ ( γ c s c ^ + β c ) ] \hat{x_c}=x_c[1+\tanh(\gamma_c\hat{s_c}+\beta_c)] xc^=xc[1+tanh(γcsc^+βc)]
当一个通道的门控权重被积极激活时,GCT促进该通道与其他通道竞争。当门控权重被消极激活时,GCT鼓励该通道与其他通道合作。

此外,当门控权重和门控偏置为0时,允许原始特征传递到下一层:
x ^ = F ( x ∣ α , 0 , 0 ) = x \hat{x}=F(x|\alpha,0,0)=x x^=F(xα,0,0)=x
该特性可以有效解决深层网络退化问题,ResNet也从该思想中受益。

因此建议在GCT层初始化中将γ和β初始化为0。这样,训练过程的初始步骤会更加稳定,GCT的最终表现也会更好。

代码

class GCT(nn.Module):def __init__(self, num_channels, epsilon=1e-5, mode='l2', after_relu=False):super(GCT, self).__init__()self.alpha = nn.Parameter(torch.ones(1, num_channels, 1, 1))self.gamma = nn.Parameter(torch.zeros(1, num_channels, 1, 1))self.beta = nn.Parameter(torch.zeros(1, num_channels, 1, 1))self.epsilon = epsilonself.mode = modeself.after_relu = after_reludef forward(self, x):if self.mode == 'l2':embedding = (x.pow(2).sum((2, 3), keepdim=True) +self.epsilon).pow(0.5) * self.alpha #[B,C,1,1]norm = self.gamma / \ (embedding.pow(2).mean(dim=1, keepdim=True) + self.epsilon).pow(0.5)# [B,1,1,1],公式中的根号C在mean中体现elif self.mode == 'l1':if not self.after_relu:_x = torch.abs(x)else:_x = xembedding = _x.sum((2, 3), keepdim=True) * self.alphanorm = self.gamma / \(torch.abs(embedding).mean(dim=1, keepdim=True) + self.epsilon)else:print('Unknown mode!')sys.exit()gate = 1. + torch.tanh(embedding * norm + self.beta)# 这里的1+tanh就相当于乘加操作return x * gate

可解释性

门控权重

将门控权重在ResNet-50上的分布进行可视化:

image-20210520220336157

  • value代表权重的值
  • index of layers表示权重所在网络层数的维数,越大说明其位置越靠近输出
  • density of params表示参数的密度,这里做了 log ⁡ ( 1 + z ) \log(1+z) log(1+z)的处理来放缩 z z z

计算门控权重在不同位置的均值和方差:

image-20210520220709174

可以看到:

  • 网络浅层,门控权重的均值小于0,GCT模块倾向于减小通道差异性,鼓励通道之间合作。
  • 网络深层,门控权重的均值大于0,GCT模块倾向于增加通道差异性,鼓励通道之间竞争。

对于合作和竞争的解释

  • 在网络浅层,主要学习低级特征,如纹理,边缘等,对于这些基础特征,我们需要通道之间进行合作,以更加广泛地提取特征。
  • 在网络深层,主要学习高级特征,它们之间的差异往往很大,而且与任务有直接关系,我们需要通道之间进行竞争,来获得更有价值的特征信息。

溶解研究

本文并没有对GCT各部分块的有效性进行探索,而是对各个部分中的p-norm方法以及激活函数进行对比。

文中仅仅给出了门控权重的有效性,并没有具体分析门控偏置和嵌入权重的作用。

补充

训练

将GCT模块添加进已有的模型时,可以先冻结网络的其他参数而只训练GCT模块中的参数,之后再将网络解冻一起训练。

也可以将GCT从一开始就加入网络之中,从头开始训练。

思考

通过5.1中的权重分布图可以发现,有相当大的一部分权重集中在0左右,是否可以说明GCT存在一定的冗余?

可以探索更多全局信息嵌入的方法以及归一化的方法。

这篇关于GCT:Gated Channel Transformation for Visual Recognition的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/792675

相关文章

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

Go Channel的实现

channel作为goroutine间通信和同步的重要途径,是Go runtime层实现CSP并发模型重要的成员。在不理解底层实现时,经常在使用中对channe相关语法的表现感到疑惑,尤其是select case的行为。因此在了解channel的应用前先看一眼channel的实现。 Channel内存布局 channel是go的内置类型,它可以被存储到变量中,可以作为函数的参数或返回值,它在r

【Visual Studio 报错】未加载 wntdll.pdb(一种可行的解决办法)

调试程序时,会出现下面这个报错 分析原因: 出现未加载 wntdll.pdb 报错大概率是你的指针使用错误 ,比如使用野指针、越界访问、或者堆区空间释放方式错误等。 这里以 堆区空间释放方式错误 为例子 1、堆区开辟的数组空间使用 delete 释放 // 堆区开辟的数组空间使用 delete 释放int* p = new int[10];delete p; 正

查看Excel 中的 Visual Basic 代码,要先设置excel选项

1. excel VB的简单介绍 百度安全验证 2.excel选项设置 excel表格中在选项->自定义功能区域,选择开发工具,visual baisc/查看代码,即可看到代码。 3.excel已经设置,可以直接查看

[VC] Visual Studio中读写权限冲突

前置场景: 编译没有报错,但是运行提示 内存异常: 情景1: 如下代码运行异常,提示引发了异常:写入权限冲突。*** 是 0xFFFFF..... char* str = (char*)malloc(10);str[0] = 0x30;  解决方案:要包含头文件<stdlib.h>  情景2: 在FileA文件调用FileB文件的函数,但是在FileA中却没有声明该B函数的原型

解决Visual C++ 中相互包含头文件的问题

在编MFC应用程序时,经常会遇到头文件相互包含的问题,很是苦恼,于是便求助于强大的CSDN,得到如下答案:   方法一:利用友元类   我一共有两个类,由于要在两个类的头文件里互相应用对方,所以,在每一个类的头文件里面现包含另一个类的头文件,然后在该类的定义中声明另一个类为友元类。如下:    #include "B.h"      class CA: public CDialog

【go 通道】go语言通道channel

通过使用通道,在多个goroutine发送和接受共享的数据,达到数据同步的目的。 通道,他有点像在两个routine之间架设的管道,一个goroutine可以往这个管道里塞数据,另外一个可以从这个管道里取数据,有点类似于我们说的队列。 声明一个通道很简单,我们使用chan关键字即可,除此之外,还要指定通道中发送和接收数据的类型,这样我们才能知道,要发送什么类型的数据给通道,也知道从这个通道里可

如何简单而优雅地升级Visual NMP中的PHP版本

需求:自己想测试下不同版本的PHP性能,就想升级下 Visual 这个集成环境中PHP的版本 网上: 升级PHP到5.6.11  1、下载新的nts版的PHP并解压缩到bin\PHP下,保留原文件夹的名称; 2、将旧版PHP文件夹下的PHP.ini复制到新版的PHP文件夹下;修改复制的PHP.ini,将旧版PHP文件夹信息替换成新版PHP文件夹信息; 3、下载php_xdebug-2.3

应用Visual Studio Profiler分析CPU使用情况

使用Visual Studio Profiler分析CPU使用情况‌的步骤如下: 1.‌启动CPU分析:‌ 在Visual Studio中打开你要分析的项目。 在菜单栏中选择Debug > Performance Profiler,或者使用快捷键Alt + F2。 在性能分析工具窗口中,选择CPU Usage选项,这将帮助你分析应用程序的CPU使用情况。 2.‌运行CPU

已解决:Visual studio2022突然只能打字不能使用回车键、退格键

本问题已得到解决,请看以下小结: 关于《VS2022部分按键失灵》的解决方案 记录备注报错时间2024年报错版本VS2022报错复现写代码,点击删除键失灵了报错描述点击关闭提示如下: Microsoft visual studio 已检测到某个操作正在阻止用户输入。这可能是由活动模式对话框或需要阻止用户交互的任务所致。是否仍要关闭?报错截图-报错原因不详解决步骤 1.VS2022搜索键盘,点击