Involution 个人理解

传统卷积具有 :

​ ①空间不变性:卷积核共享。能有效地节省模型参数,且能维护平移的等变性。由于不能引入过多的参数,所以采用比较小的卷积核,但是小的卷积核(如3*3)不能获得广的感受野 (因此involution更容易检测出大物体

​ ② 通道特异性:能在不同的通道中包含不同的语义信息,在许多成功的深度神经网络上表现出比较多的冗余性

​ 原本卷积核需要的参数数量 = C0(输入通道)×Ci(输出通道)×K×K

所以传统卷积比较难去得到长距离的感知,所以提出involution。

involution具有与传统卷积相反的:

​ ①空间特异性:在不同位置上的卷积核是不同的。(kernel对应在一个空间位置上的参数值要与这个位置对应的输入特征向量相关(或者仅由其决定),incident可以自适应地为不同空间位置分配不同的权重)

​ ②通道共享: 每一个组内的通道共享一个卷积核。这样还可以减少计算复杂度

​ involution卷积需要的参数数量 = H×W×K×K×G (H和W是什么?feature map的大小,因为每一个pixel都会产生G个卷积核,所以H×W是feature map的面积,即含有的像素点的个数。将1个像素通过全连接层和激活函数生成K×K×G个维度,通过reshape编程矩阵形式,再通过broadcast生成同样的一定深度,多个通道共享一个卷积核)

卷积核生成

Xi,j代表位置(i,j)的特征向量。Wo和W1都是线性变换矩阵,前者可以使用1x1卷积用作压缩通道数,后者再将通道数扩展,类似于SE-Net的Sequeeze&Excitation过程。σ函数是BN和ReLU。而一个位置需要G个不同的卷积核,而应用conv2d卷积时,输出的shape最多只有4个维度,所以要把G和K×K参数放一起,最终输出的维度为(B,G×K×K,H,W)。最后要扩展多一个维度方便进行广播操作。

由于有了下述变换:Involution卷积比传统卷积的参数量要更少:第一层1×1卷积将通道从C压缩到C/r(r为压缩率),经过一个BN层和ReLu层后再由另一个1×1卷积扩张到G×K×K通道数。因此整个过程的参数量为:输入通道数×输出通道数×卷积核的大小为:1×1×C×C/r + 1×1×C/r×G×K×K =(C²+CGK²)/r; 而传统卷积为K²C²,因为C一般会比G少得多得多,因此Involution参数量更少。

卷积核的运作

​ 首先根据特征图上的点生成一个将特征图上的每一个点都unfold扩展为其K×K领域的大小,再与K×K大小的kernel进行multiply-add操作(卷积操作),也就是进行聚合,变为一个空间位置的输出特征点。(上图为假设G=1的情况)

整个involution的代码(包括生成与执行)

import torch
import torch.nn as nnclass Involution(nn.Module):def __init__(self, channels, kernel_size=7, stride=1, group_channels=16, reduction_ratio=4):super().__init__()assert not (channels % group_channels or channels % reduction_ratio)# in_c=out_cself.channels = channelsself.kernel_size = kernel_sizeself.stride = stride# 每组多少个通道self.group_channels = group_channelsself.groups = channels // group_channels# reduce channelsself.reduce = nn.Sequential(nn.Conv2d(channels, channels // reduction_ratio, 1),nn.BatchNorm2d(channels // reduction_ratio),nn.ReLU())# span channelsself.span = nn.Conv2d(channels // reduction_ratio,self.groups * kernel_size ** 2,1)self.down_sample = nn.AvgPool2d(stride) if stride != 1 else nn.Identity()self.unfold = nn.Unfold(kernel_size, padding=(kernel_size - 1) // 2, stride=stride)def forward(self, x):# Note that 'h', 'w' are height & width of the output feature.# generate involution kernel: (b,G*K*K,h,w)weight_matrix = self.span(self.reduce(self.down_sample(x)))b, _, h, w = weight_matrix.shape# unfold input: (b,C*K*K,h,w)x_unfolded = self.unfold(x)# (b,C*K*K,h,w)->(b,G,C//G,K*K,h,w)x_unfolded = x_unfolded.view(b, self.groups, self.group_channels, self.kernel_size ** 2, h, w)# (b,G*K*K,h,w) -> (b,G,1,K*K,h,w)weight_matrix = weight_matrix.view(b, self.groups, 1, self.kernel_size ** 2, h, w)# (b,G,C//G,h,w)mul_add = (weight_matrix * x_unfolded).sum(dim=3)# (b,C,h,w)out = mul_add.view(b, self.channels, h, w)return out

优势

​ 参数量和计算量更少

​ 更有效地再广泛的空间范围内进行信息交互(能使用更大的卷积核)

​ 在不同空间位置上仍具有知识共享/迁移能力:在生成Involution的时候用的是卷积,这实际上就潜在地引入了知识共享与迁移

​ 不需要位置编码

劣势

​ 无法灵活地改变通道数。需要改变通道数只能从外部通过池化技术进行

​ 通道间的内部信息交换在一定程度上受影响

有待探究的地方

​ 对kernel生成方式的进一步探索;

​ 结合NAS去搜索convolution-involution的混合结构

Involution 笔记:相关推荐

  1. 最强!超越卷积、自注意力机制:强大的神经网络新算子involution

    点上方计算机视觉联盟获取更多干货 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:机器之心,李铎 AI博士笔记系列推荐 周志华<机器学习>手推笔记正式开源!可打印版本附pdf下载链 ...

  2. 姚班普信男--一篇后人类观察田野笔记

    0. 前置说明 这是一篇我从未写过的文章类型,所以,可能会写得乱七八糟的.各位看官多多见谅. 因为最近沉迷人类学,所以一直看各种人类学的书籍,也尝试用人类学的思维方式,来看待一些问题 另一方面,又因为 ...

  3. Involution 详解与维度推导

    论文阅读笔记见:https://blog.csdn.net/full_adder/article/details/115426533?spm=1001.2014.3001.5501 使用代码来自大佬的 ...

  4. Involution:空间不共享?可完全替代卷积的高性能算子 | CVPR 2021

    其实这篇文章很早就写好了,但作者其它论文涉及到洗稿问题,所以先放着了.目前看这篇文章没被举报有洗稿的嫌疑,所以就发出来了 . 来源:晓飞的算法工程笔记 公众号 论文: Involution: Inve ...

  5. 《信息安全原理》复习笔记

    整了6k字然而我发现基本概念基本没弄清楚.. 考完试了然而这份复习笔记跟考试并无关系.. 有错..不全..加粗的也不是重点.. 下次复习..一定记得看图.... [0.1] 1. 安全性与花费的tra ...

  6. 【读书笔记】知易行难,多实践

    前言: 其实,我不喜欢看书,只是喜欢找答案,想通过专业的解答来解决我生活的困惑.所以,我听了很多书,也看了很多书,但看完书,没有很多的实践,导致我并不很深入在很多时候. 分享读书笔记: <高效1 ...

  7. 【运维学习笔记】生命不息,搞事开始。。。

    001生命不息,搞事不止!!! 这段时间和hexesdesu搞了很多事情! 之前是机械硬盘和固态硬盘的测速,我就在那默默的看着他一个硬盘一个机械测来测去. 坐在他后面,每天都能看到这位萌萌的小男孩,各 ...

  8. SSAN 关系抽取 论文笔记

    20210621 https://zhuanlan.zhihu.com/p/353183322 [KG笔记]八.文档级(Document Level)关系抽取任务 共指id嵌入一样 但是实体嵌入的时候 ...

  9. pandas以前笔记

    # -*- coding: utf-8 -*- """ Created on Sat Jul 21 20:06:20 2018@author: heimi "& ...

最新文章

  1. 从一个男人身上看出他的修养和抱负
  2. Android 四大组件之——Acitivity(二) 启动模式
  3. 【PC工具】常用USB转串口芯片CP210x驱动,CH340G驱动安装有可能遇到的问题及解决办法...
  4. onenote快捷键_onenote链接系列:4种链接笔记的地址
  5. JNDI学习总结(3)——Tomcat下使用C3P0配置JNDI数据源
  6. 罗盘时钟制作代码_抖音八卦时钟手机屏保设置方法!
  7. Vue 中使用element ui 自定义邮箱和手机号的效验规则
  8. js forEach跳出循环
  9. python的输入输出语句_Python基本输出语句/输入语句/变量解析
  10. 2020年最全易语言安装与配置使用教程
  11. Es与MongoDB地理数据搜索性能比较
  12. Java黑皮书课后题第6章:*6.7(金融应用:计算未来投资回报率)编写一个方法,计算按照给定的年数和利率计算未来投资回报值,未来投资回报值是用编程练习题2.21中的公式得到的,使用下面方法头
  13. 2022-2022阿里巴巴Android面试真题解析,阿里+头条+抖音+百度+蚂蚁+京东面经
  14. SpringBoot整合redis,启动提示错误信息: An exception was thrown by org.redisson.misc.RedissonPromise$$Lambda$682
  15. 使用H5Streamer轻松搭建视频监控项目
  16. c语言编程中的或逻辑的符号 符号如何输入,C语言中逻辑运算符(,||,!)和位运算符号(,|,^)...
  17. HTTP性能极限优化
  18. 珠三角地区调查研究咨询市场知名公司信息情况
  19. html设置字体比12还小,css字体更小 css比12px更小的方法
  20. 计算机专业竞聘词150,计算机专业组长竞聘演讲稿范文

热门文章

  1. ubuntu系统怎么退出tty模式(开机自动进入)?(仅供参考)
  2. linux 下网络编程 聊天室项目
  3. 关于精简安装office2010的步骤
  4. 编c语言程序 任意输入一个长方体的长,宽,高,计算体积.,C语言程序,由键盘任意输入一个长方体的长.宽.高,计算体积....
  5. 鸿蒙如何用JS开发智能手表App
  6. 球半足球分析,巴西甲:布拉干RB VS 博塔弗戈 7月5日
  7. [java面试]之java Web
  8. T-test数据分析
  9. 计算机数据表格方框,WPS表格使用心得:不容小觑的小方框 -电脑资料
  10. IBM SPSS Modeler使用技巧 ----参数及全局变量的使用