效果
EfficientNet网络在ImageNet数据集上和其它网络的准确率和模型大小图如下:
创新点
1.模型可同时在宽度、深度和图片分辨率进行参数调整,提出了组合缩放系数,相比于单方面精度提升;
2.根据算力不同,提出了B0-B7的缩放尺度;
3.利用16个Block块,交叉使用3x3和5x5的卷积核进行特征提取。
模型结构
组合缩放系数
EfficientNet使用了组合缩放系数,用单一的组合缩放系数
ϕ
\phi
ϕ,同时缩放宽度w、深度d和图片分辨率r,其缩放基数分别为
α
\alpha
α、
β
\beta
β、
γ
\gamma
γ。在约束条件下,作者发现,在Efficient-B0上最好的参数是
α
\alpha
α=1.2、
β
\beta
β=1.1、
γ
\gamma
γ=1.15。
层数depth方向的次幂为1,分辨率resolution (WxH) 和通道width(C0xC1) 方向为平方,当模型d 深度、宽度和分辨率统一缩放
ϕ
\phi
ϕ时,最终的计算量大约增加2
ϕ
\phi
ϕ。
相比单维度的参数调整,组合效果如下:
EfficientNet-B0网络结构
1.该网络结构 = 16个MBConv + 2个Conv + 1个Global average pooling + 1个FC分类层;
2.该网络利用了移动翻转瓶颈卷积(mobile inverted bottleneck convolution,MBConv)模块,还引入了压缩与激发网络(Squeeze-and-Excitation Network,SENet)的注意力思想。
网络整体结构如下:
基线B0的16个Block结构如下:
BlockArgs(kernel_size=3, num_repeat=1, input_filters=32, output_filters=16,
expand_ratio=1, id_skip=True, strides=[1, 1], se_ratio=0.25),
BlockArgs(kernel_size=3, num_repeat=2, input_filters=16, output_filters=24,
expand_ratio=6, id_skip=True, strides=[2, 2], se_ratio=0.25),
BlockArgs(kernel_size=5, num_repeat=2, input_filters=24, output_filters=40,
expand_ratio=6, id_skip=True, strides=[2, 2], se_ratio=0.25),
BlockArgs(kernel_size=3, num_repeat=3, input_filters=40, output_filters=80,
expand_ratio=6, id_skip=True, strides=[2, 2], se_ratio=0.25),
BlockArgs(kernel_size=5, num_repeat=3, input_filters=80, output_filters=112,
expand_ratio=6, id_skip=True, strides=[1, 1], se_ratio=0.25),
BlockArgs(kernel_size=5, num_repeat=4, input_filters=112, output_filters=192,
expand_ratio=6, id_skip=True, strides=[2, 2], se_ratio=0.25),
BlockArgs(kernel_size=3, num_repeat=1, input_filters=192, output_filters=320,
expand_ratio=6, id_skip=True, strides=[1, 1], se_ratio=0.25)
MBConv
移动翻转瓶颈卷积(mobile inverted bottleneck convolution,MBConv),类似于 MobileNetV2 和 MnasNet,由深度可分离卷积Depthwise Convolution和SENet构成。
每个MBConv的网络结构如下:
MBConv = 1x1升维 + Depthwise Convolution + SENet + 1x1降维 + add
SENet
该网络为压缩与激发网络(Squeeze-and-Excitation Network,SENet),即注意力机制。该思想由Momenta公司提出,并发于2017CVPR。SENet网络的创新点在于关注channel之间的关系,希望模型可以自动学习到不同channel特征的重要程度。
其中第一个FC层降维,降维系数为r,然后ReLU激活,最后的FC层恢复原始的维度。
SENet添加位置示意:
代码实现
num_reduced_filters = max(1, int(block_args.input_filters * block_args.se_ratio))
se_tensor = layers.GlobalAveragePooling2D(name=prefix + 'se_squeeze')(x)
target_shape = (1, 1, filters) if backend.image_data_format() == 'channels_last' else (filters, 1, 1)
se_tensor = layers.Reshape(target_shape, name=prefix + 'se_reshape')(se_tensor)
se_tensor = layers.Conv2D(num_reduced_filters, 1,
activation=activation,
padding='same',
use_bias=True,
kernel_initializer=CONV_KERNEL_INITIALIZER,
name=prefix + 'se_reduce')(se_tensor)
se_tensor = layers.Conv2D(filters, 1,
activation='sigmoid',
padding='same',
use_bias=True,
kernel_initializer=CONV_KERNEL_INITIALIZER,
name=prefix + 'se_expand')(se_tensor)
x = layers.multiply([x, se_tensor], name=prefix + 'se_excite')
EfficientNet系列缩放尺度
在B0网络的基础上,根据width_coefficient、depth_coefficient对Block块的参数进行缩放,其中,width_coefficient决定了filters的大小,即网络的channel;depth_coefficient决定了num_repeat的大小,即网络的深度。
从左至右分别为width, depth, resolution, dropout
'efficientnet-b0': (1.0, 1.0, 224, 0.2),
'efficientnet-b1': (1.0, 1.1, 240, 0.2),
'efficientnet-b2': (1.1, 1.2, 260, 0.3),
'efficientnet-b3': (1.2, 1.4, 300, 0.3),
'efficientnet-b4': (1.4, 1.8, 380, 0.4),
'efficientnet-b5': (1.6, 2.2, 456, 0.4),
'efficientnet-b6': (1.8, 2.6, 528, 0.5),
'efficientnet-b7': (2.0, 3.1, 600, 0.5),
EfficientNet系列表现
EfficientNet Performance Results on ImageNet