【卷积基础】CNN中一些常见卷积(1*1卷积、膨胀卷积、组卷积、深度可分离卷积)

news2024/11/24 11:25:17

文章目录

  • 逐通道卷积(Pointwise Convolution,1x1 卷积)
    • 主要作用
    • 逐通道卷积的操作过程
    • 优势
    • 代码示例
    • 典型应用
  • 膨胀卷积(Dilated Convolution)
    • 主要作用
    • 工作原理
    • 膨胀率 (dilation rate) 的定义
    • 代码实例
    • 膨胀卷积的优点
  • 组卷积(Group Convolution)
    • 主要作用
    • 工作原理
      • 普通卷积
      • 分组卷积
    • 代码实例
  • 深度可分离卷积(Depthwise Separable Convolution)
    • 主要作用
    • 深度卷积(Depthwise Convolution)
      • 原理
      • 实现方法
    • 1*1卷积
      • 原理
      • 实现方法
    • 代码

参考: CNN 理解神经网络中卷积(大小,通道数,深度)

逐通道卷积(Pointwise Convolution,1x1 卷积)

逐通道卷积(Pointwise Convolution),也称为 1x1 卷积,是一种特殊的卷积操作,其中卷积核的大小为 1x1。

这种卷积操作不会覆盖空间维度(height 和 width),而是只作用于每个位置上的所有通道,这使得逐通道卷积主要用于调整通道数量或整合通道信息

主要作用

  • 降维( dimension reductionality ): 比如,一张500 * 500且厚度depth为100 的图片在20个filter上做1*1的卷积,那么结果的大小为500×500×20。就是改变了输入和输出的通道数,可以减少参数。

  • 增加非线性:卷积层之后经过激励层,1*1的卷积在前一层的学习表示上添加了非线性激励( non-linear activation ),提升网络的表达能力;很明显,增加了非线性,因为相当于又进行了一次运算。

在这里插入图片描述

逐通道卷积的操作过程

逐通道卷积对输入特征图的每个空间位置都使用一个 1x1 的卷积核来进行计算,因此该操作不改变特征图的空间分辨率(height 和 width),而是针对通道进行操作。

例如,假设输入特征图的大小为 [height, width, channels_in],逐通道卷积会:

  • 仅在每个空间位置的通道维度上进行加权求和,输出为 [height, width, channels_out]

  • 通过多个 1x1 卷积核堆叠,实现对所有通道的线性组合,从而调整通道数量。

优势

  • 降维或升维:可以调整通道数,例如从较高的通道数降维为较低的通道数,或从较低的通道数升维为较高的通道数。

  • 减少计算量:在深层网络中,先通过 1x1 卷积减少通道数,再应用较大卷积核,可以降低计算复杂度。

  • 融合通道信息:通过对不同通道进行线性组合,逐通道卷积可以聚合通道之间的信息,从而提取到更丰富的特征。

代码示例

在这个例子中,1x1 卷积调整了通道数,从 64 转换为 128,但空间分辨率(height 和 width)保持不变(即32x32)。

import torch
import torch.nn as nn

# 定义1x1逐通道卷积
conv1x1 = nn.Conv2d(in_channels=64, out_channels=128, kernel_size=1)

# 输入一个大小为 (batch_size, 64, height, width) 的特征图
input_tensor = torch.randn(1, 64, 32, 32)
output_tensor = conv1x1(input_tensor)

print("输出特征图形状:", output_tensor.shape)  # (1, 128, 32, 32)

典型应用

  1. 通道整合:用于将特征进行通道混合,常用于 MobileNet 和 ResNet 等网络结构。

  2. 深度可分离卷积:在深度可分离卷积中,逐通道卷积和深度卷积结合,形成一种高效的特征提取方式,显著减少参数和计算量。

  3. 调整特征图维度:在网络的不同层之间,通过 1x1 卷积来匹配不同层的通道数。

膨胀卷积(Dilated Convolution)

参考:空洞卷积(膨胀卷积)的相关知识以及使用建议(HDC原则)

