1×1卷积的作用与原理详解
文章目录
- 1×1卷积的作用与原理详解
- 引言
- 1. 什么是1×1卷积?
- 2. 1×1卷积的数学表达
- 3. 1×1卷积的主要作用
- 3.1 改变通道数(升维/降维)
- 3.1.1 降维(Dimension Reduction)
- 3.1.2 升维(Dimension Increase)
- 3.2 特征融合(Feature Fusion)
- 3.3 增加非线性
- 4. 1×1卷积在经典网络中的应用
- 4.1 Network in Network (NiN)
- 4.2 GoogLeNet (Inception)
- 4.3 ResNet的瓶颈结构
- 5. 1×1卷积的优势总结
- 6. 代码实现示例
- 7. 结论
- 参考文献
引言
在深度学习特别是卷积神经网络(CNN)的中,1×1卷积操作看似简单,却有着重要的作用。本文将详细介绍1×1卷积的工作原理及其在深度学习模型中的多种作用,特别是在通道数调整和特征融合方面的应用。
1. 什么是1×1卷积?
1×1卷积,顾名思义,是使用大小为1×1的卷积核进行的卷积操作。与传统的3×3、5×5等卷积核不同,1×1卷积核在空间维度上不进行扩展,仅在通道维度上进行操作。
假设输入特征图的尺寸为 H × W × C i n H \times W \times C_{in} H×W×Cin(高度×宽度×输入通道数),1×1卷积层包含 C o u t C_{out} Cout 个卷积核(也就是说,这个1×1卷积层的尺寸为 1 × 1 × C o u t 1 \times 1 \times C_{out} 1×1×Cout ),则输出特征图的尺寸为 H × W × C o u t H \times W \times C_{out} H×W×Cout。
(敲黑板:希望读者能够真正理解上述公式,从而就能够理解3.1中所述的:1×1卷积为什么能够改变通道数。)
2. 1×1卷积的数学表达
对于输入特征图 X ∈ R H × W × C i n X \in \mathbb{R}^{H \times W \times C_{in}} X∈RH×W×Cin,1×1卷积的数学表达式为:
Y ( i , j , n ) = ∑ c = 1 C i n X ( i , j , c ) ⋅ W ( 1 , 1 , c , n ) + b ( n ) Y(i,j,n) = \sum_{c=1}^{C_{in}} X(i,j,c) \cdot W(1,1,c,n) + b(n) Y(i,j,n)=c=1∑CinX(i,j,c)⋅W(1,1,c,n)+b(n)
其中:
- Y ( i , j , n ) Y(i,j,n) Y(i,j,n) 是输出特征图在位置 ( i , j ) (i,j) (i,j) 处第 n n n 个通道的值
- X ( i , j , c ) X(i,j,c) X(i,j,c) 是输入特征图在位置 ( i , j ) (i,j) (i,j) 处第 c c c 个通道的值
- W ( 1 , 1 , c , n ) W(1,1,c,n) W(1,1,c,n) 是第 n n n 个卷积核在第 c c c 个输入通道上的权重
- b ( n ) b(n) b(n) 是第 n n n 个卷积核的偏置项
3. 1×1卷积的主要作用
3.1 改变通道数(升维/降维)
1×1卷积最直观的作用是改变特征图的通道数,这在网络架构设计中非常有用:
3.1.1 降维(Dimension Reduction)
当 C o u t < C i n C_{out} < C_{in} Cout<Cin 时,1×1卷积起到降维的作用。这可以显著减少参数量和计算量。
例如,假设输入特征图尺寸为 56 × 56 × 256 56 \times 56 \times 256 56×56×256,使用64个1×1卷积核后,输出特征图尺寸变为 56 × 56 × 64 56 \times 56 \times 64 56×56×64,参数量为 256 × 64 + 64 = 16448 256 \times 64 + 64 = 16448 256×64+64=16448(权重+偏置)。
降维操作可以表示为:
Y r e d u c e d = f ( X ⋅ W 1 × 1 + b ) Y_{reduced} = f(X \cdot W_{1 \times 1} + b) Yreduced=f(X⋅W1×1+b)
其中 f f f 是激活函数,通常是ReLU。
3.1.2 升维(Dimension Increase)
当 C o u t > C i n C_{out} > C_{in} Cout>Cin 时,1×1卷积起到升维的作用,可以增加特征的表达能力。
3.2 特征融合(Feature Fusion)
1×1卷积的另一个重要作用是进行特征融合,这实际上是对通道维度的信息进行重组和整合。
从数学角度看,1×1卷积对每个空间位置 ( i , j ) (i,j) (i,j) 执行的操作可以看作是一个全连接层:
Y ( i , j , : ) = W ⋅ X ( i , j , : ) + b Y(i,j,:) = W \cdot X(i,j,:) + b Y(i,j,:)=W⋅X(i,j,:)+b
这里 X ( i , j , : ) X(i,j,:) X(i,j,:) 是位置 ( i , j ) (i,j) (i,j) 处所有通道的向量, W W W 是权重矩阵。
通过这种方式,1×1卷积实现了通道间的信息交互和融合,学习通道间的相关性,从而生成新的、更有表达力的特征表示。
3.3 增加非线性
每个1×1卷积后通常会跟随一个非线性激活函数(如ReLU),这为网络引入了额外的非线性,增强了模型的表达能力:
Y = f ( X ∗ W 1 × 1 + b ) Y = f(X * W_{1 \times 1} + b) Y=f(X∗W1×1+b)
其中 f f f 是非线性激活函数, ∗ * ∗ 表示卷积操作。
4. 1×1卷积在经典网络中的应用
4.1 Network in Network (NiN)
1×1卷积最早在Lin等人提出的Network in Network
架构中被引入。NiN使用1×1卷积来增强局部模型的抽象能力。[1]
4.2 GoogLeNet (Inception)
在GoogLeNet
的Inception
模块中,1×1卷积被用于在3×3和5×5卷积前进行降维,显著减少了计算复杂度。
例如,对于一个 28 × 28 × 256 28 \times 28 \times 256 28×28×256 的输入,直接应用64个5×5卷积核需要计算:
28 × 28 × 5 × 5 × 256 × 64 = 51 , 380 , 224 28 \times 28 \times 5 \times 5 \times 256 \times 64 = 51,380,224 28×28×5×5×256×64=51,380,224 次乘法操作
而先使用32个1×1卷积核降维,再应用64个5×5卷积核:
- 1×1卷积: 28 × 28 × 1 × 1 × 256 × 32 = 6 , 422 , 528 28 \times 28 \times 1 \times 1 \times 256 \times 32 = 6,422,528 28×28×1×1×256×32=6,422,528 次乘法
- 5×5卷积: 28 × 28 × 5 × 5 × 32 × 64 = 6 , 422 , 528 28 \times 28 \times 5 \times 5 \times 32 \times 64 = 6,422,528 28×28×5×5×32×64=6,422,528 次乘法
- 总计: 12 , 845 , 056 12,845,056 12,845,056 次乘法,仅为原来的约1/4
4.3 ResNet的瓶颈结构
在ResNet
的瓶颈(Bottleneck
)结构中,使用了1×1-3×3-1×1的连续卷积组合,其中第一个1×1卷积用于降维,最后一个1×1卷积用于升维,大大减少了模型的参数量和计算量。
5. 1×1卷积的优势总结
- 参数效率:通过降维减少参数量和计算复杂度
- 特征重组:在通道维度上重组特征,增强特征表达
- 增加网络深度:以较小的计算代价增加网络深度和非线性
- 跨通道信息整合:学习通道间的相关性和依赖关系
6. 代码实现示例
以PyTorch为例,1×1卷积的实现实例如下所示:
import torch.nn as nn# 定义一个1×1卷积层,将256通道降维到64通道
conv1x1 = nn.Conv2d(in_channels=256, out_channels=64, kernel_size=1)# 在瓶颈结构中的应用
class Bottleneck(nn.Module):def __init__(self, in_channels, bottleneck_channels, out_channels):super(Bottleneck, self).__init__()self.conv1 = nn.Conv2d(in_channels, bottleneck_channels, kernel_size=1)self.bn1 = nn.BatchNorm2d(bottleneck_channels)self.conv2 = nn.Conv2d(bottleneck_channels, bottleneck_channels, kernel_size=3, padding=1)self.bn2 = nn.BatchNorm2d(bottleneck_channels)self.conv3 = nn.Conv2d(bottleneck_channels, out_channels, kernel_size=1)self.bn3 = nn.BatchNorm2d(out_channels)self.relu = nn.ReLU(inplace=True)def forward(self, x):identity = xout = self.conv1(x)out = self.bn1(out)out = self.relu(out)out = self.conv2(out)out = self.bn2(out)out = self.relu(out)out = self.conv3(out)out = self.bn3(out)out += identityout = self.relu(out)return out
7. 结论
1×1卷积虽然在空间维度上看似简单,但在深度学习模型设计中扮演着至关重要的角色。它不仅能够有效地调整特征图的通道数,还能在通道维度上融合特征,增加网络的非线性,同时保持计算效率。理解和灵活运用1×1卷积,对于设计高效的深度学习模型至关重要。
参考文献
- Lin, M., Chen, Q., & Yan, S. (2013). Network in network. arXiv preprint arXiv:1312.4400. [👉论文PDF链接点击这里👈]
- Szegedy, C., et al. (2015). Going deeper with convolutions. In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. [👉论文PDF链接点击这里👈]
- He, K., Zhang, X., Ren, S., & Sun, J. (2016). Deep residual learning for image recognition. In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. [👉论文PDF链接点击这里👈]
以上是关于1×1卷积作用与原理的详细介绍,相信你已经对1×1卷积在改变通道数和特征融合方面的作用有了一定的理解😊
在实际的深度学习模型设计中,合理利用1×1卷积可以显著提高模型的效率和性能。