当前位置: 首页 > news >正文

深度学习-卷积神经网络CNN-膨胀卷积、可分离卷积(空间可分离、深度可分离)、分组卷积

目录

卷积

1. 膨胀卷积

2. 可分离卷积

2.1 空间可分离卷积

2.2 深度可分离卷积

3. 分组卷积


卷积

1. 膨胀卷积

膨胀卷积也被称为空洞卷积或扩张卷积,是一种通过卷积核的元素之间插入“空洞”来扩展感受野的卷积操作。

膨胀卷积用膨胀率L表示u哦啊扩大内核的范围,即在内核元素间插入L-1个空格个,默认L=1时,内核元素间没有插入空格,即标准卷积

L=2时:

感受野(Receptive Field)

  • 感受野是输出特征图上某个点对应输入图像的区域大小。

  • 膨胀卷积通过增大膨胀率 L,可以显著扩大感受野,而无需增加卷积核尺寸或步长。

  • 标准卷积(L=1, K=3)的感受野为 3×3。

  • 膨胀卷积(L=2, K=3)的感受野为 5×5(相当于 7×7 的覆盖范围,但只有 9 个参数)。

import torch
import torch.nn as nn
​
def test01():conv = nn.Conv2d(in_channels=3,out_channels=128,kernel_size=3,stride=1,dilation=2,padding=1,bias=True)out = conv(torch.randn(1,3,224,224))print(out.shape)
​
if __name__ == '__main__':test01()

2. 可分离卷积

可分离卷积是一种将常规卷积操作进行拆分,以减少计算量和参数量的卷积方式,主要有空间可分离卷积和深度可分离卷积两种类型。

2.1 空间可分离卷积

概念

空间可分离卷积是一种将传统二维卷积分解为两个一维卷积的操作。通过分别对图像的行和列进行卷积,减少计算量和参数量。

原理

  • 标准卷积:直接使用k \times k的二维卷积核。

  • 空间可分离卷积

    1. 先对图像的每一行进行k \times 1的一维卷积(水平方向)。

    2. 再对结果的每一列进行 1 \times k 的一维卷积(垂直方向)。

  • 在数学中我们可以将矩阵分解:

    \left[ \begin{matrix} -1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1 \end{matrix} \right]= \left[ \begin{matrix} 1 \\ 2 \\ 1 \end{matrix} \right]\times \left[ \begin{matrix} -1 & 0 & 1 \end{matrix} \right]

     

  • 计算量对比

    • 标准卷积:k^2 \cdot C_{in} \cdot C_{out}

    • 空间可分离卷积:2 \cdot k \cdot C_{in} \cdot C_{out}

    • 比例:当 k > 2 时,空间可分离卷积的计算量显著降低。

  • 优点

    • 显著减少计算量

    • 适用于特定可分解的卷积核(如 Sobel 核)。

  • 缺点

    • 仅适用于可分解的卷积核,通用性差。

    • 可能丢失图像的空间相关性。

实现

import torch
import torch.nn as nn
​
def test02():inpupt_map = torch.randn(1, 1, 7, 7)conv1 = nn.Conv2d(in_channels=1,out_channels=1,kernel_size=(3,1),stride=1,)conv2 = nn.Conv2d(in_channels=1,out_channels=1,kernel_size=(1,3),stride=1,)out = conv1(inpupt_map)out = conv2(out)print(out.shape)
​
if __name__ == '__main__':test02()


2.2 深度可分离卷积

深度可分离卷积是一种高效的卷积操作,通过将标准卷积分解为两个独立步骤,在保持特征提取能力的同时大幅减少计算量和参数量

深度可分离卷积将标准卷积分解为两个步骤:

  1. 深度卷积(Depthwise Convolution):对每个输入通道独立进行卷积。

  2. 逐点卷积(Pointwise Convolution):使用1 \times 1卷积核融合通道信息。

  1. 原理

  • 深度卷积

    • 输入通道 C_{in},输出通道  C_{in} (单通道处理)。

    • 每个通道使用独立的卷积核。

  • 逐点卷积

    • 使用  1 \times 1卷积核,将  C_{in}  通道的信息整合为 C_{out}通道。

  • 计算量对比

    • 标准卷积: H' \cdot W' \cdot k^2 \cdot C_{in} \cdot C_{out}

    • 深度可分离卷积:H' \cdot W' \cdot k^2 \cdot C_{in} + H' \cdot W' \cdot C_{in} \cdot C_{out}

    • 比例:计算量约为标准卷积的 1/C_{out} + 1/k^2

