1x1卷积详解:概念、优势和应用

简介: 1x1卷积详解:概念、优势和应用

Lin等人的《网络中的网络(Network in Network, NiN)》一文,提出了一种特殊的卷积操作,它允许跨通道参数级联,通过汇聚跨通道信息来学习复杂的交互。他们将其称为“交叉通道参数池化层”(cross channel parametric pooling layer),并将其他操作与1x1卷积核进行卷积的操作相比较。

当时浏览一下细节,我从没想过我使用这样的操作,更不用说对其细节有任何的想法。但是通常是术语看起来很深奥,而概念本身并不是。在我了解背景和进行了一系列的测试以后,让我们一起来解开这个奇特但多用途的1x1卷积层的神秘面纱。

640.gif

1 x1卷积

顾名思义,1x1卷积操作涉及到将输入与尺寸为1x1的过滤器进行卷积,通常使用0填充和步长为1。

举个例子,假设我们有一个(通用的)卷积层,输出一个形状张量(B, K, H, W),

B为批大小。K是卷积过滤器或核的数量,H、W为空间维度,即高、宽。

此外,我们指定了一个想要处理的过滤器大小,对于一个正方形过滤器可以使用单个数字,即size=3意味着一个3x3的过滤器。

deephub译者注:一般情况下,过滤器(filter)又可称为卷积核(kernel)。如果严谨的讲,卷积核就是由长和宽来指定的,是一个二维的概念,而过滤器是由长、宽和深度指定的,是一个三维的概念。过滤器可以看做是卷积核的集合,一般情况下可以通用,但是这里为了说明我们使用过滤器作为其统称,下面不做区分

将这个张量输入到带有F过滤器(零填充和跨度1)的1x1卷积层中,我们将获得形状(B,F,H,W)的输出,将过滤器尺寸从K更改为F。

现在,根据F是小于还是大于K,我们减小或增大了过滤器空间中输入的维数,而未进行任何空间变换(H,W不变)。所有这些就是使用1x1卷积运算!

但是,这与常规卷积操作有何不同?在常规的卷积运算中,我们通常会使用较大的过滤器大小,例如3x3或5x5(甚至7x7)内核,然后通常对输入进行某种填充,进而将H x W的空间尺寸转换为某些 H'x W'。

好处

在cnn中,我们经常使用某种池化操作来对卷积输出的激活映射进行空间下采样,以避免由于生成的激活图的数量增加使反向传播变得难以处理。这种问题是与CNN的深度成正比的。也就是说,一个网络越深,它产生的激活地图的数量就越大。如果卷积运算使用的是大型滤波器,如5x5或7x7滤波器,问题会进一步恶化(因为参数变多)。

空间下采样(通过池化)是通过在每一步减少输入的高度和宽度,沿空间维度聚合信息来实现的。虽然它在一定程度上保留了重要的空间特征,但在降采样和信息丢失之间确实存在权衡。底线是:我们只能在一定程度上使用。

1x1卷积可通过提供按过滤器的池化功能来解决此问题,它充当投影层,可跨通道池化(或投影)信息,并通过减少过滤器数量同时保留重要的,与功能相关的信息来降低尺寸。

这在谷歌的inception中被大量使用,他们说明如下:

以上模块的一个大问题(至少在这种简单的形式中是这样的)是,即使是少量的5x5卷积,在带有大量过滤器的卷积层之上也会变得非常昂贵。

这导致了提出这个体系结构的第二个想法:在计算需求会增加太多的地方进行尺寸缩减和投影。这种嵌入是成功的,即使是低维的嵌入也可能包含许多有关较大图像补丁的信息。除了用作减少计算量之外,它们还包括使用RELU激活,使其具有双重用途。

谷歌介绍了在昂贵的3x3和5x5卷积之前使用1x1卷积来减少计算量的方法。代替使用池化来降低空间维数,可以使用1x1卷积在滤波器维上进行降维。

Yann LeCun提供了一个有趣的思路,他将CNN中的完全连接层模拟为具有1x1卷积内核和完整连接表的简单卷积层。

实现

在讨论了这个概念之后,现在来看看一些实现,通过一些基本的PyTorch代码,很容易理解这些实现。

