使用TensorFlow构建MobileNet

磐创AI 2021-12-15

tensorflowkerastext-indent

1076 字丨阅读本文需 6 分钟

在此之前,我已经讨论了MobileNet的体系结构

接下来,我们将看到如何使用TensorFlow从头开始实现这个架构。

实现:

MobileNet架构:

图显示了我们将在代码中实现的MobileNet体系结构。网络从Conv、BatchNorm、ReLU块开始,并从其上跟随多个MobileNet块。它最终以一个平均池和一个完全连接的层结束,并激活Softmax。

我们看到该体系结构有一个模式——Conv-dw/s1,后跟Conv/s1,依此类推。这里dw是深度层和步幅数,然后是Conv层和步幅数。这两条线是MobileNet区块。

“Filter Shape”列给出了核大小和要使用的滤波器数量的详细信息。列的最后一个数字表示滤波器的数量。我们看到滤波器数量从32逐渐增加到64,从64逐渐增加到128,从128逐渐增加到256,以此类推。

最后一列显示了随着我们深入网络,图像的大小是如何变化的。输入大小选择为224*224像素,有3个通道,输出层分类为1000类。

正常CNN架构块之间的差异(左),与MobileNet架构(右):

构建网络时需要记住的几件事:

所有层之后都是批量标准化和ReLU非线性。

与具有Conv2D层的普通CNN模型不同,MobileNet具有Depthwise  Conv层,如图所示。

工作流

从TensorFlow库导入所有必要的层

为MobileNet块编写辅助函数

构建模型的主干

使用helper函数构建模型的主要部分

导入图层

import tensorflow as tf

# 导入所有必要的层

from tensorflow.keras.layers import Input, DepthwiseConv2D

from tensorflow.keras.layers import Conv2D, BatchNormalization

from tensorflow.keras.layers import ReLU, AvgPool2D, Flatten, Dense

from tensorflow.keras import Model

Keras已经内置了一个DepthwiseConv层,所以我们不需要从头开始创建它。

MobileNet块

MobileNet块的表示

要为MobileNet块创建函数,我们需要以下步骤:

函数的输入:

a.张量(x)

b.卷积层的滤波器数量(滤波器)

c.卷积层的步长(步长)

运行:

a.应用3x3分步卷积层,然后是批量标准化层和ReLU激活

b.应用带有1x1卷积层的滤波器,然后是批量标准化层和ReLU激活

返回张量(输出)

这3个步骤在下面的代码块中实现。

# MobileNet block

def mobilnet_block (x, filters, strides):

x = DepthwiseConv2D(kernel_size = 3, strides = strides, padding = 'same')(x)

x = BatchNormalization()(x)

x = ReLU()(x)

x = Conv2D(filters = filters, kernel_size = 1, strides = 1)(x)

x = BatchNormalization()(x)

x = ReLU()(x)

return x

构建模型的主干

如图2所示,第一层为Conv/s2,滤波器形状为3x32。

模型的主干

# 模型的主干

input = Input(shape = (224,224,3))

x = Conv2D(filters = 32, kernel_size = 3, strides = 2, padding = 'same')(input)

x = BatchNormalization()(x)

x = ReLU()(x)

模型的主要部分:

# 模型的主要部分

x = mobilnet_block(x, filters = 64, strides = 1)

x = mobilnet_block(x, filters = 128, strides = 2)

x = mobilnet_block(x, filters = 128, strides = 1)

x = mobilnet_block(x, filters = 256, strides = 2)

x = mobilnet_block(x, filters = 256, strides = 1)

x = mobilnet_block(x, filters = 512, strides = 2)

for _ in range (5):

x = mobilnet_block(x, filters = 512, strides = 1)

x = mobilnet_block(x, filters = 1024, strides = 2)

x = mobilnet_block(x, filters = 1024, strides = 1)

x = AvgPool2D (pool_size = 7, strides = 1, data_format='channels_first')(x)

output = Dense (units = 1000, activation = 'softmax')(x)

model = Model(inputs=input, outputs=output)

model.summary()

模型摘要的一个片段

# 绘制模型

tf.keras.utils.plot_model(model, to_file='model.png', show_shapes=True, show_dtype=False,show_layer_names=True, rankdir='TB', expand_nested=False, dpi=96)

模型图的一个片段:

使用TensorFlow的MobileNet模型实现:

import tensorflow as tf

# 导入所有必要的层

from tensorflow.keras.layers import Input, DepthwiseConv2D

from tensorflow.keras.layers import Conv2D, BatchNormalization

from tensorflow.keras.layers import ReLU, AvgPool2D, Flatten, Dense

from tensorflow.keras import Model

# MobileNet block

def mobilnet_block (x, filters, strides):

x = DepthwiseConv2D(kernel_size = 3, strides = strides, padding = 'same')(x)

x = BatchNormalization()(x)

x = ReLU()(x)

x = Conv2D(filters = filters, kernel_size = 1, strides = 1)(x)

x = BatchNormalization()(x)

x = ReLU()(x)

return x

# 模型主干

input = Input(shape = (224,224,3))

x = Conv2D(filters = 32, kernel_size = 3, strides = 2, padding = 'same')(input)

x = BatchNormalization()(x)

x = ReLU()(x)

# 模型的主要部分

x = mobilnet_block(x, filters = 64, strides = 1)

x = mobilnet_block(x, filters = 128, strides = 2)

x = mobilnet_block(x, filters = 128, strides = 1)

x = mobilnet_block(x, filters = 256, strides = 2)

x = mobilnet_block(x, filters = 256, strides = 1)

x = mobilnet_block(x, filters = 512, strides = 2)

for _ in range (5):

x = mobilnet_block(x, filters = 512, strides = 1)

x = mobilnet_block(x, filters = 1024, strides = 2)

x = mobilnet_block(x, filters = 1024, strides = 1)

x = AvgPool2D (pool_size = 7, strides = 1, data_format='channels_first')(x)

output = Dense (units = 1000, activation = 'softmax')(x)

model = Model(inputs=input, outputs=output)

model.summary()

# 绘制模型

tf.keras.utils.plot_model(model, to_file='model.png', show_shapes=True, show_dtype=False,show_layer_names=True, rankdir='TB', expand_nested=False, dpi=96)

结论

MobileNet是最小的深度神经网络之一,它速度快、效率高,可以在没有高端GPU的设备上运行。

当使用Keras(在TensorFlow上)这样的框架时,这些网络的实现非常简单。

免责声明:凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处本网。非本网作品均来自其他媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如您发现有任何侵权内容,请依照下方联系方式进行沟通,我们将第一时间进行处理。

0赞 好资讯,需要你的鼓励
来自:磐创AI
0

参与评论

登录后参与讨论 0/1000

为你推荐

加载中...