ShuffleNet心得

article/2025/11/10 16:46:50

channel shuffle:

1)利用group ,再组间进行深度卷积。

优点:1)极大减小计算量(FLOPS)

               由于每个filter不再是和输入的全部feature map做卷积,而是仅仅和一个group的feature map做卷积。

 缺点:边界效应产生,即某个输出channel仅仅来自输入channel的一小部分

细节:一般卷积操作中比如输入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.


2)为了抵消边界效应,提出channel shuffle

这里写图片描述

本质; 即进行GConv2之前,对其输入feature map做一个分配,使得GConv2的每一个group都能卷积输入的所有group的feature map

def _shuffle(x, groups):def shuffle_layer(x):_, w, h, n = K.int_shape(x)nb_chan_per_grp = n // groupsx = K.reshape(x, (-1, w, h, nb_chan_per_grp, groups))x = K.permute_dimensions(x, (0, 1, 2, 4, 3)) # Transpose only grps and chs(按照给定的模式重排一个张量的轴)x = K.reshape(x, (-1, w, h, n)return x

 

 

附代码:

 

from keras.models import Model
from keras.layers import *
from keras.activations import *
from keras.callbacks import *
import keras.backend as K
from keras.engine.topology import get_source_inputs
count=0
def _info(groups):return {1: [24, 144, 288, 576],2: [24, 200, 400, 800],3: [24, 240, 480, 960],4: [24, 272, 544, 1088],8: [24, 384, 768, 1536]}[groups], [None, 3, 7, 3]def basemodel(input_tensor=None, input_shape=None,groups=8):if input_tensor is None:img_input = Input(shape=input_shape)else:if not K.is_keras_tensor(input_tensor):img_input = Input(tensor=input_tensor, shape=input_shape)else:img_input = input_tensorbn_axis = 3 if K.image_data_format() == 'channels_last' else 1x = Conv2D(24,kernel_size=(3, 3),strides=2,use_bias=False,padding='same')(img_input)x = BatchNormalization()(x)x = Activation('relu')(x)x = MaxPooling2D(pool_size=(3, 3),strides=2,padding='same',)(x)x = Activation('relu',name='pool1')(x)channels_list, repeat_list = _info(groups)   #  [24, 200, 400, 800],[None, 3, 7, 3]# import pdb;pdb.set_trace()for i, (out_channels, repeat) in enumerate(zip(channels_list[1:], repeat_list[1:]), start=1):x = _stage(x, groups, channels_list[i-1], out_channels, repeat)#8if input_tensor is not None:inputs = get_source_inputs(input_tensor)else:inputs = img_inputmodel = Model(inputs, x, name='basemodel_dense')return modeldef _stage(tensor, groups, in_channels, out_channels, repeat):#repeat=repeat_list[1:],[None, 3, 7, 3]x = _shufflenet_unit(tensor, groups, in_channels, out_channels, 2) #2for _ in range(repeat):x = _shufflenet_unit(x, groups, out_channels, out_channels, 1)return x#out_i=[4,12,16]
#(name='stage%s'% k[0])def _pw_group(tensor, groups, in_channels, out_channels):      #一个组,分通道卷积操作,之后cancat"""Pointwise grouped convolution."""nb_chan_per_grp = in_channels // groupspw_convs = []for grp in range(groups):x = Lambda(lambda x: x[:, :, :, nb_chan_per_grp * grp: nb_chan_per_grp * (grp + 1)])(tensor)grp_out_chan = int(out_channels / groups + 0.5)pw_convs.append(Conv2D(grp_out_chan,kernel_size=(1, 1),padding='same',use_bias=False,strides=1)(x))return Concatenate(axis=-1)(pw_convs)def _shuffle(x, groups):            #通道间的打乱def shuffle_layer(x):_, w, h, n = K.int_shape(x)nb_chan_per_grp = n // groupsx = K.reshape(x, (-1, w, h, nb_chan_per_grp, groups))x = K.permute_dimensions(x, (0, 1, 2, 4, 3)) # Transpose only grps and chs(按照给定的模式重排一个张量的轴)x = K.reshape(x, (-1, w, h, n))return xreturn Lambda(shuffle_layer)(x)def _shufflenet_unit(tensor, groups, in_channels, out_channels, strides, shuffle=True, bottleneck=4):bottleneck_channels = out_channels // bottleneckx = _pw_group(tensor, groups, in_channels, bottleneck_channels)   #深度可分离卷积x = BatchNormalization()(x)x = Activation('relu')(x)if shuffle:x = _shuffle(x, groups)         #通道间的打乱x = DepthwiseConv2D(kernel_size=(3, 3),             #深度卷积padding='same',use_bias=False,strides=strides)(x)x = BatchNormalization()(x)x = _pw_group(x, groups, bottleneck_channels,out_channels if strides < 2 else out_channels - in_channels)x = BatchNormalization()(x)if strides < 2:x = Add()([tensor, x])else:avg = AveragePooling2D(pool_size=(3, 3),strides=2,padding='same')(tensor)x = Concatenate(axis=-1)([avg, x])global countcount+=1x = Activation('relu',name='stage%s'% count)(x)return x

 


