【1×1卷积】Network In Network——“1×1卷积”的作用与使用详解
【1×1卷积】Network In Network——“1×1卷积”的作用与使用详解
论文地址:https://arxiv.org/pdf/1312.4400
1×1 卷积的详细介绍
1×1 卷积(也称为 pointwise 卷积)是深度学习中特别常见的操作,它的卷积核大小为 1×1,即每次卷积操作仅涉及输入特征图中的单个像素。尽管它看起来很简单,但在实际中发挥了多种关键作用。
1×1卷积的核心概念
- 1×1 卷积是一个特例的卷积操作,它主要作用在输入特征图的通道维度上,而不是空间维度上(即不跨多个像素滑动)。每个 1×1 的卷积核仅在输入特征图的单个位置作用,但可以处理所有的通道,从而完成通道混合或变换。
1×1 卷积的计算方式
- 假设输入是大小为 H × W × C i n H×W×C_{in} H×W×Cin的特征图,其中 H H H和 W W W是空间维度的高度和宽度, C i n C_{in} Cin是输入的通道数。1×1 卷积核的大小为 1×1,但它在每个位置上会作用于所有的 C i n C_{in} Cin通道,并输出 C o u t C_{out} Cout通道结果。
公式表示:
-
输入特征图: X ∈ R H × W × C i n X∈R^{H×W×C_{in}} X∈RH×W×Cin
-
卷积核: W ∈ R 1 × 1 × C i n × C o u t W∈R^{1×1×C_{in}×C_{out}} W∈R1×1×Cin×Cout
-
输出特征图: Y ∈ R H × W × C o u t Y∈R^{H×W×C_{out}} Y∈RH×W×Cout
对于每个位置 ( h , w ) (h,w) (h,w),输出的通道数由 C i n C_{in} Cin个通道的线性组合给出。
1×1 卷积的作用
-
通道压缩与扩展:1×1 卷积常用于调整输入特征图的通道数量。例如,当输入特征图的通道数较多时,使用 1×1 卷积可以减少通道数,从而减少计算量。这种方法常用于网络瓶颈层。
-
增加非线性表达能力:1×1 卷积可以配合 ReLU 等非线性激活函数来增加模型的非线性表达能力。虽然 1×1 卷积本身是线性的,但与激活函数结合后,能够增强模型对特征的学习能力。
-
特征融合:通过对通道维度进行操作,1×1 卷积可以将不同通道的特征信息进行融合。由于每个 1×1 卷积核可以访问所有输入通道,它能在不改变空间分辨率的情况下学习不同特征之间的相关性。
-
用于深度可分离卷积:在深度可分离卷积(depthwise separable convolution)中,1×1 卷积作为“pointwise”卷积,负责将每个通道的独立信息组合起来。它被广泛应用于轻量级网络,如 MobileNet 和Xception。
-
用于残差网络中的瓶颈层:在 ResNet 的 Bottleneck 结构中,1×1 卷积被用来减少和恢复通道维度,从而减少计算量,并确保网络的效率和性能。
1×1 卷积的优点
-
减少计算量:通过减少特征图的通道数,降低模型的计算成本。
-
无空间信息丢失:1×1 卷积仅在通道维度上进行操作,不改变输入特征图的空间分辨率。
-
增加模型表达能力:与激活函数配合使用,增强模型的非线性建模能力。
-
灵活性:1×1 卷积的作用灵活,可以根据需要进行通道压缩、扩展或特征融合。
1×1 卷积的代码实现
- 我们可以通过 TensorFlow 或 PyTorch 等深度学习框架来实现 1×1 卷积。以下是 TensorFlow 和 PyTorch 的示例代码。
TensorFlow实现
import tensorflow as tf
from tensorflow.keras import layers
# 创建 1×1 卷积层,输入通道数为 64,输出通道数为 128
input_tensor = tf.random.normal([1, 32, 32, 64]) # 输入形状为 (batch_size, height, width, channels)
conv_1x1 = layers.Conv2D(128, kernel_size=1, strides=1, padding='same') # 1×1 卷积层
output_tensor = conv_1x1(input_tensor)
print(output_tensor.shape) # 输出形状为 (1, 32, 32, 128)
PyTorch 实现
import torch
import torch.nn as nn
# 创建 1×1 卷积层,输入通道数为 64,输出通道数为 128
input_tensor = torch.randn(1, 64, 32, 32) # 输入形状为 (batch_size, channels, height, width)
conv_1x1 = nn.Conv2d(in_channels=64, out_channels=128, kernel_size=1, stride=1, padding=0) # 1×1 卷积层
output_tensor = conv_1x1(input_tensor)
print(output_tensor.shape) # 输出形状为 (1, 128, 32, 32)
1×1 卷积的应用场景
-
GoogleNet (Inception 网络):在 Inception 模块中,1×1 卷积被广泛应用于通道压缩,减少计算开销。它们被用来在不改变特征图空间尺寸的情况下减少通道数,起到降维的作用。
-
ResNet:ResNet 使用 1×1 卷积来实现 Bottleneck 结构中的降维和升维操作。通过 1×1 卷积,它能够减少通道数,节省计算量,再通过 1×1 卷积恢复通道数,保持信息流畅性。
-
深度可分离卷积(MobileNet等轻量级网络):在 MobileNet 和 Xception 等轻量级网络中,1×1 卷积被用于深度可分离卷积中的 pointwise 卷积,用来将通道信息组合起来,从而减少参数量并提高效率。
总结
-
1×1 卷积通过仅作用于通道维度来调整特征图的通道数、融合通道特征,从而减少计算量并增强模型的特征表达能力。
-
它在深度神经网络的多个场景中扮演重要角色,包括降维、通道融合、模型压缩等。
-
1×1 卷积的应用灵活且广泛,尤其是在现代网络如 GoogleNet、ResNet、MobileNet 等中有重要应用。