各种动态卷积(CondConv、DynamicConv、ODConv、DyNet...)

CondConv 条件参数化卷积

论文地址:CondConv: Conditionally Parameterized Convolutions for Efficient Inference

对于普通卷积,数据集中的所有的样本共享同一组卷积参数,作者提出了条件参数化卷积,为每个样本学习专门的卷积核,同时可以增加网络的大小和容量,还能够保持高效推理。它等效于多分支卷积层,并且通过加权来聚合输出,只需要进行一个卷积的计算。

CondConv将卷积参数化为N个专家的线性组合(α1W1 + ...+ αnWn),α是一组依赖输入的可学习的权重参数,而每个专家是一个静态的卷积核。其实就是类似于SE注意力机制,SE是为每个通道分配一个权重,CondConv是为每个卷积核分配一个权重。

Output(x) = σ((α1 · W1 + . . . + αn · Wn) ∗ x)

作者认为下式是等效的,并且拥有更高的计算效率,等式左边只需要进行一次卷积操作,等式右边需要n次卷积操作。

σ((α1 · W1 + . . . + αn · Wn) ∗ x) = σ(α1 · (W1 ∗ x) + . . . + αn · (Wn ∗ x))

权重如何生成?权重是依赖输入的,通过池化操作和全连接层将输入特征映射到N个专家的路由权重矩阵,再利用Sigmoid函数进行归一化处理生成。

r(x) = Sigmoid(GlobalAveragePool(x) R)

将生成的N个权重分配给N个专家卷积进行加权,然后再将输入样本与加权后的卷积核进行卷积运算,得到最终特征图。

Output(x) = σ((α1 · W1 + . . . + αn · Wn) ∗ x)

DynamciConv 动态卷积

论文地址:Dynamic Convolution: Attention over Convolution Kernels

该文章表示可以在不增加网络深度或宽度的情况下增加模型的复杂性,同时增加的计算成本可以忽略不计。

其实主体思想是和上一个差不多的,都是利用一组N个并行的专家卷积核,然后根据每个输入样本动态地聚合这些卷积核。

主要就是权重矩阵的生成方式有点区别,如上图所示,DyConv使用两个全连接层(中间还有个ReLU层),并且在最后利用softmax来生成矩阵权重,作者认为,利用softmax生成的权重和为1,相当于多了一个约束条件,解的空间就变小了,这样网络就更容易收敛。

并且在softmax中使用较大的温度对权重进行平滑处理,在早期训练阶段采用温度退火策略进行线性降低,可以加快网络的收敛。

DyNet

论文地址:

DYNET: DYNAMIC CONVOLUTION FOR ACCELERATING CONVOLUTIONAL NEURAL NETWORKS

这篇文章不知道和CondConv那篇有什么区别,感觉就是从别的角度(noise-irrelevant feature这个角度)出发来说明了动态卷积的有效性。

权重是如何生成的?本文提出了一个系数预测模块,由全局平均池化层和以Sigmoid作为激活函数的全连接层组成。全局平均池化层将输入特征映射聚合成1 × 1 × Cin向量,作为特征提取层。然后,全连接层进一步将特征映射到1×1×C向量,该向量是几个动态卷积层的固定卷积核的系数。其实也就是根据输入特征图生成C个静态卷积核的权重系数,和CondConv是一样的。

ODConv 全维卷积

论文地址:OMNI-DIMENSIONAL DYNAMIC CONVOLUTION

ODConv就是除了在卷积核的维度分配权重外(给n个专家卷积分配权重),还在卷积核的其它三个维度上分别进行了权重的分配。

该文作者认为通过内核空间的一个维度(关于卷积核数)赋予卷积核动态特性,但忽略了其他三个维度(关于空间大小,每个卷积核的输入通道数和输出通道数),根据此启发,提出了ODConv,即沿着核空间的四维分别学习四个维度上的注意力权重,实验证明了这四种注意力是互补的,并可以增强卷积核的特征提取能力。一个内核的ODConv可以和具有多个动态内核的动态卷积竞争甚至更优,并且减少了额外的参数。

图a为第二个所说的动态卷积,它只利用了一个维度的权重(卷积核数维度)

图b为ODConv的结构,它并行计算得到四组权重,然后运用到卷积核中,再利用最终得到的卷积核进行提取特征。

a为沿着卷积核的空间(宽高)维度进行乘法运算,b为沿着输入通道维度进行乘法运算,c为沿着输出通道维度进行乘法运算,d为沿着卷积核的维度进行乘法运算,可以定义为

对于给定的n个卷积核,对应的核空间大小为k × k,每个卷积核的输入通道数和输出通道数分别为cin和cout。

四种类型的注意力权重如何得到?同样也是类似SE的思想,首先通过全局平均池(GAP)操作将输入特征x压缩成长度为cin(输入通道)的特征向量。随后,有一个全连接(FC)层和四个头分支。FC层将得到的特征向量映射到具有缩减比率r的低维空间,对于四个头分支,每个头分支具有输出大小为k × k、cin×1、cout×1和n(专家卷积数)×1的FC层,以及分别用于生成归一化注意αsi、αci、αfi和αwi的Softmax或Sigmoid函数。

### 动态卷积DynamicConv)概述 动态卷积是一种改进标准卷积操作的方法,在处理不同输入特征图时能够自适应调整其权重。这种机制允许网络根据不同位置的信息灵活改变感受野大小和形状,从而提高模型表达能力和性能。 #### 工作原理 在传统静态卷积层中,滤波器在整个图像上共享相同的参数;而在动态卷积框架下,则引入额外模块来预测局部区域特定的核权值矩阵。具体来说: - 输入特征映射被划分为多个子窗口; - 对于每一个空间位置 \( p \),通过一个小规模神经网络(通常称为调制器 Modulator 或者控制器 Controller),基于该处上下文信息计算得到一组新的卷积核系数; - 使用这些定制化后的内核执行常规二维交叉关联运算,最终形成输出响应图[^1]。 ```python import torch.nn.functional as F from torch import nn class DynamicConv(nn.Module): def __init__(self, in_channels, out_channels, kernel_size=3, stride=1, padding=1): super(DynamicConv, self).__init__() # 定义用于生成动态卷积核的线性变换 self.controller = nn.Conv2d(in_channels=in_channels, out_channels=out_channels * kernel_size ** 2, kernel_size=kernel_size, groups=in_channels) self.stride = stride self.padding = padding def forward(self, x): batch_size, _, height, width = x.size() # 获取动态卷积核并重塑成适当形式 weights = self.controller(x).view(batch_size, -1, height, width) return F.conv2d(input=x.unsqueeze(1), weight=weights, bias=None, stride=self.stride, padding=self.padding, groups=batch_size)[..., :-1].squeeze(dim=1) ``` 此实现展示了如何构建一个简单的动态卷积层,其中`controller`负责根据输入特征生成相应的位置敏感型卷积核。注意这里简化了一些细节以便理解核心概念。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值