图1:输入图的每一个通道,我们都使用了对应的卷积核进行卷积。 通道数量 = 卷积核个数,每个卷积核只有一个通道

图2:完成卷积后,对输出内容进行1x1的卷积

import torch
import torch.nn as nn
​
def test02():input_map = torch.randn(1, 8, 7, 7)# 8*1*3*3conv1 = nn.Conv2d(in_channels=8,out_channels=8,kernel_size=3,stride=1,groups=8)# 8*8*1*1con2 = nn.Conv2d(in_channels=8,out_channels=8,kernel_size=1,stride=1,)out = conv1(input_map)out = con2(out)print(out.shape)
​
if __name__ == '__main__':test02()
​


3. 分组卷积

概念分组卷积通过将输入通道分成多个,每组独立进行卷积操作,最后合并结果。常见于 ResNext、SqueezeNet 等模型。

原理

  • 分组策略

    • 输入通道 C_{in}被均分为 G 组。

    • 为每个组分配独立的卷积核(每组卷积核仅处理对应组的输入通道)

    • 每组卷积运算独立进行,最后将各组输出拼接得到最终结果

  • 参数量对比

    • 标准卷积:k^2 \cdot C_{in} \cdot C_{out}

    • 分组卷积:k^2 \cdot (C_{in}/G) \cdot C_{out}

  • 计算量对比

    • 标准卷积:H' \cdot W' \cdot k^2 \cdot C_{in} \cdot C_{out}

    • 分组卷积:H' \cdot W' \cdot k^2 \cdot (C_{in}/G) \cdot C_{out}

实现

import torch
import torch.nn as nn
​
def test01():input_map = torch.randn(1, 128,14,14)# 64*16*3*3conv = nn.Conv2d(in_channels=128,out_channels=64,kernel_size=3,stride=1,groups=8)out = conv(input_map)print(out.shape)for name,param in conv.named_parameters():print(name,param.shape)
​
if __name__ == '__main__':test01()

特点

  • 优点

    • 计算量和参数量减少 G 倍。

    • 适合并行计算(GPU/TPU 多核架构)。

    • 提升模型多样性(如 ResNext 中通过增加组数增强性能)。

  • 缺点

    • 分组后可能限制通道间的信息交互。

    • 需要合理设计组数 G(过大导致性能下降)。

http://www.lryc.cn/news/621359.html

相关文章:

  • 小知识点:splice与slice
  • 5.Ansible-playbook-模块介绍(知识点补充)
  • 【从零开始学习Redis】项目实战-黑马点评D1
  • Rabbitmq+STS+discovery_k8s +localpv部署排坑详解
  • 迅雷链接在线解密解析工具系统源码/本地化API/开源(源码下载)
  • TCP 连接管理:深入分析四次握手与三次挥手
  • NetLimiter:精准掌控网络流量,优化网络体验
  • vue3+leaflet案例:告警系统GIS一张图(附源码下载)
  • 新增和编辑共用弹窗模板
  • 深度解析 Vue 高阶技巧:提升工程化能力的实用方案
  • 机器人伴侣的智能升级:Deepoc具身智能模型如何重塑成人伴侣体验
  • AI驱动的智能爬虫架构与应用
  • C++中的链式操作原理与应用(三):专注于异步操作延的C++开源库 continuable
  • 开发避坑指南(26):Vue3 input输入框前置后 置元素解决方案
  • uniapp开发动态添加密码验证
  • 【力扣322】零钱兑换
  • C++ 排序指南
  • Kafka下载和安装
  • Ubuntu 22.04 远程桌面设置固定密码的方法
  • HQA-Attack: Toward High Quality Black-Box Hard-Label Adversarial Attack on Text
  • CoreShop商城框架开启多租户(3)
  • PyTorch 2025全解析:从基础到前沿,深度学习框架的技术演进与实战指南
  • ESP32入门开发·通用硬件定时器 (GPTimer)
  • C# 高并发处理方式
  • 算法题Day1
  • torchvision中数据集的使用与DataLoader 小土堆pytorch记录
  • # Vue 列表渲染详解
  • VLMs开发——基于Qwen2.5-VL 实现视觉语言模型在目标检测中的层级结构与实现方法
  • RxJava Android 创建操作符实战:从数据源到Observable
  • 中久数创——笔试题