使用TensorFlow构建MobileNet-600学习网
600学习网终身会员188,所有资源无秘无压缩-购买会员
在此之前,我讨论了MobileNet的架构
接下来,我们将看到如何使用TensorFlow从头开始实现这个架构。
实现:
MobileNet架构:
图显示了我们将在代码中实现的MobileNet架构。网络从Conv.BatchNorm.ReLU块开始,并遵循多个MobileNet块。它以平均池和完全连接层结束,Softmax被激活。
我们可以看到,架构有一个模式-Conv dw/s1,后跟Conv/s1,依此类推。这里dw是深度层和步幅数,后跟Conv层和步长数。这两条线是MobileNet块。
过滤器形状列提供了核心尺寸和要使用的过滤器数量的详细信息。列的最后一位数字表示过滤器的数量。我们可以看到过滤器的数量从32增加到64,从64增加到128,从128增加到256,以此类推。
最后一列显示了当我们深入网络时,图像大小是如何变化的。输入尺寸为224*224像素,有三个通道,输出层分类为1000。
普通CNN架构块(左)和MobileNet架构(右)之间的差异:
构建网络时需要记住的几点:
所有层都遵循批次标准化和ReLU非线姓。
与具有Conv2D层的普通CNN模型不同,MobileNet具有深度Conv层,如图所示。
工作流
从TensorFlow库导入所有必要的层
为MobileNet块编写辅助函数
构建模型的主干
使用助手函数构建模型的主要部分
导入图层
将张量流导入为tf
#导入所有必要的图层
从tensorflow.keras.layers导入输入,深度Conv2D
从tensorflow.keras.layers导入Conv2D,BatchNormalization
从tensorflow.keras.layers导入ReLU.AvgPool2D.Flatten.Dense
从tensorflow.keras导入模型
Keras已经内置了DepthwiseConv层,所以我们不需要从头开始创建它。
MobileNet阻止
MobileNet块的表示
要为MobileNet块创建函数,我们需要以下步骤:
功能输入:
a. 张量(x)
b. 卷积层滤波器数(滤波器)
c. 卷积层步长(步长)
功能:
a. 应用3×3逐步卷积层,然后批量标准化层和ReLU激活
b. 应用具有1×1卷积层的过滤器,然后批量标准化层和ReLU激活
返回张量(输出)
这三个步骤在下面的代码块中实现。
#MobileNet区块
def mobilnet _ block(x,过滤器,步幅):
x=深度Conv2D(内核_大小=3,步幅=步幅,填充=”相同”)(x)
x=BatchNormalization()(x)
x=ReLU()(x)
x=Conv2D(过滤器=过滤器,内核大小=1,步幅=1)(x)
x=BatchNormalization()(x)
x=ReLU()(x)
返回x
构建模型的主干
如图2所示,第一层为Conv/s2,滤波器形状为3×32。
模型的主干
#模型的主干
输入=输入(形状=(224224,3))
x=Conv2D(滤波器=32,内核大小=3,步幅=2,填充=”相同”)(输入)
x=BatchNormalization()(x)
x=ReLU()(x)
模型的主要部分:
#模型的主要部分
x=mobilnet _ block(x,过滤器=64,跨距=1)
x=mobilnet _ block(x,过滤器=128,跨距=2)
x=mobilnet _ block(x,过滤器=128,跨距=1)
x=mobilnet _ block(x,过滤器=256,跨距=2)
x=mobilnet _ block(x,过滤器=256,步幅=1)
x=mobilnet _ block(x,过滤器=512,跨距=2)
对于范围(5)中的_:
x=mobilnet _ block(x,过滤器=512,跨距=1)
x=mobilnet _ block(x,过滤器=1024,跨距=2)
x=mobilnet _ block(x,过滤器=1024,步长=1)
x=AvgPool2D(池_大小=7,步幅=1,数据_格式=’通道_第一’)(x)
输出=密集(单位=1000,激活=’softmax’)(x)
模型=模型(输入=输入,输出=输出)
模型.summary()
模型摘要的片段
#绘制模型
tf.keras.utils.plot _ model(模型,到_文件=’model.png’,显示_形状=True,显示_ dtype=False,显示_层_名称=True.rankdir=’TB’,展开_嵌套=False.dpi=96)
模型图的片段:
TensorFlow的MobileNet模型用于实现:
将张量流导入为tf
#导入所有必要的图层
从tensorflow.keras.layers导入输入,深度Conv2D
从tensorflow.keras.layers导入Conv2D,BatchNormalization
从tensorflow.keras.layers导入ReLU.AvgPool2D.Flatten.Dense
从tensorflow.keras导入模型
#MobileNet区块
def mobilnet _ block(x,过滤器,步幅):
x=深度Conv2D(内核_大小=3,步幅=步幅,填充=”相同”)(x)
x=BatchNormalization()(x)
x=ReLU()(x)
x=Conv2D(过滤器=过滤器,内核大小=1,步幅=1)(x)
x=BatchNormalization()(x)
x=ReLU()(x)
返回x
#模型主干
输入=输入(形状=(224224,3))
x=Conv2D(滤波器=32,内核大小=3,步幅=2,填充=”相同”)(输入)
x=BatchNormalization()(x)
x=ReLU()(x)
#模型的主要部分
x=mobilnet _ block(x,过滤器=64,跨距=1)
x=mobilnet _ block(x,过滤器=128,跨距=2)
x=mobilnet _ block(x,过滤器=128,跨距=1)
x=mobilnet _ block(x,过滤器=256,跨距=2)
x=mobilnet _ block(x,过滤器=256,步幅=1)
x=mobilnet _ block(x,过滤器=512,跨距=2)
对于范围(5)中的_:
x=mobilnet _ block(x,过滤器=512,跨距=1)
x=mobilnet _ block(x,过滤器=1024,跨距=2)
x=mobilnet _ block(x,过滤器=1024,步长=1)
x=AvgPool2D(池_大小=7,步幅=1,数据_格式=’通道_第一’)(x)
输出=密集(单位=1000,激活=’softmax’)(x)
模型=模型(输入=输入,输出=输出)
模型.summary()
#绘制模型
tf.keras.utils.plot _ model(模型,到_文件=’model.png’,显示_形状=True,显示_ dtype=False,显示_层_名称=True.rankdir=’TB’,展开_嵌套=False.dpi=96)
结论
MobileNet是最小的深度神经网络之一。它快速高效,可以在没有高端GPU的设备上运行。
当使用Keras(在TensorFlow上)这样的框架时,这些网络的实现非常简单。
600学习网 » 使用TensorFlow构建MobileNet-600学习网