跟着专注于计算机视觉的AndyJ的妈妈我学神经网络ShuffleNet-V2

0.怕了怕了,看网络

ShuffleNet-V2,18年由旷视提出,比MobileNet更好。ECCV2018

论文地址:ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design

1.problem&motivation

使用FLOP作为计算复杂性的唯一度量是不够的,只基于FLOP度量可能会导致次优的设计结果。FLOP算是一个间接度量方法。
参考1:
间接(FLOP)和直接(速度)指标之间的差异可归因于两个主要原因。
第一, FLOP没有考虑几个对速度有相当大影响的重要因素。一个因素是存储器访问成本(MAC)。在诸如组卷积的某些操作中,这些成本占了很大一部分的运行时间。它可能是具有强大计算能力的设备(例如GPU)的瓶颈。在网络架构设计期间,不应忽略此成本。另一个是并行化程度。在相同的FLOP下,具有高并行度的模型可能比具有低并行度的模型快得多。
第二, 运算速度取决于部署平台,具有相同FLOP的操作可能具有不同的运行时间。

通过这些观察,我们建议应该考虑两个原则来进行有效的网络架构设计。首先,应该使用直接度量(例如,速度)而不是间接度量(例如,FLOP)。其次,应在目标平台上评估直接度量指标。

2.methods

四个高效网络设计指南:

  1. 输入输出具有相同channel的时候,内存消耗是最小的。卷积层使用相同的输入输出通道数
  2. 过多的分组卷积操作会增大存储器访问成本(MAC),从而使模型速度变慢
  3. 模型中的分支数量越少,模型速度越快。减少分支以及所包含的基本单元
  4. Element-wise操作不能被忽略。减少Element-wise操作

因此,根据四个指南:
作者根据之前所提出的设计指南,在shufflenetV1的基础上进行修改,得到了shuffleNet-V2。首先,简要的回顾一下V1,看看V1的网络结构中有什么地方违反了四条设计指南,再进行修改。
其他细节看参考2,说的太详细了,我还写什么呢。做好搬运工就好了。

3.reference

参考1
参考2

4.supplement

FLOPS:floating point operations per second. 全大写,指每秒浮点运算次数,可以理解为计算的速度。是衡量硬件性能的一个指标。(硬件)
FLOPs:floating point operations. s小写,指浮点运算数,理解为计算量。可以用来衡量算法/模型的复杂度。(模型) 在论文中常用GFLOPs(1 GFLOPs = 10^9 FLOPs)

FLOPs的计算参考:参考1中提到的各种图和链接。总的来说,就是 D k D k M N D F D F D_k * D_k * M * N * D_F * D_F ,这个式子参考MobileNet里的式子。也就是(kernel size × kernel size × 输入channel × 输出 channel × 输出特征图边长 × 输出特征图边长)
(在此推荐一个神器(pytorch):torchstat,可以用来计算pytorch构建的网络的参数,空间大小,MAdd,FLOPs等指标,简单好用。)
示例:

# 求lexnet的网络的一些参数。
from torchstat import stat
import torchvision.models as models

model = model.alexnet()
stat(model, (3, 224, 224))
# 输出每层/总层的各种参数/各种指标等

5.haolehaole

猜你喜欢

转载自blog.csdn.net/mianjiong2855/article/details/107579311