http://chatgpt.dhexx.cn/article/6APEnTYx.shtml

相关文章

ShuffleNet V2

原文链接&#xff1a; ShuffleNet V2 论文阅读笔记​blog.csdn.net 论文链接&#xff1a; Practical Guidelines for Efficient CNN Architecture Design​arxiv.org 我自己基于 caffe 框架的复现&#xff1a; anlongstory/ShuffleNet_V2-caffe​github.com 本文主要是对目…

【CV】ShuffleNet:通过 GroupConv 和 ChannelShuffle 实现轻量化 CNN 架构

论文名称&#xff1a;ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices 论文下载&#xff1a;https://arxiv.org/abs/1707.01083 论文年份&#xff1a;2017 论文被引&#xff1a;3925&#xff08;2022/05/11&#xff09; 论文代码&#xf…

shufflenet_v1

本文使用的是轻量级模型shufflenet&#xff0c;使用keras框架进行训练。 参考链接&#xff08;模型详解&#xff09;&#xff1a;https://blog.csdn.net/zjn295771349/article/details/89704086 代码如下&#xff1a; 1.data_process.py&#xff08;数据处理&#xff1a;这里…

ShuffleNet V1

论文&#xff1a;https://arxiv.org/abs/1707.01083 1 问题提出 当前的CNN发展趋势是网络越大&#xff0c;性能越好。但是&#xff0c;在计算能力有限的应用场景下(无人机、机器人及智能手机上)&#xff0c;因为内存和计算能力的限制&#xff0c;无法部署大规模的神经网络。虽…

ShuffleNet 算法的介绍

引言 ShuffleNet是旷视科技最近提出的一种计算高效的CNN模型&#xff0c;其和MobileNet和SqueezeNet等一样主要是想应用在移动端。所以&#xff0c;ShuffleNet的设计目标也是如何利用有限的计算资源来达到最好的模型精度&#xff0c;这需要很好地在速度和精度之间做平衡。Shuf…

ShuffleNet网络学习笔记

目录 ShuffleNet V1 论文 介绍 Channel Shuffle ShuffleNet v1 单元 ShuffleNet v2 论文 介绍 高效模型的设计准则 ShuffleNet V2结构 ShuffleNet v2和DenseNet 总结 ShuffleNet V1 论文 ShuffleNet: An Extremely Efficient Convolutional Neural Network for M…

shuffleNet系列

目录 分组卷积 分组卷积的矛盾——计算量 分组卷积的矛盾——特征通信 channel shuffle ShuffleNet V1 ShuffleNet基本单元 ShuffleNet网络结构 对比实验 ShuffleNet V2 设计理念 网络结构 对比实验 分组卷积 Group convolution是将输入层的不同特征图进行分组&a…

Shufflenet解读

论文&#xff1a;ShuffleNet: AnExtremely Efficient Convolutional Neural Network for Mobile Devices 论文提到模型加速的方法为&#xff1a; 1&#xff09; 修剪网络&#xff0c;减少分支&#xff08;pruningnetwork connections&#xff09;。 2&#xff09; 对于一个…

ShuffleNet模型解读

