分组卷积的思想神了

大家好啊,我是董董灿。

最近,分组卷积帮我解决了一个大忙,事情是这样的。

这几天遇到一个头疼的问题,就是要在某一芯片上完成一个神经网络的适配,这个神经网络中卷积居多,并且有一些卷积的通道数很大,比如2048个输入通道。

问题是,该芯片是专用芯片,所对应的硬件模块无法直接支持这种通道数很大的卷积运算。

于是开始了头脑风暴,因为芯片中有良好的向量指令集来支持内积运算,因此第一反应便是拿内积运算来拼凑出卷积。

但实验结果表明,利用内积指令来拼凑的卷积效果不如人意,主要在于内积指令调用次数过多,导致神经网络的整体性能太差。

就在一筹莫展时,一个声音传过来,“我们改图吧”。

改图,指的是改神经网络的结构,很多推理框架都具备这个能力,比如pytorch,tvm等。

这些推理框架可以针对性的适配某些专用AI芯片加速器,为此魔改一些神经网络结构,通过增加一些优化节点(pass),来使原本不支持的运算变为可支持的运算。

比如这个卷积的例子,可以将一个大卷积(指的是通道数很大),魔改为两个或多个小卷积,分别计算,计算完成后再将结果合并。

这就要提一下将卷积在通道维度分成多个卷积计算的操作——分组卷积(Group Convolution)了。

1、 什么是分组卷积

网上有很多关于分组卷积的资料。说的简单点,分组卷积是将卷积在channel 维度分组来计算,以达到将一个大卷积分成多个小卷积的目的。

为了清晰,我们将卷积操作简化为一次最简单的乘累加运算,channel维度只有2个数据,如下图。

图片

正常的卷积操作,A和B的乘累加,计算的是 1x3 + 2x4 = 11。

而如果将其在channel维度分组(例子中channel维度只有两个数据,我们就分成两组),那么会是这样

图片

第一组只计算channel 维度的前半部分,第二组只计算channel维度的后半部分。

分组的过程是不是很好理解。

2、为什么需要分组卷积

分组卷积最早由Alex等人在2012年的ImageNet图像分类竞赛中提出并使用,提出的初衷是为了解决卷积神经网络训练期间的计算和内存开销问题。

2012年的GPU不像现在的GPU内存那么大,当初GPU内存还很有限,一个channel通道数很大的卷积直接计算,放在整个网络中,是很耗费内存的。

于是,他们把大卷积在通道方向拆分成多个小卷积来分别计算,这样可以让拆分出来的多个小卷积分别运行在多张GPU卡上,达到一个模型多卡并行计算的目的,从而提高训练性能。

需要说明的是,论文中的分组卷积不仅将输入通道进行了分组,同时将输出通道进行了分组。

由此而来的分组卷积,在计算量上变为原来的1/G,G为分组的组数。

3、分组卷积和原始卷积在数学上等价吗?

细心的小伙伴可能会问这个问题。

如果仅仅说分组卷积,那么结果肯定和原始大卷积不等价,因为把channel维度给拆开了。

并且如果不做处理,还会影响最终的推理精度,对于这个问题,有个很好的解决办法。

我们知道,卷积算法的核心是特征提取和融合:5分钟理解什么是卷积的特征提取。

如果不进行其他操作,那么分组卷积仅仅进行了组内小卷积的特征融合,而缺少了分组间的特征融合,这样对于最终的训练推理结果会有影响。

为了解决这个问题,往往在分组卷积前在channle维度进行 shuffle 操作,也就是洗牌,使得特征可以随机的分配到每一个组内,能够更好的完成组间的特征融合。

4、“分组卷积“”的思想神了

回到上面我遇到的问题,我们需要在自己的需求下,利用分组卷积的思想,魔改大卷积运算。

如下示意图:一个输入channel 为 ci 的卷积,通过 split 在输入 channel 维度拆成两个 ci/2 的卷积,然后“分组”进行卷积操作,然后通过加法进行相加。

图片

这里并没有对输出channel 进行分组,因为我们解决的问题不一样,内存对我们来说不是问题,问题仅仅在于输入channel太大。

而通过上面的魔改变换,便可以使得最终的结果和原始卷积计算一致,借用“分组卷积”的思想,可以很好的解决我遇到的问题。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Sql Server中的表组织和索引组织(聚集索引结构,非聚集索引结构,堆结构)

