使用TensorFlow从头开始实现这个架构
在此之前,我已经讨论了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()
模型摘要的一个片段
-
西部数据领先数据基础架构 推动车载存储技术发展
2021-10-09 -
基于大数据智能控制一体化平台架构的智慧监盘关键技术研究
2021-09-01 -
什么样的存储架构能满足开放计算时代企业的需求?
2021-07-30 -
麒麟信安:“一云多芯” 让国产操作系统更“好用”
2021-07-20 -
德国莱茵TÜV:集中式跟踪器架构可以减少LCOE
2021-07-15 -
AnyShare低代码架构化解难题
2021-07-12 -
“智能湖仓”架构如何让初创企业做到全球领先?
2021-07-07 -
ARM新架构发布:大核性能飙升
2021-05-26