稀疏卷积 Sparse Convolution Net

2023-05-16

概述

这是一篇对稀疏卷积讲述非常全面的文章,理解起来毫不费事。这里要和SPConv相区别,这是两个完全不同的东西。SPConv是为了解决普通3 * 3卷积算子参数冗余而设计的,一种“即插即用”计算单元,可以随时随地替换普通3 * 3卷积算子,可以用来提高模型推理速度吧。跟剪枝算法差不多。
在这里插入图片描述
下面要讲述的是稀疏卷积Sparse Convolution Net,转载自https://zhuanlan.zhihu.com/p/383299678,写的十分详细。通俗易懂,方便读者理解。

简介

​ 稀疏卷积常用于3D项目(如3D点云分割)中,由于点云数据是稀疏的,无法使用标准的卷积操作。同理,2D任务中,如果只处理其中一部分像素,也需要使用稀疏卷积,这样有助于模型加速。
在这里插入图片描述

原理解析

​ 本质上就是通过建立哈希表,保存特定位置的计算结果。下文将通过举例说明稀疏卷积的原理。

输入数据

​ 如下图所示,有一个3通道的 5x5 图像。除了两个点 P1 和 P2 之外,所有像素都是(0, 0, 0)。 根据 [1],P1 和 P2,此类非零元素(即P1、P2)也称为activate input sites。输入张量的形状按NCHW 顺序为[1x3x5x5]。在稀疏形式下,[P1,P2]数据列表为 [[0.1, 0.1, 0.1], [0.2, 0.2, 0.2]] ,索引列表为 [[1,2], [2, 3]] 。
在这里插入图片描述

卷积核

​ 稀疏卷积的卷积核和传统卷积一样。下图是一个示例,其内核大小为 3x3。 深色和浅色分别代表 2 个卷积核。
在这里插入图片描述

输出定义

​ 稀疏卷积的输出与传统卷积有很大不同。 稀疏卷积有两种输出定义[1]。 一种是regular output definition,就像普通卷积一样,只要核覆盖一个输入点就计算输出点。 另一种称为submanifold output definition。 只有当核中心覆盖输入站点时,才会计算卷积输出。
在这里插入图片描述
如上图所示, [公式] 输入图像, [公式] 卷积核,stride=1,padding=0,输出张量的尺寸为 [公式] 。第一行就是regular output definition,例如 (0,0)位置为A1,表示该位置的结果只与输入图像中的P1有关, (0,1) 位置为A1A2,表示该位置结果与P1、P2都有关。第二行是submanifold output definition,只有A1和A2有响应。不同的颜色要表示输出的不同通道。

计算实现

​ 传统的卷积操作是通过 img2col 实现的,稀疏卷积[1]则通过Rulebook来实现计算。

建立哈希表

​ 第一步,建立输入、输出张量的序号-坐标哈希表,以regular output definition输出为例。
在这里插入图片描述
在这里插入图片描述
​ 总结一下,这里哈希表的用处就是将张量坐标与序号一一对应,方便之后卷积计算好了值,将值放到张量的对应的位置。

建立RuleBook

​ 第二步,建立Rulebook。

​ 什么是Rulebook? 本质上来说就是一个表。第一步我们建立输入、输出的哈希表,分别将输入、输出的张量坐标映射到序号。现在我们要将输入、输出的哈希表中的序号建立起联系,这样就可以基本实现了稀疏卷积,因此这也是稀疏卷积实现的关键。

在这里插入图片描述
由上图可以Rulebook主要是实现输入序号到输出序号的映射。下图展示了如何构建Rulebook。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
​ 上面我们讲完了原理,那么每次都按上面原理推岂不是很麻烦,这里呢,我们推导了上面GetOffset()的公式。需要注意的是上面公式是在stride=1,padding=0的情况下的。

一句话来说,GetOffset()就是用于找出output中某位置需要用卷积核中的哪个weight来计算。

  1. 从GetOffset()到Rulebook
    ​ 既然要完成卷积,上一步记录了卷积核权重的位置,那么这一步就需要记录对应的输入像素值,然后计算完了放哪里。如下图,我们可以看到Rulebook中红色方框为上一步记录的卷积核权重位置,橙色方框为输入像素值的输入序号,绿色方框为卷积结果对应的输出序号。
    在这里插入图片描述

稀疏卷积的GPU实现

​ 稀疏卷积实现时是通过查询Rulebook,因为可以通过GPU并行实现,因此效率比较高。
在这里插入图片描述
在这里插入图片描述

总结

以上就是Sparse Convolution Net的实现原理,主要就是通过数据结构——表来实现。在实际使用时通常不需要大家自己重新写一个卷积的底层操作,目前Facebook已经有开源的稀疏卷积库,关于稀疏卷积的使用见一篇文档。
https://link.zhihu.com/?target=https%3A//github.com/facebookresearch/SparseConvNet

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

稀疏卷积 Sparse Convolution Net 的相关文章