膨胀卷积(Dilated Convolution),又称为扩张卷积或空洞卷积,是一种特殊的卷积操作,它通过在卷积核的元素之间插入间隔(称为膨胀率或扩张率)来扩大感受野。这样一来,膨胀卷积在不增加参数数量和计算量的前提下可以获取更大的上下文信息。

在nn.conv2d中由dilation参数决定。
在这里插入图片描述

主要作用

  1. 增大感受野

  2. 保持原输入特征图的高度和宽度

工作原理

在标准卷积中,每个卷积核会直接作用于相邻的输入像素。而在膨胀卷积中,通过在卷积核元素之间引入空隙,使得卷积核可以“跳跃”着查看更远的像素,感受野因此被扩大。

例如,假设一个 3x3 的标准卷积核作用在输入特征图上。对于膨胀率为 2 的膨胀卷积,卷积核会在每个元素之间留出 1 个空位,相当于“跳”过一个像素。这种操作使得卷积核感知更大区域的特征,而无需增加参数

在这里插入图片描述

膨胀率 (dilation rate) 的定义

膨胀卷积的核心参数是膨胀率 d,它决定了卷积核的“跳跃”距离:

  • 当 d=1 时,膨胀卷积退化为标准卷积。
  • 当 d=2 时,卷积核的每个元素之间有 1 个空隙,即相隔 2 个像素。
  • 当 d=3 时,卷积核的每个元素之间有 2 个空隙,即相隔 3 个像素。

计算公式:

输出尺寸 = 输入尺寸 − 膨胀卷积核尺寸 步幅 + 1 输出尺寸 = \frac{输入尺寸-膨胀卷积核尺寸}{步幅}+1 输出尺寸=步幅输入尺寸膨胀卷积核尺寸+1

在这里插入图片描述

代码实例

import torch
import torch.nn as nn

# 使用膨胀率为2的3x3卷积核
dilated_conv = nn.Conv2d(in_channels=1, out_channels=1, kernel_size=3, dilation=2)

# 创建一个输入特征图
input_tensor = torch.randn(1, 1, 7, 7)
output_tensor = dilated_conv(input_tensor)
# (1, 1, 3, 3)
print("输出特征图形状:", output_tensor.shape)
  • 膨胀卷积核大小:3+(3-1)*(2-1)=5
  • 输出尺寸:(7-5)/1+1=3

因此输出是 (1, 1, 3, 3)

膨胀卷积的优点

  1. 扩大感受野:无需增加计算量就可以获取更大的感受野。
  2. 减少信息丢失:相比使用较大的步幅或池化层,膨胀卷积不会丢失输入特征图的空间分辨率。
  3. 提高网络性能:在图像分割和目标检测中常用,可以更好地捕捉多尺度的上下文信息。

组卷积(Group Convolution)

参考:卷积 - 3. 分组卷积 详解

组卷积(Group Convolution)是一种将通道分组的卷积方法,主要用于减少计算量,提升模型效率。

在nn.conv2d中由groups参数决定。
在这里插入图片描述

主要作用

通过将输入特征图的通道分成多个独立的组,每个组内进行单独的卷积运算,从而降低计算复杂度

工作原理

普通卷积

