shuffleNet之原理及tensorflow实现

10 篇文章 0 订阅
3 篇文章 3 订阅

为了解决常规模型过大且计算量过大,除了出现mobilenet属于轻量级网络,shuffleNet同样也为新型的轻量级网络,shuffleNet主要由group convolution跟channel shuffle两部分组成.

Group convolution:

对于常规卷积,假如输入Dk*Dk*m的tensor,使用n个大小为Dw*Dw的卷积核进行卷积,输出Dk*Dk*n的tensor.

而对于分组卷积,我们对输入的Dk*Dk*m进行按channel切分分成s份,每份大小为Dk*Dk*m/s,,然后将n个大小为Dw*Dw的卷积核也平均分成s份.每份拥有n/s个卷积核,分别与s份输入tensor进行卷积.每一份都分别卷积都输出Dk*Dk*n/s的tensor,再将s份Dk*Dk*n/s进行channel的concat,最终得出Dk*Dk*n的tensor.

对比与常规卷积的参数大小: Dw*Dw*m*n

而对于分组卷积的参数大小: Dw*Dw*m/s * n/s *s = Dw*Dw*m*n/s ,比原来缩小了s倍.

具体的卷积图可参考如下:

常规卷积:

分组卷积:

 

Channel shuffle:

因为groupconvolution会导致channel具有局部性,这样对模型的泛化能力有点弱,影响模型的准确率,因此加入channel shuffle,对groupconvolotion的卷积结果进行channel的shuffle,将输出的channel进行重新分组.

具体的实现图如下:

 

但channel shuffle具有以下缺点:

(1). channel shuffle需要很多的指针跳转和Memory set,这种计算操作比较耗时间.

(2). channel shuffle的shuffle规则是人定的,不是训练得出,不符合网络负反馈学习的规则.

 

shuffleNet:

shuffleNet是对resnet结构了,使用了group convolution跟channel shuffle:

图中a跟b是sufllenet_v1结构图,区别在于输出是否缩放尺寸.注意GConv(group convolution)卷积,输入跟输出的channel是一致的

图中c跟d是sufllenet_v2结构图,对比sufllenet_v1,sufllenet_v2将GConv更改回常规的Conv,c跟d的区别在于输出是否缩放尺寸,且c中加了一个channel Split,对输入的channel分割成两部分,一部分进行卷及操作,一部分直接往下走,在最后与另一部分进行cancat.

 

他人实验结果:

可以看出.

在相同的浮点数计算量的条件下做比较,shuffleNet的准确率是高于mobileNet,但速度却慢与mobileNet.

 

group convolution跟channel shuffle的tensorflow代码实现如下:

def channel_shuffle(x, num_groups):
     with tf.variable_scope('channel_shuffle'):
        n, h, w, c = x.shape.as_list()
        x_reshaped = tf.reshape(x, [-1, h, w, num_groups, c // num_groups])
        x_transposed = tf.transpose(x_reshaped, [0, 1, 2, 4, 3])
        output = tf.reshape(x_transposed, [-1, h, w, c])
        return output
    
def shuffle_conv(x, input_filters, output_filters, kernel, strides , mode , num_groups=4):
    with tf.variable_scope('shuffle_conv'):
        conv_side_layers_tmp = tf.split(x, num_groups ,3)
        conv_side_layers = []
        for layers in conv_side_layers_tmp:
             conv_side_layers.append(conv(layers, input_filters//num_groups, output_filters//num_groups, kernel, strides ))
        x = tf.concat(conv_side_layers, axis=-1)
        x = channel_shuffle(x , num_groups)
        return x

对shuffleNet的个人看法:

官方测试,在相同的条件下,shuffleNet的准确率是优于mobilenet网络.

但个人实验,group convolution操作,模型大小可以成倍数的降低,卷积效果也能媲美普通卷积,但速度,并不会因为卷积参数的减少而相同减少,主要在与无法并行化计算,出现碎片化,时间耗时基本与常用卷积基本持平.所以在shuffleNet-V2放弃group convolution操作,只进行分组,类似于残差模块。

 

 

### 回答1: ShuffleNet是一种轻量级的卷积神经网络,主要用于图像分类和目标检测任务。它的设计原理是通过通道重排和组卷积来减少计算量,降低模型复杂度,同时保持较高的精度。 具体来说,ShuffleNet的主要思想是将输入的特征图分成若干个组,并对每个组进行卷积操作。然后将每个组的输出进行通道重排,把不同组的通道混合在一起,再进行下一轮的卷积操作。这样可以减少模型的参数量和计算量,同时保证了较高的精度。 ShuffleNet的核心组件是ShuffleBlock,它包含了分组卷积、通道重排和ResNet中的残差连接。分组卷积将输入的特征图分成若干个组,每个组进行一次卷积操作。通道重排将每个组的输出通道进行重排,使得不同组的通道混合在一起。残差连接则保证了模型的深度和信息流通性。 总的来说,ShuffleNet通过组卷积和通道重排的方式,减少了计算量和参数量,同时保持了较高的精度。它是一种轻量级的卷积神经网络,适用于移动设备等资源受限的场景。 ### 回答2: ShuffleNet是一种轻量级的神经网络架构,主要用于进行图像分类和目标检测任务。其原理可以概括为以下几个要点: 1. 分组卷积:ShuffleNet引入了分组卷积(group convolution)的概念,将输入特征图分成多个组,每个组进行独立的卷积操作。通过这种方式,ShuffleNet减少了模型的计算量,并在一定程度上保持了模型的表达能力。 2. 逐通道混洗:为了解决分组卷积引入的信息孤立问题,ShuffleNet引入了逐通道混洗(channel shuffle)操作。在深度方向上重排特征图的通道顺序,使得每个组的特征图能够与其他组的特征图进行交互,提升了特征表达能力。 3. 基础单元:ShuffleNet的基础单元是由分组卷积、逐通道混洗和逐元素激活函数构成。该基础单元可以有效地提取图像的局部和全局特征,同时减少了网络的计算和参数量,提高了模型的效率。 4. 通道重排:为了进一步减少计算量,ShuffleNet在网络的设计中使用了通道重排(channel shuffling)操作。通过将输入通道分成若干组,并将一部分组的通道移动到另一部分组,从而减少了计算量并保持了模型的表达能力。 总的来说,ShuffleNet通过引入分组卷积、逐通道混洗、通道重排等操作,以及精心设计的基础单元,实现了轻量级网络的构建。它对模型的计算量和参数量进行了有效控制,同时能够保持较好的分类和检测性能,适用于资源受限的移动设备等场景。 ### 回答3: ShuffleNet是一种针对卷积神经网络的轻量级结构,其原理可以简要描述如下: ShuffleNet主要包括两个关键步骤:组卷积和通道重排。 首先,ShuffleNet引入了组卷积的概念。传统的卷积操作将输入特征图的每个通道分别与对应的卷积核进行卷积操作,得到输出特征图的每个通道。而组卷积则将输入特征图的通道分成若干组,每组内的通道共享同一个卷积核,然后将每组的输出特征图合并在一起。这样可以大幅减少模型的参数量和计算量,从而实现轻量级网络结构。 其次,ShuffleNet采用了通道重排技术。通道重排通过将输入特征图的通道重新排列,使得相邻的通道来自不同的组。这样可以有效增加不同组之间的信息交流,从而提高特征的表示能力和网络的性能。通道排列操作无需学习参数,并且可以利用矩阵乘法的高效实现,因此对计算量和内存开销影响较小。 综合起来,ShuffleNet通过组卷积和通道重排实现了一个轻量级的神经网络结构。该结构既能有效降低模型的参数量和计算量,又能提高特征的表示能力和网络的性能。ShuffleNet广泛应用在计算资源有限的环境中,例如移动设备和嵌入式系统中,具有较高的实用性和可移植性。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿也可以很哲学

让我尝下打赏的味道吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值