Mobilenet_v2 是一个十分常用的轻量级网络,很多人直接使用的时候会忽略有两个参数 alpha和depth_multiplier,这两个参数也控制着网络的结构,那么这两个参数什么意思?
首先看下Mobilenet_v1中提到的可分离深度卷积,该卷积可以分为两部分:depth_wise卷积 and point_wise卷积,这两个参数也就对应着这两个卷积。
# 1、先进行 depth_wise 卷积
x = DepthwiseConv2D((3, 3),
padding='same',
depth_multiplier=depth_multiplier,
strides=strides,
use_bias=False,
name='conv_dw' % block_id)(inputs)
x = BatchNormalization(axis=channel_axis, name='bn' % block_id)(x)
x = Activation(relu6, name='relu' % block_id)(x)
# 2、再进行 point_wise 卷积
x = Conv2D(pointwise_conv_filters, (1, 1),
padding='same',
use_bias=False,
strides=(1, 1),
name='conv_pw_1' % block_id)(x)
x = BatchNormalization(axis=channel_axis, name='conv_pw_bn' % block_id)(x)
x = Activation(relu6, name='conv_pw_relu' % block_id)(x)
depth_multiplier:
对应着 depth_wise卷积过程,比如输入的图片是Dk*Dk*M(Dk是图片大小,M是输入的通道数),那么有M个Dw*Dw的卷积核,分别去跟M个渠道进行卷积,输出Df*Df*M结果,(上述只是该处标准的深度卷积网络,实际上的是有可能有n个M*Dw*Dw的卷积核,卷积之后的输出为Df*Df*(m*n))所以这里的 n 就对应着 depth_multiplier,主要的作用还是改变输出的通道数。
alpha:
对Df*Df*M进行卷积合并,有1*1*N的卷积核,进行合并常规的卷积,输出Df*Df*N的结果,上述是标准的 point_wise卷积,那么alpha怎么使用?只需要对上述进行改变:对Df*Df*M进行卷积,1*1*(N*alpha)的卷积核,输出为Df*Df*(N*alpha)