正文 SqlServer用三种方法来组织其分区中的数据或索引页: 1、聚集索引结构 聚集索引是按B树结构进行组织的,B树中的每一页称为一个索引节点。每个索引行包含一个键值和一个指针。指针指向B树上的某一中间级页(比如根节点指向中间级节点中的…

三代自动驾驶系统及主流科技公司自动驾驶技术方案简介

截止目前,按技术特点,自动驾驶技术大致经历了三代发展:第一代自动驾驶技术以后融合感知技术,高精度地图,基于惯导、GPS定位系统,预测模块,基于优化、搜索的规控等组成。第一代比较成熟的自动驾驶…

Python 框架学习 Django篇 (六) 数据表关联、ORM关联

在后端服务器开发中,特别是前后端分离的架构中数据库是非常重要的,后端主要就是负责管理数据,而我们经常使用的mysql、oracle 都是关系型数据库,什么是关系型数据库?就是建立在关系模型基础上的数据库,而最…

Elasticsearch:使用 Open AI 和 Langchain 的 RAG - Retrieval Augmented Generation (二)

这是继上一篇文章 “Elasticsearch:使用 Open AI 和 Langchain 的 RAG - Retrieval Augmented Generation (一)” 的续篇。在这篇文章中,我主要来讲述 ElasticVectorSearch 的使用。 我们的设置和之前的那篇文章是一样的&#xff…

在线设计数据库表用Itbuilder,极简易用真香!!!

“如果您想要一个具有快速搜索运行的高性能数据库,那么数据库设计是必不可少的,花时间设计数据库将帮助您避免效率低下和高冗余等问题”。 在线数据库设计软件itbuilder,界面清爽漂亮,功能简洁,没有多余设置很容易上手…

MQTT(详解)

什么是MQTT MQTT(Message Queuing Telemetry Transport)是一种轻量级的通信协议,用于在设备之间传输消息。它通常用于物联网(IoT)和传感器网络中,可以在不同设备之间进行可靠的通信,而且资源消耗…

MySQL3:MySQL中一条更新SQL是如何执行的?

MySQL3:MySQL中一条更新SQL是如何执行的? MySQL中一条更新SQL是如何执行的?1.Buffer Pool缓冲池2.Redo logredo log作用Redo log文件位置redo log为什么是2个? 3.Undo log4.更新过程5.InnoDB官网架构InnoDB架构-内存结构①Buffer …

Python----break关键字对while...else结构的影响

案例: 女朋友生气,要求道歉5遍:老婆大人,我错了。道歉到第三遍的时候,媳妇埋怨这一遍说的不真诚,是不是就是要退出循环了?这个退出有两种可能性: ① 更生气,不打算原谅…

Xcode iOS app启用文件共享

在info.plist中添加如下两个配置 Supports opening documents in place Application supports iTunes file sharing 结果都为YES,如下图所示: 然后,iOS设备查看,文件->我的iPhone列表中有一个和你工程名相同的文件夹出现&…

图像去噪滤波算法汇总(Python)

前言 上篇文章:图像数据噪音种类以及Python生成对应噪音,汇总了常见的图片噪音以及噪音生成方法,主要用在数据增强上面,作为数据集填充的方式,可以避免模型过拟合。想要了解图像数据增强算法的可以去看本人所撰这篇文…

2023深耕kotlin,谈谈前景

为什么学习kotlin? Kotlin 早就已经是 Google 官方推荐的开发语言了,而且 Android 新的 Compose 框架只支持 Kotlin ,在 Google 那里,Android开发中 Java 其实已经被淘汰了。Java 和 Kotlin 虽然都属于高级语言,但是 …

Adversarial attacks and defenses on AI in medical imaging informatics: A survey

Adversarial attacks and defenses on AI in medical imaging informatics: A survey----《AI在医学影像信息学中的对抗性攻击与防御:综述》 背景: 之前的研究表明,人们对医疗DNN及其易受对抗性攻击的脆弱性一直存在疑虑。 摘要:…

设计模式:桥接模式(C#、JAVA、JavaScript、C++、Python、Go、PHP)

上一篇《适配器模式》 下一篇《装饰器模式》 简介: 桥接模式,它是一种结构型设计模式,它的主要目的是将抽象部分与具体实现部分分离,使它们都可以独立地变化。…

css 雷达扫描图

html 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>css 雷达扫描</title><style>* {margin: 0;padding: 0;}body {background: #000000;height: 100vh;display: flex;align-items…

计算机毕业设计 基于SpringBoot大学生创新创业项目管理系统的设计与实现 Javaweb项目 Java实战项目 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

工控安全与网络安全有什么不同?

在当代&#xff0c;全球制造业正在经历一场前所未有的技术变革。工业4.0不仅代表着自动化和数据交换的进步&#xff0c;它还揭示了工业自动化、智能制造与系统集成的融合。这种集成为企业带来了效率和质量的双重提升&#xff0c;但同时也暴露出新的安全隐患。工控系统成为了这一…

不同网段的IP怎么互通

最近在整理工作的时候发现一个不同网段无法互通的问题&#xff0c;就是我们大家熟知的一级路由和二级路由无法互通的问题。由于需要记录整个过程的完整性&#xff0c;这里也需要详细记录下整个过程&#xff0c;明白的人不用看&#xff0c;可以直接跳过&#xff0c;到解决方法去…

【MyBatis Plus】深入探索 MyBatis Plus 的条件构造器,自定义 SQL语句,Service 接口的实现

文章目录 前言一、条件构造器1.1 什么是条件构造器1.2 QueryWrapper1.3 UpdateWrapper1.4 LambdaWrapper 二、自定义 SQL 语句2.1 自定义 SQL 的基本用法2.2 自定义 SQL 实现多表查询 三、Service 接口3.1 对 Service 接口的认识3.2 实现 Service 接口3.3 实现增删改查功能3.4 …

支持向量机(SVM)

一. 什么是SVM 1. 简介 SVM&#xff0c;曾经是一个特别火爆的概念。它的中文名&#xff1a;支持向量机&#xff08;Support Vector Machine, 简称SVM&#xff09;。因为它红极一时&#xff0c;所以关于它的资料特别多&#xff0c;而且杂乱。虽然如此&#xff0c;只要把握住SV…

bug:Chrome插件SwitchyOmega安装时程序包无效:“CRX_HEADER_INVALID“问题

bug&#xff1a;Chrome插件SwitchyOmega安装时程序包无效:“CRX_HEADER_INVALID“问题 1 解决 先说解决办法&#xff1a; 将下载的crx重命名为xxx.zip&#xff0c;然后解压打开chrome的开发者模式 点击加载已解压的应用程序&#xff0c;然后选择我们解压后的文件夹即可 安装成…