IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> ResNeXt与分组卷积 -> 正文阅读

[人工智能]ResNeXt与分组卷积

ResNeXt两点:
(1)Inception v4的所有分支结构统一
(2)inception block前后增加shortcut分支

分支结构统一与shortcut

在这里插入图片描述
左边是Inception结构,不同分支用不同的结构。
右边是ResNeXt的Block,每个分支都是1x1,3x3,1x1的BottleNeck结构,所以叫统一分支。
(1)为什么要统一分支?因为左边的结构是人为设计的,所以想用稍微自然一点的结构。(有ablation study吗?)
增加shortcut发现效果更好

具体实现

看右边的结构,第一个1x1卷积直接把256维降为4维了,是不是很离谱?
实际这里并不是这么做的,整体是用分组卷积实现的,而且只有中间的3x3卷积是分组卷积
具体实现如下

class ResNeXtBottleneck(nn.Module):
 def __init__(self, in_channels, out_channels, stride, cardinality, base_width, widen_factor):
 super(ResNeXtBottleneck, self).__init__()
        width_ratio = out_channels / (widen_factor * 64.)
        D = cardinality * int(base_width * width_ratio)#32*4 32组,每组通道数为4
        self.conv_reduce = nn.Conv2d(in_channels, D, kernel_size=1, stride=1, padding=0, bias=False)
        self.bn_reduce = nn.BatchNorm2d(D)
        self.conv_conv = nn.Conv2d(D, D, kernel_size=3, stride=stride, padding=1, groups=cardinality, bias=False)
        self.bn = nn.BatchNorm2d(D)
        self.conv_expand = nn.Conv2d(D, out_channels, kernel_size=1, stride=1, padding=0, bias=False)
        self.bn_expand = nn.BatchNorm2d(out_channels)
 
        self.shortcut = nn.Sequential()
 if in_channels != out_channels:
            self.shortcut.add_module('shortcut_conv',
                                     nn.Conv2d(in_channels, out_channels, kernel_size=1, stride=stride, padding=0,
                                               bias=False))
            self.shortcut.add_module('shortcut_bn', nn.BatchNorm2d(out_channels))

可以看到,第一个和第三个(1x1)卷积并没有分组,只有第二个(3x3)卷积有分组,所以实际上是这样的结构:
在这里插入图片描述
第一个卷积负责降维到128,第二个卷积分组得到特征,第三个卷积还原通道。
但是我们仔细想想,这种实现方式和上面那张图实际上是等价的
第一层:128个1x1卷积对相同的输入进行运算,得到128个输出特征图
第二层,128个3x3卷积做分组卷积,实际上就是分成32组,每组4个卷积核,实际上就是把第一层输出的128个特征图分成32组,每组用4个卷积核卷积。也就是说,这32组,每组4个和第一层的128卷积核是一一对应的。也就是说,上面那一层可以看作是将原来的256维的特征图用32组卷积核降维到每组4维,共128维,也就是这张图:
在这里插入图片描述
每组4维的特征图再用该组的4个1x1卷积核做一次变换,然后再concat在一起到128维,最后用1个1x1卷积升维。
当然,最后的1x1卷积也可以看作32组1x1卷积,每组升维到256,再最后加起来,如图(a)
在这里插入图片描述
实际上应该是(a)->(b)->?的路线

值得注意的是

在这里插入图片描述
这里第一块并不是把256维的特征降维到4维的意思,而是降维到32x4维,然后分发给32个分支,每个分支4维的意思
为什么这么说?且看论文中的推导ResNeXt详解 - 大师兄的文章 - 知乎
https://zhuanlan.zhihu.com/p/51075096

ResNeXt的思想其实是由全连接神经网络来的
在这里插入图片描述
实际上可以分为3个步骤
(1)拆分:将 x \bold{x} x拆分为 x i x_i xi?
(2)映射:对于每个 x i x_i xi?乘上对应的权重
(3)聚合:将所有分支映射后的结果相加
实际上可以用一个公式表示:
在这里插入图片描述
如果将映射推广,这里只不过是内积(乘法),如果是神经网络呢?
在这里插入图片描述

因此,最初的设计:
(1)拆分:将输入特征(降维后)拆分成多组
(2)映射:分组使用3x3卷积映射
(3)聚合:将映射后的结果(升维后)相加
于是就有了如下结构:
在这里插入图片描述
我们从最下层看,每组卷积的输入channel是4,输出channel是256,共32组,实际上可以先将32组输入feature concat在一起,也就是(32x4,h,w)再使用256个(1,1,32x4)的卷积核升维是等价的。
我们画个图来看看:

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-03-21 20:50:48  更:2022-03-21 20:51:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 14:56:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码