classOurConvNet(nn.Module):
def__init__(self):
super().__init__()
self.projection=None#Inputdimsexpected: HxWxC=36x36x3self.conv1=nn.Conv2d(in_channels=3, out_channels=32, kernel_size=3, stride=1, padding=1)
#Outputdims: HxWxC=36x36x32#softconvisthe1x1convolution: Filterdimensionsgofrom32->1impliesOutputdims: HxWxC=36x36x1self.softconv=nn.Conv2d(in_channels=32, out_channels=1, kernel_size=1, stride=1, padding=0)
defforward(self, input_data):
#Applyconvolutionx=self.conv1(input_data)
#Applytanhactivationx=torch.tanh(x)
#Applythe1x1convolutionx=self.softconv(x)
#Applysigmoidactivationx=torch.sigmoid(x)
#Savetheresultinprojectionself.projection=x

这里,我用softconv来表示1x1卷积。这是最近一个项目的代码片段,其中使用1x1卷积将信息投射到过滤器维度(本例中为32),并将其汇集到单个维度中。这给我的用例带来了三个好处:

  1. 将来自32个二维激活图(通过在输入上对前卷积层的滤镜进行卷积生成)中的信息投影到单个激活图(请记住,softconv层的输出的滤镜为dim = 1)。为什么需要这样的投影,下面的图片对此进行了说明。。
  2. 使用1x1卷积来减少维度,允许保持计算需求的检查。这是基于低维嵌入的理解,因为它在自然语言处理领域工作得很好。
  3. 提供了更好的可处理性,易于可视化的过滤器权重,将被学习,即能够回答什么层实际做了给定的输入和理解什么模型是学习。

此外,tanh和Sigmoid激活是实现细节,对于本例可以忽略。

为了深入了解可能使用1x1卷积的想法,我提供了一个在DEAP情感数据集上训练的模型中的用例,本例只为说明没有涉及很多细节。该模型经过训练可以预测来自面部视频(图像)的心率信号。在这里,使用1x1卷积层将来自32个滤镜(从先前的卷积中获得)的信息汇总到单个通道中,使模型可以创建一个蒙版,从而能够区分皮肤像素和非皮肤像素。虽然这个工作目前并不完善,但希望可以在这里看到使用1x1卷积的意义。

640.png

用作输入的面部图像。图像来自DEAP数据集

640.png

应用常规卷积层后32个滤波器的状态。

640.png

从softconv层获得的输出,其中32个过滤器被汇集到一个单一通道。

关键总结

1x1卷积可以看作是一个操作,在输入上应用一个1x1 x K大小的滤波器,然后加权生成F激活映射。

F > K会导致滤波器尺寸的增加,而F < K则会导致滤波器尺寸的减少。F的值很大程度上取决于项目的要求。降低维数可能有助于使事情更容易处理,并且可能有一个类似的用例,使用1x1卷积来增加滤波器的数量。

理论上使用这个操作,神经网络可以使用1x1卷积“选择”哪个输入“过滤器”来查看,而不是强制相乘。

