【1×1卷积】Network In Network——“1×1卷积”的作用与使用详解

【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}} XRH×W×Cin

  • 卷积核: W ∈ R 1 × 1 × C i n × C o u t W∈R^{1×1×C_{in}×C_{out}} WR1×1×Cin×Cout

  • 输出特征图: Y ∈ R H × W × C o u t Y∈R^{H×W×C_{out}} YRH×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 等中有重要应用。

  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值