原文链接&#xff1a;&#xff1a;https://arxiv.org/abs/1707.01083 Abstract 论文提出了一种计算效率极高的卷积神经网络结构——ShuffleNet&#xff0c;它是专门为计算能力有限的移动平台设计的。这个新结构用来两个新操作——逐渐群卷积(pointwise group convulution)和通…

ShuffleNet

ShuffleNetV2 的构建模块。首先&#xff0c;卷积步长为 1 的瓶颈块中&#xff0c;先将输入特征按通道一分为二&#xff0c;化成两个分支来 代替原先的分组卷积结构&#xff0c;并且每个分支中的卷积层都 是保持输入输出通道数相同。其中一个分支不采取任何操作以减少参数量和计…

轻量级网络——ShuffleNetV2

文章目录 1.ShuffleNetV2的介绍2.ShuffleNetV2的四条实用指南G1) Equal channel width minimizes memory access cost (MAC)G2) Excessive group convolution increases MACG3) Network fragmentation reduces degree of parallelismG4) Element-wise operations are non-negli…

轻量化网络结构——ShuffleNet

论文&#xff1a;《ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices》—Face 1.shuffle具体来说是channel shuffle&#xff0c;是将各部分的feature map的channel进行有序的打乱&#xff0c;构成新的feature map&#xff0c;以解决group…

【论文阅读】ShuffleNet——ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices

文章目录 论文阅读代码实现modeltrainpredict 实验结果 论文阅读 感谢P导 ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices 文章中提出了一个非常有效的Architecture——ShuffleNet&#xff0c;主要使用两种操作&#xff0c;分组PW卷积…

ShuffleNet V1、V2 EfficientNet 迁移学习

一、ShuffleNet V1 ShuffleNet Unit中全是GConv和DWConv。 在左侧的网络结构中&#xff0c;对于输入特征矩阵&#xff0c;有串行的GConv1和GConv2&#xff0c;对于普通的组卷积的计算&#xff0c;只针对该组内的channel的信息进行计算。组卷积虽然能够减少参数和计算量&#xf…

论文阅读笔记:ShuffleNet

1. 背景 由于深度学习模型结构越来越复杂&#xff0c;参数量也越来越大&#xff0c;需要大量的算力去做模型的训练和推理。然而随着移动设备的普及&#xff0c;将深度学习模型部署于计算资源有限基于ARM的移动设备成为了研究的热点。 ShuffleNet[1]是一种专门为计算资源有限的…

轻量级神经网络——shuffleNet

文章目录 轻量级神经网络——shuffleNetshuffleNet1逐点分组卷积(Pointwise group convolution)✨✨✨通道重排(channel shuffle)✨✨✨shuffleNet Unit✨✨✨shuffleNet1的网络结果和效果 轻量级神经网络——shuffleNet shuffleNet1 在之前&#xff0c;已经讨论过一种轻量级神…

【zynq】‘Underfined reference Xil_out 32’报错解决方法

在zynq book Exercise 4A实验中&#xff0c;按照文档流程会报错‘Underfined reference Xil_out 32’。没有找到#include "xil_io.h"。无法直接在”led_controller.h”中加入”xil_io.h”。 可以在"xparameters.h"加入#include“xil_io.h”解决。 插入后l…

vivado SDK Underfined reference Xil_out 32’。

在黑金ZYNQ 实验中&#xff0c;按照文档流程会报错‘Underfined reference Xil_out 32’。 如下图所示&#xff0c;网上提示是没有xil_io.h 解决办法 在文件中添加#include "xil_io.h"即可解决这个问题。

xil_printf打印遇到的问题

xil_printf打印遇到的问题 使用xil_printf打印遇到的问题解决方法 使用xil_printf打印遇到的问题 最近在使用vitis做zynq的开发。 在使用xil_printf函数的时候发现打印会出现一些问题&#xff1a; 使用xil_printf函数打印“%f”时&#xff0c;没有打印出来数据&#xff0c; x…

第九节,ZYNQ的双核启动

ZYNQ的双核启动 1 双核运行原理 ZYNQ是一种主从关系的AMP架构&#xff0c;通过松散耦合共享资源&#xff0c;允许两个处理器同时运行自己的操作系统或者裸机应用程序&#xff0c;在各自运行自己的程序或者系统的时候&#xff0c;可以通过共享内存进行双核之间的交互。双核启动…