目录
相关文章
|
机器学习/深度学习 人工智能 数据可视化
ShuffleNet:极致轻量化卷积神经网络(分组卷积+通道重排)
我们引入了一个高效计算的CNN结构名字叫做shuffleNet,这个结构被设计用来解决部署算力非常有限的移动设备问题,这个新的结构使用了两个新的操作,pointwise group convolution 和 channel shuffle能够在极大减少计算量的同时保持一定的精度。我们在ImageNet classification和MS COCO目标检测数据集上做实验论证了ShuffleNet和其他的结构相比有着很好的性能。比如,相比于mobilenet,shufflenet在ImageNet 分类任务上有着更低的top-1错误率(错误率是7.8%)需要的计算量为40MFLOPs。在一个AR
1932 0
ShuffleNet:极致轻量化卷积神经网络(分组卷积+通道重排)
|
26天前
|
机器学习/深度学习 编解码 Java
RT-DETR改进策略【卷积层】| GnConv:一种通过门控卷积和递归设计来实现高效、可扩展、平移等变的高阶空间交互操作
RT-DETR改进策略【卷积层】| GnConv:一种通过门控卷积和递归设计来实现高效、可扩展、平移等变的高阶空间交互操作
65 13
RT-DETR改进策略【卷积层】| GnConv:一种通过门控卷积和递归设计来实现高效、可扩展、平移等变的高阶空间交互操作
|
25天前
|
机器学习/深度学习 编解码 人工智能
《深度解析:自注意力卷积神经网络的原理与卓越优势》
自注意力卷积神经网络融合了自注意力机制和卷积神经网络的优势,通过在特征图上动态分配注意力权重,捕捉长距离依赖关系。它不仅提升了局部特征提取能力,还能更好地理解全局结构与语义信息,在图像识别、自然语言处理等任务中表现出色。此外,该模型计算效率高、灵活性强、适应性广,并且易于扩展与其他技术结合,具有广泛的应用前景。
|
26天前
|
机器学习/深度学习 人工智能 算法
《探秘卷积神经网络的核心—卷积核》
卷积神经网络(CNN)在图像和语音识别等领域取得显著成就,卷积核作为其核心组件发挥关键作用。卷积核是滑动于输入数据上的小矩阵,通过卷积操作提取特征,参数共享机制减少模型复杂度并提高鲁棒性。不同类型的卷积核(如标准、深度可分离和扩张卷积核)适用于多种任务,为CNN的成功奠定基础。
|
1月前
|
机器学习/深度学习 编解码 Java
YOLOv11改进策略【卷积层】| GnConv:一种通过门控卷积和递归设计来实现高效、可扩展、平移等变的高阶空间交互操作
YOLOv11改进策略【卷积层】| GnConv:一种通过门控卷积和递归设计来实现高效、可扩展、平移等变的高阶空间交互操作
22 0
YOLOv11改进策略【卷积层】| GnConv:一种通过门控卷积和递归设计来实现高效、可扩展、平移等变的高阶空间交互操作
|
5月前
|
机器学习/深度学习
深度学习笔记(十二):普通卷积、深度可分离卷积、空间可分离卷积代码
本文探讨了深度可分离卷积和空间可分离卷积,通过代码示例展示了它们在降低计算复杂性和提高效率方面的优势。
593 2
深度学习笔记(十二):普通卷积、深度可分离卷积、空间可分离卷积代码
|
10月前
|
机器学习/深度学习 算法 计算机视觉
YOLOv8 | 卷积模块 | 提高网络的灵活性和表征能力的动态卷积【附代码+小白可上手】
本教程介绍了如何在YOLOv8中使用动态卷积提升网络性能和灵活性。动态卷积利用注意力机制动态选择和组合卷积核,适应输入数据特征,解决了轻量级CNN的局限。文中提供了详细步骤教读者如何添加和修改代码,包括在`conv.py`中添加`Dynamic_conv2d`模块,更新`init.py`、`task.py`和`yaml`配置文件。此外,还分享了完整代码和进阶技巧,帮助深度学习初学者实践目标检测。参考[YOLOv8改进](https://blog.csdn.net/m0_67647321/category_12548649.html)专栏获取更多详情。
|
10月前
|
存储 缓存 Java
|
机器学习/深度学习 编解码 数据可视化
深度学习基础入门篇9.1:卷积之标准卷积:卷积核/特征图/卷积计算、填充、感受视野、多通道输入输出、卷积优势和应用案例讲解
深度学习基础入门篇9.1:卷积之标准卷积:卷积核/特征图/卷积计算、填充、感受视野、多通道输入输出、卷积优势和应用案例讲解
深度学习基础入门篇9.1:卷积之标准卷积:卷积核/特征图/卷积计算、填充、感受视野、多通道输入输出、卷积优势和应用案例讲解
|
机器学习/深度学习 存储 编解码
深度学习基础入门篇[9.3]:卷积算子:空洞卷积、分组卷积、可分离卷积、可变性卷积等详细讲解以及应用场景和应用实例剖析
深度学习基础入门篇[9.3]:卷积算子:空洞卷积、分组卷积、可分离卷积、可变性卷积等详细讲解以及应用场景和应用实例剖析
230 0