1、MobileNet
https://www.bilibili.com/video/BV1mJ411d7dG?p=9
https://blog.csdn.net/weixin_44791964/article/details/102819915
MobileNet是一种轻量级的神经网络。其中一个重要的结构是深度可分离卷积。区别于原始的卷积操作:
原始的卷积操作当输入的shape 为:w×h×c,用n个filter进行卷积,要求filer的通道数必须是c那么输出的通道数就是n。
而对于MobileNet,当输入shape为w×h×c,输入有多少个通道数,就需要几个filter,通道数为1,对输入按通道依次进行卷积。输出c个特征图,在对特征图进行融合之前,再用n个1*1的filter对特征图进行卷积,得到通道数为n的特征。
当输如的通道数为16,filter的大小为3*3,输出的通道数为32
每一次卷积两个网络的参数个数分别为:
原始卷积网络的参数个数为16×3×3×32=4608
MobileNet参数的个数为16×3×3+16×32×1×1=656
MobileNet大大减少了参数的个数。
MobileNet能够减少网络参数的原因:
1、使用了深度可分离卷积
2、用平均池化层代替了全连接层
2、MobileNet_v2
和MobileNet网络相比, MobileNet_v2网络增加了:
- inverted_res_block
- Linear bottlenecks
代码如下:
def MobileNetV2(input_shape=[224,224,3],
alpha=1.0,
include_top=True,
classes=4):
rows = input_shape[0]
img_input = Input(shape=input_shape)
# stem部分
# 224,224,3 -> 112,112,32
first_block_filters = _make_divisible(32 * alpha, 8)
x = ZeroPadding2D(padding=correct_pad(img_input, 3),
name='Conv1_pad')(img_input)
x = Conv2D(first_block_filters,
kernel_size=3,
strides=(2, 2),
padding='valid',
use_bias=False,
name='Conv1')(x)
x = BatchNormalization(epsilon=1e-3,# 设置大于0的小浮点数,防止除数为0
momentum=0.999,# 动态均值的动量
name='bn_Conv1')(x)
x = Activation(relu6, name='Conv1_relu')(x)# ReLU6最大值为6
# 112,112,32 -> 112,112,16
x = _inverted_res_block(x, filters=16, alpha=alpha, stride=1,
expansion=1, block_id=0)
# 112,112,16 -> 56,56,24
x = _inverted_res_block(x, filters=24, alpha=alpha, stride=