mobilenet是轻量级神经网络模型,其独特之处在于将普通的卷积操作变化为深度分离卷积操作,使其在参数数量和计算量上都大大减少,从而适用于一些性能不是很好的机器(精度略微降低,但是运行速度明显提升)。mobilenet_v1和mobilenet_v2都有创新的地方,我也在学习中。感兴趣的朋友可以看看这篇博客https://blog.csdn.net/u011974639/article/details/79199306,https://blog.csdn.net/u011995719/article/details/79135818作者写的很详细。所以我这里只写一下深度分离卷积和普通卷积的具体区别,方便理解。
先看普通卷积:对于一张8x8的RGB三通道图,对其做卷积核3x3的卷积,步长为1,使用5个卷积核,输出结果是6x6x5。具体的操作是:R、G、B通道分别于卷积核1做卷积操作,然后将三个通道的值相加,输出一个特征图。5和卷积核就得到5个特征图。普通卷积会把输入的各个通道的信息整合在一起。
再来看深度分离卷积:第一步深度卷积(depthwise convolution),对于一张8x8的RGB三通道图,先用3个卷积核分别对R、G、B三个通道做卷积,需要注意的是,这里一个卷积核只处理一个通道,不像普通卷积那样,一个卷积核处理三个通道。深度卷积的输出是6x6x3。第二步逐点卷积(pointwise convolution),这里的输入就是深度卷积的输出:6x6x3。然后使用5个卷积核做1x1的卷积操作,这里的卷积操作和普通的卷积操作没区别,只是卷积核尺寸变为1x1。这么做的目的就是将之前三个通道的结果整合在一起,使得最后的输出为6x6x5。至于1x1卷积核,还有一个非常重要的作用:改变数据维度。
说完这些,下面上训练代码:
# conding=utf-8
import tensorflow as tf
from datetime import datetime
from mobilenet_v2 import mobilenetv2
batch_size = 64
lr = 0.001
n_cls = 2
max_steps = 10000
def read_and_decode(filename):
#根据文件名生成一个队列
filename_queue =