在这里插入图片描述
输入特征为 (H × W × C) ,然后应用 C’ 个filters(每个filter的大小为 (h × w × c),输入层被转换为大小为 (H' × W' × C') 的输出特征

分组卷积

在这里插入图片描述

  1. 分组操作:假设输入有 C 个通道,组卷积会将这些通道分成 G 组。每个组包含 C G \frac{C}{G} GC个通道。

  2. 独立卷积:每一组通道都会用各自的卷积核进行卷积。每组的计算是独立的,不会和其他组互相影响。

  3. 输出拼接:对每组通道的卷积操作完成后,组卷积将各组输出拼接在一起,形成最终的输出。

代码实例

import torch
import torch.nn as nn

# 创建一个组卷积层,输入和输出通道数都为64,卷积核大小为3x3,分组数为4
group_conv = nn.Conv2d(in_channels=64, out_channels=64, kernel_size=3, padding=1, groups=4)

# 输入特征图,形状为[批次大小, 通道数, 高度, 宽度]
input_tensor = torch.randn(1, 64, 32, 32)

# 进行组卷积操作
output_tensor = group_conv(input_tensor)
# 输出特征图形状: torch.Size([1, 64, 32, 32])
print("输出特征图形状:", output_tensor.shape)

深度可分离卷积(Depthwise Separable Convolution)

深度可分离卷积(Depthwise Separable Convolution) 是一种将标准卷积操作拆分为两个独立操作的卷积方式,目的是降低计算复杂度和提高效率。

深度可分离卷积将标准卷积操作分解成两个更简单的卷积步骤:

  • 深度卷积(Depthwise Convolution)
  • 逐点卷积(Pointwise Convolution)

在这里插入图片描述

主要作用

通过将传统卷积操作拆分成两步,显著减少了计算量和参数量,是一种高效的卷积方式,特别适合在移动设备等资源有限的环境中应用。

深度卷积(Depthwise Convolution)

传统卷积中,一个卷积核会与输入图像的所有通道进行卷积。

一个大小为64×64像素、3通道彩色图片,经过4个Filters,输出为4张32x32的特征图

在这里插入图片描述

原理

而在深度卷积中,每个输入通道都使用一个单独的卷积核进行卷积。如果输入特征图有 C 个通道,就会用 C 个卷积核来进行卷积,每个卷积核只对单个通道进行卷积操作。

一个大小为64×64像素、3通道彩色图片,3个单通道卷积核分别进行卷积计算,输出3个单通道的特征图。所以,一个3通道的图像经过运算后生成了3个Feature map,如下图所示。

在这里插入图片描述

深度卷积: 输入特征图通道数=卷积核个数=输出特征图个数

实现方法

 # 深度卷积:每个通道使用独立的卷积核
self.depthwise = nn.Conv2d(in_channels, in_channels, kernel_size=kernel_size, padding=padding, groups=in_channels)

可以看到:

  • in_channels和out_channels都是相同的,输入特征图通道数=卷积核个数=输出特征图个数;

  • 卷积的设置参数中groups=in_channels,有几个通道数就分成几个组,即就安排几个卷积进行分通道操作。

1*1卷积

在深度卷积之后,通常会使用一个 1x1 卷积(即逐点卷积),它的作用是将深度卷积的输出进行通道间的混合。

在这里插入图片描述
根据深度卷积可知,输入特征图通道数=卷积核个数=输出特征图个数,这样会导致输出的特征图个数过少(或者说输出特征图的通道数过少,可看成是输出特征图个数为1,通道数为3),从而可能影响信息的有效性。此时,就需要进行逐点卷积。

原理

逐点卷积(Pointwise Convolution,PWConv) 实质上是用1x1的卷积核进行升维。在GoogleNet中大量使用1x1的卷积核,那里主要是用来降维。1x1的卷积核主要作用是对特征图进行升维和降维。

从深度卷积得到的3个单通道特征图,经过4个大小为1x1x3卷积核的卷积计算,输出4个特征图,而输出特征图的个数取决于Filter的个数。

实现方法

# 逐点卷积:1x1卷积对通道进行组合
        self.pointwise = nn.Conv2d(in_channels, out_channels, kernel_size=1)

代码

import torch
import torch.nn as nn

class DepthwiseSeparableConv(nn.Module):
    def __init__(self, in_channels, out_channels, kernel_size=3, padding=1):
        super(DepthwiseSeparableConv, self).__init__()
        
        # 深度卷积:每个通道使用独立的卷积核
        self.depthwise = nn.Conv2d(in_channels, in_channels, kernel_size=kernel_size, padding=padding, groups=in_channels)
        
        # 逐点卷积:1x1卷积对通道进行组合
        self.pointwise = nn.Conv2d(in_channels, out_channels, kernel_size=1)
    
    def forward(self, x):
        x = self.depthwise(x)   # 深度卷积
        x = self.pointwise(x)   # 逐点卷积
        return x

# 创建一个输入张量
input_tensor = torch.randn(1, 64, 32, 32)  # [batch_size, channels, height, width]

# 创建一个深度可分离卷积层,输入通道为64,输出通道为128
model = DepthwiseSeparableConv(64, 128)

# 进行前向传播
output_tensor = model(input_tensor)
print("输出特征图形状:", output_tensor.shape)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2237020.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法【Java】—— 动态规划之路径问题

前言 本文章终点解析第一道题目【不同路径】和最后一道题目【地下城游戏】的动态规划思路,中间几道题目会很快过完,大家如果不熟悉动态规划的思路可以重点看一下这两道题目的解析。 不同路径 https://leetcode.cn/problems/unique-paths 解析&#xf…

Linux - 信号

文章目录 一、信号的定义二、查看信号三、产生信号1、指令2、系统调用3、由软件条件产生信号4、异常5、键盘输入 四、保存信号1、补充:信号其他相关概念2、信号保存在哪,怎么保存?3、信号集操作函数 五、捕获信号1、概念2、捕获信号的时机3、…

group_concat配置影响程序出bug

在 ThinkPHP 5 中,想要临时修改 MySQL 数据库的 group_concat_max_len 参数,可以使用 原生 SQL 执行 来修改该值。你可以通过 Db 类来执行 SQL 语句,从而修改会话(Session)级别的变量。 步骤 设置 group_concat_max_l…

云专线优势有哪些?对接入网络有什么要求?

云专线是一种连接企业本地数据中心与云服务提供商之间的专用网络连接方式,具有以下优势: 高安全性:云专线提供了物理隔离的数据传输通道,减少了数据在公共互联网上传输时可能遭遇的安全风险。 低延迟:由于是直接连接&a…

【提高篇】3.1 GPIO(二,结构与工作模式介绍)

目录 一,GPIO的基本结构 1.1 保护二极管 1.2 上拉、下拉电阻 1.3 施密特触发器 1.4 P-MOS 管和 N-MOS 管 P-MOS管和N-MOS管的区别 1.5 片上外设 1.6 IDR,ODR,BSRR寄存器 1.6.1 IDR(Input Data Register) 1.6.2 ODR(Output Data Register) 1.6.3 BSRR(Bit Se…

数据迁移: 安全高效转移数据, 满足企业业务需求和技术改进

天津鸿萌科贸发展有限公司从事数据安全服务二十余年,致力于为各领域客户提供专业的数据存储、数据恢复、数据备份、数据迁移等解决方案与服务,并针对企业面临的数据安全风险,提供专业的相关数据安全培训。 鸿萌数据迁移业务为众多企业顺利高效…

Am I Isolated:一款安全态势基准测试工具

基于Rust的容器运行时扫描器作为一个容器运行,检测用户容器运行时隔离中的漏洞。 它还提供指导,帮助用户改善运行时环境,以提供更强的隔离保证。 容器的现状是它们并不包含(隔离)。 容器隔离的缺失在云原生环境中有…

战略共赢 软硬兼备|云途半导体与知从科技达成战略合作

2024年11月5日,江苏云途半导体有限公司(以下简称“云途”或“云途半导体”)与上海知从科技有限公司(以下简称“知从科技”)达成战略合作,共同推动智能汽车领域高端汽车电子应用的开发。 云途半导体与知从科…

基于卷积神经网络的农作物病虫害识别系统(pytorch框架,python源码)

更多图像分类、图像识别、目标检测等项目可从主页查看 功能演示: 基于卷积神经网络的农作物病虫害检测(pytorch框架)_哔哩哔哩_bilibili (一)简介 基于卷积神经网络的农作物病虫害识别系统是在pytorch框架下实现的…

2-149 基于matlab的LDPC译码性能分析

基于matlab的LDPC译码性能分析,LDPC(Low-Density Parity-Check)码作为编码技术,具有优秀的纠错性能和较低的编解码复杂度。为保证可靠的数据传输,对传输过程中可能出现的信道噪声、干扰等进行模拟和分析。分析对比了误…

算法每日双题精讲——双指针(快乐数,盛最多水的容器)

🌟快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。 🌟 别再犹豫了!快来订阅我们的算法每日双题精讲专栏,一起踏上算法学习的精彩之旅吧!💪…

在Scrapy爬虫中应用Crawlera进行反爬虫策略

在互联网时代,数据成为了企业竞争的关键资源。然而,许多网站为了保护自身数据,会采取各种反爬虫技术来阻止爬虫的访问。Scrapy作为一个强大的爬虫框架,虽然能够高效地抓取网页数据,但在面对复杂的反爬虫机制时&#xf…

Linux(CentOS)安装 JDK

CentOS版本:CentOS 7 JDK版本:JDK17 1、下载 JDK 官网:https://www.oracle.com/ 2、上传 JDK 文件到 CentOS 使用FinalShell远程登录工具,并且使用 root 用户连接登录(注意这里说的root用户连接登录是指这样的&…

redis和数据库的数据一致性

在我们使用redis作为缓存的时候,数据库和缓存数据保持一致性就显得尤为重要,因为如果不做处理的话很有可能读取到的数据会出现差错,那这里怎么进行解决呢? 首先我们先来看一下操作数据到底是直接删除数据还是说通过修改的方式来修…

发布 VectorTraits v3.0(支持 X86架构的Avx512系列指令集,支持 Wasm架构及PackedSimd指令集等)

文章目录 支持 X86架构的Avx512系列指令集支持Avx512时的输出信息 支持 Wasm架构及PackedSimd指令集支持PackedSimd时的输出信息VectorTraits.Benchmarks.Wasm 使用说明 新增了向量方法支持 .NET 8.0 新增的向量方法提供交织与解交织的向量方法YGroup3Unzip的范例代码 提供重新…

工业相机常用功能之白平衡及C++代码分享

目录 1、白平衡的概念解析 2、相机白平衡参数及操作 2.1 相机白平衡参数 2.2 自动白平衡操作 2.3 手动白平衡操作流程 3、C++ 代码从XML读取参数及设置相机参数 3.1 读取XML 3.2 C++代码,从XML读取参数 3.3 给相机设置参数 1、白平衡的概念解析 白平衡(White Balance)…

推荐一款SSD硬盘优化器:Auslogics SSD Optimizer Pro

SSD Optimizer Pro 是一款专为优化固态硬盘 (SSD) 性能而设计的专业工具,旨在最大化 SSD 的效率,延长硬盘使用寿命。凭借简便的操作界面和强大的优化功能,SSD Optimizer Pro 可以让用户充分利用 SSD 的优势,从而获得更高的系统性能…

常用机器人算法原理介绍

一、引言 随着科技的不断发展,机器人技术在各个领域得到了广泛应用。机器人算法是机器人实现各种功能的核心,它决定了机器人的行为和性能。本文将介绍几种常用的机器人算法原理,包括路径规划算法、定位算法和运动控制算法。 二、路径规划算法…

基于开源 AI 智能名片 S2B2C 商城小程序的视频号交易小程序优化研究

摘要:本文探讨了完善适配视频号交易小程序的重要意义,重点阐述了开源 AI 智能名片 S2B2C 商城小程序在这一过程中的应用。通过分析其与直播间和社群的无缝衔接特点,以及满足新流量结构下基础设施需求的能力,为门店在视频号直播交易…

【OH】openHarmony开发环境搭建(基于windows子系统WSL)

前言 本文主要介绍基于windows子系统WSL搭建openHarmony开发环境。 WSL与Vmware虚拟机的区别,可以查看WSL与虚拟机的区别 更详细的安装配置过程可参考微软官网: ​安装 WSL 前提 以下基于windows 111专业版进行配置,windows 10应该也是可以…