精华内容
下载资源
问答
  • channel shuffle
    2022-06-07 20:47:55

    ShuffleNet 中引入了 channel shuffle, 用来进行不同分组的特征之间的信息流动, 以提高性能。而Detectron2使用的pytorch版本一般较低,没有channel shuffle这个类,因此编写这个轮子用于通道洗牌。实现了与1.11.0官方库相同的结果。

    官方文档:ChannelShuffle — PyTorch 1.11.0 documentation

    import torch
    import torch.nn as nn
    
    class ChannelShuffle(nn.Module):
        def __init__(self, groups):
            super(ChannelShuffle, self).__init__()
            self.groups = groups
    
        def forward(self, x):
            B, C, H, W = x.shape
    
            chnls_per_group = C // self.groups
            
            assert C % self.groups == 0
    
            x = x.view(B, self.groups, chnls_per_group, H, W)  # 通道分组 (B,C,H,W)->(B,group,C,H,W)
    
            x = torch.transpose(x, 1, 2).contiguous()  # 通道洗牌
            x = x.view(B, -1, H, W)  # 重新展开为(B,C,H,W)
            return x
    
    channel_shuffle = ChannelShuffle(2)
    
    input = torch.randn(1, 4, 2, 2)
    print(input)
    
    output = channel_shuffle(input)
    
    print(output)

    更多相关内容
  • 原文地址: 《ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices》 ShuffleNet的设计目标是如何利用有限的计算...1. 提出channel shuffle思想 2. PW Gconv的使用 3. 利用PW Gc

    原文地址:

    《ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices》

    ShuffleNet的设计目标是如何利用有限的计算资源来达到最好的模型精度,这需要很好地在速度和精度之间做平衡。shufflenet通过设计更高效的网络结构来实现模型变小和变快,即通过改变模型结构来方便移动端部署

    亮点:

    1. 提出channel shuffle思想

    2. PW Gconv的使用

    3. 利用PW Gconv与DW conv更改ResNet模块结构

    1. 分组卷积(Group conv)

    分组卷积是将输入层的不同特征图进行分组,然后采用不同的卷积核再对各个组进行卷积,这样会降低卷积的计算量(1/g)。因为一般的卷积都是在所有的输入特征图上做卷积,可以说是全通道卷积,这是一种通道密集连接方式(channel dense connection),而分组卷积相比则是一种通道稀疏连接方式(channel sparse connection)。

    计算量:

    之前采用分组卷积的一些网络结构如Xception,MobileNet,ResNeXt等,因为需要采用了密集的1x1 pointwise convolution,虽然1*1的卷积可以完成升维与降维,保证group convolution之后不同组的特征图之间的信息交流,但也增加了计算量。实际上比如ResNeXt模型中1x1卷积基本上占据了93.4%的乘加运算。

    解决方法:对1x1卷积采用channel sparse connection 即分组操作。

    特征通信:

    group convolution层另一个问题是不同组之间的特征图需要通信,否则就好像分了几个互不相干的路,大家各走各的,会降低网络的特征提取能力。

    解决方法:channel shuffle。

    2.channel shuffle

    一般卷积操作中比如输入feature map的数量是N,该卷积层的filter数量是M,那么M个filter中的每一个filter都要和N个feature map的某个区域做卷积,然后相加作为一个卷积的结果。假设是group操作,设group为g,那么N个输入feature map就被分成g个group,M个filter就被分成g个group,然后在做卷积操作的时候,第一个group的M/g个filter中的每一个都和第一个group的N/g个输入feature map做卷积得到结果,第二个group同理,直到最后一个group,如(a)。不同的颜色代表不同的group,图中有三个group。这种操作可以大大减少计算量,因为你每个filter不再是和输入的全部feature map做卷积,而是和一个group的feature map做卷积。但是如果多个group操作叠加在一起,如(a)的两个卷积层都有group操作,显然就会产生边界效应,边界效应就是某个输出channel仅仅来自输入channel的一小部分。这样肯定是不行的,学出来的特征会非常局限。于是就有了channel shuffle来解决这个问题,先看(b),在进行GConv2之前,对其输入feature map做一个分配,也就是每个group分成几个subgroup,然后将不同group的subgroup作为GConv2的一个group的输入,使得GConv2的每一个group都能卷积输入的所有group的feature map,这和(c)的channel shuffle的思想是一样的,(c)进一步的展示了这一过程并随机,其实是“均匀地打乱”。

    3. 基本单元

    pointwise group convolutions,其实就是带group的卷积核为1*1的卷积,也就是说pointwise convolution是卷积核为1*1的卷积。

    在ResNeXt中主要是对3*3的卷积做group操作,但是在ShuffleNet中,作者是对1*1的卷积做group的操作,因为作者认为1*1的卷积操作的计算量不可忽视。可以看(b)中的第一个1*1卷积是GConv,表示group convolution。

    (a)是ResNet中的bottleneck unit,不过将原来的3*3 Conv改成3*3 DWConv,作者的ShuffleNet主要也是在这基础上做改动。首先用带group的1*1卷积代替原来的1*1卷积,同时跟一个channel shuffle操作。然后是3*3 DWConv表示depthwise separable convolution。depthwise separable convolution可以参考MobileNet。(c)添加了一个Average pooling和设置了stride=2,另外原来Resnet最后是一个Add操作,也就是元素值相加,而在(c)中是采用concat的操作,也就是按channel合并,类似googleNet的Inception操作。这样做的目的主要是降低计算量与参数大小。

    注意channel shuffle后面没有接ReLU激活函数

     4. ShuffleNet网络结构

    可以看到开始使用的普通的3x3的卷积和max pool层。然后是三个阶段,每个阶段都是重复堆积了几个ShuffleNet的基本单元。对于每个阶段,第一个基本单元采用的是stride=2,这样特征图width和height各降低一半,而通道数增加一倍。后面的基本单元都是stride=1,特征图和通道数都保持不变。对于基本单元来说,其中瓶颈层,就是3x3卷积层的通道数为输出通道数的1/4,这和残差单元的设计理念是一样的。不过有个细节是,对于stride=2的基本单元,由于原输入会贡献一部分最终输出的通道数,那么在计算1/4时使用未concat之前的通道数。其中group(g)控制了group convolution中的分组数,分组越多,在相同计算资源下,可以使用更多的通道数,所以越大时,采用了更多的卷积核。这里给个例子,当g=3时,对于第一阶段的第一个基本单元,其输入通道数为24,输出通道数为240,但是其stride=2,那么由于原输入通过avg pool可以贡献24个通道,所以相当于左支只需要产生240-24=216通道,中间瓶颈层的通道数就为216/4=54。其他的可以以此类推。当完成三阶段后,采用global pool将特征图大小降为1x1,最后是输出类别预测值的全连接层。

    5. 思想总结:

    • ShuffleNet的核心就是用pointwise group convolution,channel shuffle和depthwise separable convolution代替ResNet block的相应层构成了ShuffleNet uint,达到了减少计算量和提高准确率的目的。
    • channel shuffle解决了多个group convolution叠加出现的边界效应。
    • pointwise group convolution和depthwise separable convolution主要减少了计算量。

    参考:

    ShuffleNet算法详解

    CNN模型之ShuffleNet

    仅为学习记录,侵删!

    展开全文
  • shufflenet中channel shuffle原理

    千次阅读 2020-02-27 20:48:50
    因为一般的卷积都是在所有的输入特征图上做卷积,可以说是全通道卷积,这是一种通道密集连接方式(channel dense connection),而group convolution相比则是一种通道稀疏连接方式 具体过程可见我的另一个博客 ...

    分组卷积
    Group convolution是将输入层的不同特征图进行分组,然后采用不同的卷积核再对各个组进行卷积,这样会降低卷积的计算量。因为一般的卷积都是在所有的输入特征图上做卷积,可以说是全通道卷积,这是一种通道密集连接方式(channel dense connection),而group convolution相比则是一种通道稀疏连接方式
    具体过程可见我的另一个博客
    https://blog.csdn.net/ding_programmer/article/details/104469348

    分组卷积的矛盾——特征通信
    group convolution层另一个问题是不同组之间的特征图需要通信,否则就好像分了几个互不相干的路,大家各走各的,会降低网络的特征提取能力,这也可以解释为什么Xception,MobileNet等网络采用密集的1x1 pointwise convolution,因为要保证group convolution之后不同组的特征图之间的信息交流。

    channel shuffle

    为达到特征通信目的,我们不采用dense pointwise convolution,考虑其他的思路:channel shuffle。如图b,其含义就是对group convolution之后的特征图进行“重组”,这样可以保证接下了采用的group convolution其输入来自不同的组,因此信息可以在不同组之间流转。图c进一步的展示了这一过程并随机,其实是“均匀地打乱”。

    在程序上实现channel shuffle是非常容易的:假定将输入层分为 g 组,总通道数为 g × n g \times n g×n,首先你将通道那个维度拆分为 (g,n) 两个维度,然后将这两个维度转置变成 (n,g) ,最后重新reshape成一个维度 g × n g\times n g×n

    在这里插入图片描述

    展开全文
  • 通道随机混合操作(Channel Shuffle Operation)

    千次阅读 多人点赞 2019-07-17 16:38:04
    通道随机混合操作(Channel Shuffle Operation)可以看成“重塑-转置-重塑”(“reshapetranspose- reshape”)操作。这里假设把4个Feature Maps级联后,共1024个Channels。现在我们想把这个1024个Channels随机打乱...

    通道随机混合操作(Channel Shuffle Operation)可以看成“重塑-转置-重塑”(“reshapetranspose-
    reshape”)操作。这里假设把4个Feature Maps级联后,共1024个Channels。现在我们想把这个1024个Channels随机打乱混合。首先把Channels重塑为(g, c),其中  g 表示分组数目,c=1024/g。然后把它转置一下为(c, g)。然后把它重塑为1024个通道。

    具体代码如下:

    import torch
    
    
    def channel_shuffle(x, groups):
        batchsize, num_channels, height, width = x.data.size()
    
        channels_per_group = num_channels // groups
    
        # reshape
        x = x.view(batchsize, groups,
                   channels_per_group, height, width)
    
        # transpose
        # - contiguous() required if transpose() is used before view().
        #   See https://github.com/pytorch/pytorch/issues/764
        x = torch.transpose(x, 1, 2).contiguous()
    
        # flatten
        x = x.view(batchsize, -1, height, width)
    
    
        return x

    如果您觉得我的文章对您有所帮助,欢迎扫码进行赞赏!

     

    参考:

    1. ShuffleNet

    展开全文
  • 通道混洗(Channel shuffle)

    千次阅读 2020-01-11 17:35:44
    #通道混洗(Channel shuffle) #目的:在不增加计算量的情况下,使通道充分融合 x = torch.randn(4,6,3,3) y = x.reshape(4,2,3,3,3) print(y.shape) z = y.permute(0,2,1,3,4) print(z.shape) v = z.reshape(4,6,3,3)...
  • Tensorflow笔记——channel shuffle的实现

    千次阅读 2019-07-02 19:14:05
    Tensorflow笔记——channel shuffle的实现 Channel shuffle: 因为groupconvolution会导致channel具有局部性,这样对模型的泛化能力有点弱,影响模型的准确率,因此加入channel shuffle,对groupconvolotion的卷积...
  • Channel Shuffle Operation:据我们所知,虽然 CNN 库 cuda-convnet [20] 支持“随机稀疏卷积”层,相当于随机通道shuffle 后跟一个分组卷积层。这种“随机混洗”操作有不同的目的,后来很少被利用。最近,另一项...
  • ShuffleNet=CNN+组卷积+channel shuffle+模型加速 ShuffleNet Unit ShuffleNet和ResNet、ResNeXt相比。在相同的设置下,例如,给定输入的大小为c∗h∗wc*h*wc∗h∗w,通道数为m,ResNet需要hw(2cm+9m2)FLOPshw(2cm+...
  • [a]就是普通的分组卷积,比如(M,M,16)的feature map按channel分成4组,每组(M,M,4),每组用K个(3,3,4)的卷积核去卷积,这样就能得到4个feature map(如果加了padding使大小不变的话,就是4个(M,M,K)的feature map...
  • optional ShuffleChannelParameter shuffle_channel_param = 164; }   然后在 caffe.proto 文件的最后,添加 : message ShuffleChannelParameter { optional uint32 group = 1[default = 1]; // The ...
  • 参考博客:变形卷积核、可分离卷积?卷积神经网络中十大拍案叫绝的操作。 pytorch微调网络Inception3 ... 1、inception的多分支卷积: 最初的Inception的卷积如下: ...其是对输入进行多个卷积处理,往往比单一卷积核...
  • class Channel_Shuffle(nn.Module): def __init__(self, num_groups): super(Channel_Shuffle, self).__init__() self.num_groups = num_groups def forward(self, x: torch.FloatTensor): batch_size,
  • pytorch实现ShuffleNet

    千次阅读 2019-02-22 10:44:57
    主要的创新点在于使用了分组卷积(group convolution)和通道打乱(channel shuffle)。 分组卷积和通道打乱 分组卷积 分组卷积最早由AlexNet中使用。由于当时的硬件资源有限,训练AlexNet时卷积操作不能全部放在同一...
  • ShuffleNet的pytorch实现

    千次阅读 2020-09-28 15:45:16
    2.channel shuffle 它能够在减少计算量的同时保持精度。 剪枝(pruning),压缩(compressing),低精度表示(low-bit representing) 使用pointwise group convolution来降低1×11\times11×1卷
  • 实验python train.py -opt options/train/train_sr.json 先激活虚拟环境source activate pytorch tensorboard --logdir tb_logger/ --port 6008 浏览器打开... ...固定对半的shuffle以及随机shuffle ...
  • 推荐专栏:【图像处理】【千锤百炼Python】【深度学习】【排序算法】 目录 一、简述 二、ShuffleNet V1 2.1 Channel Shuffle 2.2 Shuffle Unit 2.3 NetWork Architecture 三、ShuffleNet V2 3.1 Practical ...
  • SCA-CNN在多层特征映射中动态调整句子生成上下文,编码重要的空间位置和通道特征。
  • Opencv与PIL之间的通道(channel)转换

    千次阅读 2020-03-01 18:00:55
    我们知道opencv默认是以BGR通道顺序打开的和显示的,而PIL.Image是以RGB打开和显示的,要想使用opencv打开的图片在PIL.Image中显示就必须转换通道(不转换通道也可以显示,但是颜色会发生变化)。...
  • 所以实际上用到了三种类型的卷积: shuffled grouped convolution = grouped convolution + Channel Shuffle pointwise grouped convolution = 1x1 convolution + grouped convolution depthwise separable ...
  • 在CPN基础上添加了两个模块:Channel Shuffle Module (CSM)和Spatial, Channel-wise Attention Residual Bottleneck (SCARB)。 a. CSM是在不同level的feature maps上做channel shuffel,目的是混合pyramid featu...
  • 行为分析(五)那篇文章中有位同学提问:ShuffleNet有两个版本,Lite-...左边的(a)和(b)图是v1版本,右边的(c)和(d)图是v2版本,只要观察Channel Shuffle在哪里就可以分辨,在下面就是v2版本,在分支内就是v1版本。 ...
  • 轻型网络知识点

    千次阅读 2020-08-20 10:52:22
    其次,channel shuffle的操作移到了concat后面,和前面第3点发现对应,同时也是因为第一个1*1卷积层没有group操作,所以在其后面跟channel shuffle也没有太大必要。 最后是将element-wise add操作替换成concat,这...
  • 卷积压缩算法--ShuffleNetwork

    千次阅读 2018-03-20 22:23:06
    主要是使用了两种操作:一个是pointwise group convolution,一个是channel shuffle。这两种操作不但减小了计算成本还保持了原有的精度。实验证明在ImageNet 分类中,shuffleNet的性能比其他先进的架构都强。在40...
  • 针对Caffe下特殊操作实现MobileNet-DepthwiseConvolution在Caffe下实现实现步骤源码:depthwise_conv_layer.hppdepthwise_conv_layer.cppdepthwise_conv_layer.cuShuffleNet通道混洗操作(shuffle channel)在Caffe...
  • ShuffleNet算法详解

    万次阅读 多人点赞 2017-07-14 22:02:34
    ShuffleNet的核心就是用pointwise group convolution,channel shuffle和depthwise separable convolution代替ResNet block的相应层构成了ShuffleNet uint,达到了减少计算量和提高准确率的目的。channel shuffle...
  • ShuffleNet v1

    2021-06-24 09:48:08
    channel shuffle的代码如下所示 def channel_shuffle(x, groups): """Channel Shuffle operation. This function enables cross-group information flow for multiple groups convolution layers. Args: x (Tensor)...
  • 轻量级神经网络:ShuffleNetV2解读

    千次阅读 2019-06-06 22:16:04
    不同组之间特征通信问题 ————> channel shuffle 逐点组卷积,就是带分组的卷积核为1×1的卷积,也就是说逐点组卷积是卷积核为1×1的分组卷积。 什么是channel shuffle? 分组会导致信息的丢失,为了...
  • ShuffleNet的核心就是用pointwise group convolution,channel shuffle和depthwise separable convolution代替ResNet block的相应层构成了ShuffleNet uint,达到了减少计算量和提高准确率的目的。channel shuffle...
  • 目录 背景: 通道混洗简述 ... 2017年的ShuffleNet v1从优化网络结构的角度出发,利用组卷积与通道混洗(Channel Shuffle)的操作有效降低了1×1逐点卷积的计算量,是一个极为高效的轻量化网络。而20

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,021
精华内容 4,408
关键字:

channel shuffle