赞
踩
- 参数数量(Params):指模型含有多少参数,直接决定模型的大小,也影响推断时对内存的占用量
- 单位通常为 M,通常参数用 float32 表示,所以
模型大小是参数数量的 4 倍左右
- 参数数量与模型大小转换示例:
10M float32 bit = 10M × 4 Byte = 40MB
- 理论计算量(FLOPs):指模型推断时需要多少计算次数
- 是 floating point operations 的缩写(注意 s 小写),可以用来
衡量算法/模型的复杂度
,这关系到算法速度,大模型的单位通常为 G(GFLOPs:10亿次浮点运算),小模型单位通常为 M- 通常只考虑乘加操作
(Multi-Adds)
的数量,而且只考虑CONV 和 FC
等参数层的计算量,忽略 BN 和 PReLU 等等。一般情况,CONV 和 FC 层也会忽略仅纯加操作
的计算量,如 bias 偏置加和 shotcut 残差加等,目前有 BN 的卷积层可以不加 bias- PS:也有用 MAC(Memory Access Cost) 表示的
- 算力:
- 计算平台倾尽全力每秒钟所能完成的浮点运算数(计算速度,fp32),单位一般为
TFLOPS(floating point of per second
- 计算公式一般为
处理器核心时钟频率 × 处理器核心数量 × 特定数据类型的指令吞吐量 × 2
,后面乘以 2 是因为乘加视作两次浮点运算- eg:NVIDIA A100 GPU 频率为
1.41GHZ
,处理器( Streaming Multiprocessors, SMs)数为108
,每个处理器 FP32 的 CUDA Cores 数量为64
,那么PeakFLOPS = 1.41*108*64*2 = 19.49TFLOPS
- 带宽(Bandwidth):
- 计算平台倾尽全力每秒所能完成的内存(CPU 内存 or GPU 显存)交换量,单位一般为
GB/s(GByte/second)
- 计算公式一般为
(内存核心时钟频率 × 2) × (内存位宽 / 8) × 通道数
,内存频率乘以 2 是因为一个时钟周期传输 2 bit 数据(上升沿和下降沿各传送一次);内存位宽的单位为 bit,除以 8 转换为 Byte;现在的内存条一般通道数为 2- eg:某相机芯片带宽:
(2000MHZ × 2) × (32 / 8) × 2 = 32GB/s
,NVIDIA A100 带宽:(1215MHZ × 2) × (5120 / 8) × 1 = 1555.2GB/s
- 吞吐量(Throughput): 传输系统在单位时间内成功传输的数据量,通常以每秒传输的数据量(比特/秒或字节/秒)来表示。吞吐量越高,表示系统在单位时间内能够实际处理的数据量越大。
- 延迟(Latency): 指完成一个操作或任务所需的时间。它通常衡量的是单个操作的响应时间,从请求发出到接收到结果的时间间隔。延迟越低,表示系统响应更快。
假设卷积核大小为 K h × K w K_h \times K_w Kh×Kw,输入通道数为 C i n C_{in} Cin,输出通道数为 C o u t C_{out} Cout,输出特征图的宽和高分别为 W W W 和 H H H,这里忽略偏置项
CONV 标准卷积层:
- Params: K h × K w × C i n × C o u t K_h \times K_w \times C_{in} \times C_{out} Kh×Kw×Cin×Cout
- FLOPs: K h × K w × C i n × C o u t × H × W = p a r a m s × H × W K_h \times K_w \times C_{in} \times C_{out} \times H \times W = params \times H \times W Kh×Kw×Cin×Cout×H×W=params×H×W
FC 全连接层(相当于 k=1):
- Params: C i n × C o u t C_{in} \times C_{out} Cin×Cout
- FLOPs: C i n × C o u t C_{in} \times C_{out} Cin×Cout
一种
维度为in_channels
的卷积核进行特征提取(没有进行特征组合)output_channels 种
维度为in_channels
1*1 的卷积核进行特征组合,普通卷积不同 depth 层的权重是按照 1:1:1…:1的比例进行相加的,而在这里不同 depth 层的权重是按照 不同比例(可学习的参数) 进行相加的p1 = F*F*in_channels*output_channels
变为了p2 = F*F*in_channels*1 + 1*1*in_channels*output_channels
,减小为原来的p2/p1 = 1/output_channels + 1/F*F
,其中 F 为卷积核的尺寸,若
F
=
3
F = 3
F=3,参数量大约会减少到原来的
1
/
8
→
1
/
9
1/8 \to 1/9
1/8→1/9CONV/s2
(步进2的卷积)代替 MaxPool+CONV
:使得参数数量不变,计算量变为原来的 1/4 左右,且省去了MaxPool 的计算量信息流通不畅
,即输出的 feature map 仅包含输入的 feature map 的一部分
,在这里,MobileNet 采用了 point-wise(1*1) convolution 帮助信息在通道之间流通tf.nn.separable_conv2d()
来实现, 参数depthwise_filter
中的 channel_multiplier 设为 1
即可# 使用 slim 来实现 def _depthwise_separable_conv(inputs, num_pwc_filters, kernel_width, phase, sc, padding='SAME', width_multiplier=1, downsample=False): """ Helper function to build the depth-wise separable convolution layer. """ num_pwc_filters = round(num_pwc_filters * width_multiplier) _stride = 2 if downsample else 1 # skip pointwise by setting num_outputs=None depthwise_conv = slim.separable_convolution2d(inputs, num_outputs=None, stride=_stride, depth_multiplier=1, kernel_size=[kernel_width, kernel_width], padding=padding, activation_fn=None, scope=sc + '/depthwise_conv') bn = slim.batch_norm(depthwise_conv, activation_fn=tf.nn.relu, is_training=phase, scope=sc + '/dw_batch_norm') pointwise_conv = slim.convolution2d(bn, num_pwc_filters, kernel_size=[1, 1], activation_fn=None, scope=sc + '/pointwise_conv') bn = slim.batch_norm(pointwise_conv, activation_fn=tf.nn.relu, is_training=phase, scope=sc + '/pw_batch_norm') return bn
DepthwiseConv
层便是经过卷积优化后的,老版本的 cudnn 要在 group
下面设置 engine: CAFFE
Inverted Residuals
)Linear Bottlenecks
)全卷积
的,使得模型可以适应不同尺寸的图像;使用 RELU6(最高输出为 6)
激活函数,使得模型在低精度计算下具有更强的鲁棒性步长为 2
的卷积;小网络使用小的扩张系数(expansion factor
),大网络使用大一点的扩张系数(expansion factor),推荐是5~10,论文中
t
=
6
t = 6
t=61、CVPR 2018 高效小网络探密(上)
2、CVPR 2018 高效小网络探密(下)
3、MobileNet V2 论文初读
4、https://github.com/shicai/MobileNet-Caffe
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。