随机推荐

  • python数据分析-柱状图绘制及常用参数设置

    linux 43 pycharm 43 anaconda span class token comment 柱形图绘制与参数设置 span span class token comment plt bar x height width bo
  • 爬取西窗烛app

    本文旨在学习 xff0c 不可做商业用途 span class token keyword import span csv span class token keyword import span json span class token
  • 爬取百度地图店家信息

    本文旨在交流学习 xff0c 勿作他用 xff0c 否则后果自负 span class token keyword import span json span class token keyword import span csv span
  • 爬取蝉妈妈数据平台商品数据

    本文旨在交流学习 xff0c 勿作他用 xff0c 否则后果自负 环境 linux 43 pycharm 43 anaconda span class token keyword import span json span class to
  • selenium+webdriver+chrome实现百度以图搜图

    1 环境搭建 1 webdriver 43 chrome的版本需匹配 2 打开chrome 输入 chrome version 来查看chrome版本 访问此网站 谷歌浏览器驱动 然后选择合适版本webdriver 2 收集原始图片和构建图
  • 无聊之重学c/c++

    span class token macro property span class token directive hash span span class token directive keyword include span spa
  • Python配置Pip国内源

    临时指定下载源 以阿里云的镜像为例 pip install trusted host https mirrors aliyun com i https mirrors aliyun com pypi simple lt some packa
  • 爬虫效率提升方法

    协程 xff1a 在函数 特殊函数 定义的时候 使用async修饰 函数调用后 内部语句不会立即执行 而是会返回一个协程对象 任务对象 xff1a 任务对象 61 高级的协程对象 进一步封装 61 特殊的函数 xff0c 任务对象必须要注册
  • selenium JD爬虫

    python3 7 43 win10 span class token comment coding utf 8 span span class token comment 64 Time 2022 6 27 16 55 span span
  • 树莓派4b学习笔记三:三行命令极简安装vscode

    很多写代码的软件在树莓派上都不能用 xff0c 或者安装比较麻烦 恰巧 xff0c vscode作为一款轻量级代码编辑器 xff0c 可以在树莓上使用 xff0c 而且它通过简单的安装插件就可以支持很多种编程语言 我在网上搜了很多关于在树莓
  • you-get详细配置教程

    一 you get介绍 you get是一款能够直接从网页上下载视频 音乐 图片的命令行多媒体下载器 xff0c 它支持80多个网站 xff0c 包括某酷 某奇艺 某讯 Bzhan YouTube等 xff0c 具体说明及支持网站可点击下方
  • hyper-v虚拟机上的ubuntu 18.04 LTS通过xrdp传递声音遇到的一些坑

    背景 xff1a Windows10 pro上hyper v自带的ubuntu 18 04 LTS 在使用虚拟机时发现没有声音 xff0c 通过这篇博客Linux xrdp远程桌面连接声音重定向来到 pulseaudio module xr
  • 深入理解卡尔曼滤波算法

    最近做卡尔曼滤波跟踪的项目 xff0c 看原理花了一天 xff0c 再网上查找并看懂别人的kalman c 43 43 代码花了我近三天的时间 卡尔曼滤波就是纸老虎 xff0c 核心原理不难 xff0c 核心公式就5个 xff0c 2个状态
  • no module named ‘apex‘ 的解决方案

    背景 xff1a 部署fast reid工程环境的时候报出ModuleNotFoundError No module named 39 apex 的错误 纯粹记录一下 no module named apex 的解决方案 xff1a 1 官
  • C++ 中字符串查找、字符串截取、字符串替换

    1 字符串查找 s span class token punctuation span span class token function find span span class token punctuation span s1 spa
  • Jetson AGX Xavier 刷机指南

    目录 一 刷机准备 二 JetPack4 5刷机过程 三 安装Cudnn 四 开启高性能模式 五 打开风扇 六 上电自启 七 设置开机自启动 一 刷机准备 在刷机之前 xff0c 需要准备一台装有Ubuntu系统的宿主电脑 将 Xavier
  • Shp2osm:shp转换为osm格式文件

    概述 背景 因为opendrive是自动驾驶使用的较多的数据格式 xff0c 想把地图数据shp格式转换成opendrive格式的 xff0c 但是网上没有现成的转换脚本 xff0c 所以打算先从shp格式转到osm格式 xff0c 再从o
  • Linux笔记之Docker安装,基于Debian 11(bullseye)

    前置条件 Debian平台版本为 Debian 11 xff08 bullseye xff09 安装的是Docker Community Edition xff08 docker ce xff09 安装步骤 1 重新安装卸载旧版 xff0c
  • 3D点云目标检测算法综述

    一 概述 在3D点云目标检测领域 xff0c 对于数据输入的处理一般有三种 xff1a 多视角 将三维点云投射到多个二维平面形成图像 体素 xff0c voxel xff0c 将三维点云切割成多个小块 xff0c 这些小块就叫体素 xff0
  • 稀疏卷积 Sparse Convolution Net

    概述 这是一篇对稀疏卷积讲述非常全面的文章 xff0c 理解起来毫不费事 这里要和SPConv相区别 xff0c 这是两个完全不同的东西 SPConv是为了解决普通3 3卷积算子参数冗余而设计的 xff0c 一种 即插即用 计算单元 xff