MnasNet架构解析与复现-神经架构搜索

简介: 为移动设备设计卷积神经网络 (CNN) 具有挑战性,因为移动模型需要小而快,但仍要准确。尽管在所有维度上都致力于设计和改进移动 CNN,但当需要考虑如此多的架构可能性时,很难手动平衡这些权衡。在本文中,我们提出了一种**自动移动神经架构搜索 (MNAS) 方法**,该方法明确地将模型延迟纳入主要目标,以便搜索可以识别出在准确性和延迟之间取得良好折衷的模型。与之前的工作不同,延迟是通过另一个通常不准确的代理(例如 FLOPS)来考虑的,我们的方法通过在手机上执行模型来直接测量现实世界的推理延迟。为了进一步在灵活性和搜索空间大小之间取得适当的平衡,我们**提出了一种新颖的分解层次搜索空间,它鼓励整

@toc

  参考论文:MnasNet: Platform-Aware Neural Architecture Search for Mobile

  看这篇论文之前需要先去看MobileNetV1和MobileNetV2,因为里面用到了深度可分离卷积和逆残差结构。

1、摘要

  为移动设备设计卷积神经网络 (CNN) 具有挑战性,因为移动模型需要小而快,但仍要准确。尽管在所有维度上都致力于设计和改进移动 CNN,但当需要考虑如此多的架构可能性时,很难手动平衡这些权衡。在本文中,我们提出了一种自动移动神经架构搜索 (MNAS) 方法,该方法明确地将模型延迟纳入主要目标,以便搜索可以识别出在准确性和延迟之间取得良好折衷的模型。与之前的工作不同,延迟是通过另一个通常不准确的代理(例如 FLOPS)来考虑的,我们的方法通过在手机上执行模型来直接测量现实世界的推理延迟。为了进一步在灵活性和搜索空间大小之间取得适当的平衡,我们提出了一种新颖的分解层次搜索空间,它鼓励整个网络的层多样性。实验结果表明,我们的方法在多个视觉任务中始终优于最先进的移动 CNN 模型。在 ImageNet 分类任务中,我们的 MnasNet 在 Pixel 手机上实现了 75.2% 的 top-1 准确率和 78 毫秒的延迟,比 MobileNetV2 [29] 快 1.8倍,准确率高 0.5%,比 NASNet [36] 快 2.3倍, 准确度高1.2 % 。我们的 MnasNet 在 COCO 对象检测方面也比 MobileNets 实现了更好的 mAP 质量。

2、MnasNet模型的创新点

2.1 运用了多目标优化函数(兼顾速度和精度)

  给定模型 m,令 ACC(m) 表示其在目标任务上的准确度,LAT(m) 表示目标移动平台上的推理延迟,T 是目标延迟。一种常见的方法是将 T 视为硬约束,并在此约束下最大化精度:

image-20220817200138705

  但是,这种方法只能最大化单个指标,并不能提供多个帕累托最优解(相同预算下性能最优,相同性能下与预算最低)。

  我们使用定制的加权乘积方法来逼近 Pareto 最优解,优化目标定义为:

image-20220817200604035

  在 $\alpha =0,\beta =1$ 的图中,如果测量的延迟小于目标延迟 T,我们只需使用准确度作为目标值;否则,我们会严厉惩罚目标值,以阻止模型违反延迟约束。

  下图$\alpha =\beta =-0.07$ 将目标延迟 T 视为软约束,并根据测量的延迟平滑调整目标值。

image-20220817201021740

  图 3:由公式 2 定义的目标函数,假设精度 ACC(m)=0.5 和目标延迟T =80ms:(顶部)显示将延迟作为硬约束的对象值; (底部)显示了将延迟作为软约束的目标值。

image-20220817201057585

  图 6:基于等式 2 的多目标搜索结果(a)$\alpha =0,\beta =1$; (b) $\alpha =\beta =-0.07$。目标延迟为 T =75ms。上图显示了 3000 个采样模型(绿点)的帕累托曲线(蓝线);下图显示了模型延迟的直方图。

  $\alpha =0,\beta =1$,超过硬指标就会被惩罚,生成的模型更加集中

  $\alpha =\beta =-0.07$,模型搜索空间更多,搜索到更多样的速度和精度的权衡

2.2 分层的神经架构搜索空间

image-20220817201401205

  图 4 显示了我们搜索空间的基线结构。我们将 CNN 模型划分为一系列预定义的块,逐渐降低输入分辨率并增加滤波器大小,这在许多 CNN 模型中很常见。每个块都有一个相同层的列表,其操作和连接由每个块的子搜索空间确定。具体来说,块 i 的子搜索空间由以下选项组成:
  • 卷积运算ConvOp:常规卷积(conv)、深度卷积(dconv)和移动倒置瓶颈卷积[29]。
  • 卷积核大小 KernelSize:3x3、5x5。
  • 挤压和激发 [13] 比率 SERatio: 0, 0.25。(SE模块注意力机制)
  • Skip ops SkipOp:池化、残差跳跃,不跳跃。(跨层连接方式)
  • 输出滤波器大小 F $F_i$。(输出层卷积核大小)
  • 每个块 $N_i$ 的层数。(每个block块中的layer个数)

3、MnasNet与MobileNetV2性能比较

image-20220817201843440

  图 5:不同模型缩放技术的性能比较。 MnasNet 是我们的基线模型,我们使用与 MobileNetV2 相同的深度乘数和输入大小对其进行缩放。

  图 5 通过改变深度乘数和输入图像大小比较了 MnasNet 和 MobileNetV2 的模型缩放性能。当我们将深度乘数从 0.35 更改为 1.4 时,推理延迟也从 20 毫秒变为 160 毫秒。如图 5a 所示,对于每个深度乘数,我们的 MnasNet 模型始终比 MobileNetV2 获得更好的准确度。同样,我们的模型对输入大小变化也很稳健,并且在从 96 到 224 的所有输入图像大小上始终优于 MobileNetV2(精度提高高达 4.1%),如图 5b 所示。

4、MobileNet相关知识点

4.1 深度可分离卷积

  MobileNet模型基于深度可分离卷积,这是一种分解卷积的形式,将标准卷积分解为深度卷积和1*1的点卷积。对于MobileNet,深度卷积将单个滤波器应用于每个输入通道,然后,逐点卷积应用1*1卷积将输出与深度卷积相结合。

  标准卷积在一个步骤中将输入滤波并组合成一组新的输出。深度可分离卷积将标准的卷积层分解为两层来做:

  • 首先是各个通道单独做卷积运算,称之为Depthwise Convolution
  • 然后用一个1*1的标准卷积层进行各个通道间的合并,称之为Pointwise Convolution

 论文中原图如下所示

image-20220803201346429

  深度卷积处理长宽方向的信息。输入图像有多少个通道就有多少个卷积核,每个通道都用自己对应的卷积核生成一张对应的特征图。输入和输出的通道数相同

  逐点卷积处理跨通道方向的信息。采用的是普通卷积的方法,只不过卷积核size只有1*1。一个卷积核负责所有的通道,滑动过程中对应像素值相乘再相加,输出特征图个数由卷积核个数决定。

img

4.2 逆残差结构

image-20220804161835593

  普通残差是先使用1*1卷积降维,再进行3*3卷积,最后使用1*1卷积升维(两边厚,中间薄)

  逆残差块是先使用1*1卷积进行升维,然后使用3*3深度可分离卷积,最后使用1*1卷积进行降维(两边薄,中间厚)

img

img

MobileNetV2的卷积块

image-20220804162735742

  ==注意:这里只有当stride=1且输入特征矩阵与输出特征矩阵的shape相同时才能进行shortcut连接。==

5、SeNet通道注意力机制相关知识点

image-20220816114225350

  • 对输入进来的特征层进行全局平均池化。
  • 然后进行两次全连接(这两个全连接可用1*1卷积代替),第一次全连接神经元个数较少,第二次全连接神经元个数和输入特征层个数相同。
  • 在完成两次全连接之后,再取一次sigmoid讲值固定到0-1之间,此时我们获得了输入特征层每一个通道的权值(0-1之间)。
  • 在获得这个权值之后,讲这个权值与原输入特征层相乘即可。

6、MnasNet-A1架构

image-20220817202758715

  DWConv表示depthwise conv,k3x3/k5x5表示内核大小,BN是batch norm,HxWxF表示张量形状(高度、宽度、深度)

  紫色卷积块是MobileNetV1的深度可分离卷积块,绿色卷积块是MobileNetV2的逆残差结构模块,红色卷积块是添加了SE注意力机制后的逆残差结构模块。

  (a)图为通过我们的自动化方法找到的 MnasNet-A1 模型。正如预期的那样,它由整个网络中的各种层架构组成。一个有趣的观察是我们的 MnasNet 使用 3x3 和 5x5 卷积

  (d)图为MobileNetV1的深度可分离卷积块

  (c)图为MobileNetV2的逆残差块

   (b)图为加了注意力机制后的逆残差块

  MBConv6代表逆残差连接模块中1*1卷积上升通道数为原图像通道数的6倍

  MBConv6模块右侧的 x2为重复次数, 代表该模块重复两次

  与 MobileNet V2 类似,当 MBConv 模块是第一次出现时,其中 DwiseConv 的步长可以是任意的(通常是 1 或 2),但后面重复该模块时步长必须设为 1。

7、MnasNet代码复现

代码参考: MnasNet 代码复现,网络解析,附Tensorflow完整代码

MnasNet 网络原理与 Tensorflow2.0 实现(with SE module)

https://github.com/tensorflow/tpu/blob/master/models/official/mnasnet/mnasnet_models.py

https://github.com/Shathe/MNasNet-Keras-Tensorflow

import numpy as np
import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow import keras
from tensorflow.keras import layers, Model
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Conv2D, MaxPool2D, Flatten, Input
from tensorflow.keras.models import Model
from tensorflow.keras.optimizers import Adam
import matplotlib.pyplot as plt
from tensorflow.keras.callbacks import LearningRateScheduler

7.1 标准卷积模块

Conv+BN+ReLU

def conv_block(input_tensor, filters, kernel_size, stride):
    # 普通卷积+BN+激活
    x = layers.Conv2D(filters=filters,  # 卷积核个数
                      kernel_size=kernel_size,  # 卷积核size
                      strides=stride,  # 步长
                      use_bias=False,  # 有BN层就不要偏置
                      padding='same')(input_tensor)  # 步长=1时特征图size不变,步长=2时特征图长宽减半

    x = layers.BatchNormalization()(x)  # 批标准化

    x = layers.ReLU()(x)  # relu激活函数

    return x  # 如果activation=False可以直接输出结果

7.2 DepthWise卷积

def depthwise_conv_block(input_tensor, kernel_size, stride):
    # 深度卷积只处理长宽方向的空间信息,输入输出的通道数相同
    x = layers.DepthwiseConv2D(kernel_size=kernel_size,  # 卷积核size
                               strides=stride,  # 步长
                               use_bias=False,  # 有BN层不要偏置
                               padding='same')(input_tensor)  # stride=1卷积过程中size不变

    x = layers.BatchNormalization()(x)  # 批标准化

    x = layers.ReLU()(x)  # 激活函数

    return x  # 返回深度卷积的特征图,个数保持不变

7.3 PointWise卷积

def pointwise_conv_block(input_tensor, filters):
    # 1*1卷积只负责通道方向的信息融合,一个卷积核输出一张特征图
    x = layers.Conv2D(filters=filters,  # 卷积核个数,即输出特征图个数
                      kernel_size=(1, 1),  # 卷积核size=1*1,不处理长宽方向的信息
                      strides=1,  # 步长=1卷积过程中特征图size不变
                      padding='same',  # 卷积过程中size不变
                      use_bias=False)(input_tensor)  # 有BN层就不要偏置

    x = layers.BatchNormalization()(x)  # 批标准化

    # 不使用relu激活函数,线性激活
    return x

7.4 Depthwise Separable Convolution(深度可分离卷积)

深度可分离卷积== 深度卷积 + 逐点卷积

def sep_conv_block(input_tensor, kernel_size, stride, filters):
    # 深度卷积,处理长宽方向的空间信息,不关心跨通道信息
    x = depthwise_conv_block(input_tensor, kernel_size, stride)
    # 逐点卷积,处理跨通道信息,跨层信息交融
    x = pointwise_conv_block(x, filters)

    return x  # 返回深度可分离卷积输出特征图

7.5 深度可分离卷积的逆残差块

  先使用1*1卷积进行升维,然后使用3*3深度可分离卷积,最后使用1*1卷积进行降维.

  ==只有当stride=1且输入特征图与输出特征图的shape相同时才能进行shortcut连接。==

# 深度可分离卷积的逆转残差模块
# 1x1标准卷积升维N倍,然后深度卷积,再1x1逐点卷积降维
def inverted_res_block(input_tensor, expansion, kernel_size, stride, out_channel):
    # keras.backend.int_shape得到图像的shape,这里只需要最后一个维度即通道维度的大小
    in_channel = keras.backend.int_shape(input_tensor)[-1]

    # 调用自定义的标准卷积函数,上升通道数
    x = conv_block(input_tensor,  # 输入特征图
                   kernel_size=(1, 1),  # 卷积核size
                   filters=in_channel * expansion,  # 通道上升为原来的expansion倍
                   stride=1)

    # 调用自定义的深度卷积函数
    x = depthwise_conv_block(x, kernel_size=kernel_size, stride=stride)

    # 调用自定义的逐点卷积函数,下降通道数
    x = pointwise_conv_block(x, filters=out_channel)  # out_channel输出特征图数量

    # 如果步长=1,并且输入和输出的shape相同时,输入和输出残差连接
    if stride == 1 and input_tensor.shape == x.shape:
        output = layers.Add()([input_tensor, x])
        return output

    # 如果步长=2,直接输出逐点卷积后的结果
    else:
        return x

7.6 SENet注意力机制

# SENet注意力机制模块
# 定义压缩和激活方法SE
def squeeze_excitation(input_tensor):
    inputs = input_tensor  # 将特征图复制一份
    squeeze = inputs.shape[-1] / 2  # 将特征图在通道维度上平分成两份,即压缩量为原通道的1/2
    excitation = inputs.shape[-1]  # 通道上升到原通道数大小

    # 如:[416,416,24]==>[None,24]
    x = layers.GlobalAveragePooling2D()(input_tensor)  # 全局平均池化
    # 如:[None,24]==>[None,12]
    x = layers.Dense(squeeze)(x)  # 全连接层,通道数减半
    # 激活函数,shape不变
    x = layers.ReLU()(x)
    # 如:[None,12]==>[None,24]
    x = layers.Dense(excitation)(x)  # 全连接层,通道数回升至原来
    # 激活函数,shape不变
    x = tf.nn.sigmoid(x)
    # 如:[None,24]==>[1,1,24]
    x = layers.Reshape(target_shape=(1, 1, excitation))(x)
    # [416,416,24]*[1,1,24]==>[416,416,24]
    # 点乘,元素之间相乘,shape不变(直接用*也代表点乘)
    output = layers.Multiply()([inputs, x])
    return output

7.7 添加了SE注意力机制后的逆残差块

  先1*1卷积升维;然后在高维空间下DepthWise卷积;再通过SE注意力机制;最后1*1卷积降维(使用线性激活函数)。输入和输出shape相同时,用残差连接。

def inverted_se_res_block(input_tensor, expansion, kernel_size, stride, out_channel):
    # 就比inverted_res_block多了一个SE层,其他都一样

    # 得到输出特征图的通道数量
    in_channel = keras.backend.int_shape(input_tensor)[-1]

    # 1*1标准卷积模块,通道数上升expansion倍
    x = conv_block(input_tensor, filters=in_channel * expansion,
                   kernel_size=(1, 1), stride=1)

    # 深度卷积模块,输出的特征图的通道数不变
    x = depthwise_conv_block(x, kernel_size, stride)

    # SE模块
    x = squeeze_excitation(x)

    # 逐点卷积,1*1卷积下降通道数
    x = pointwise_conv_block(x, filters=out_channel)

    # 如果步长=1,并且输入和输出的shape相同时,需要残差连接输入和输出
    if stride == 1 and input_tensor.shape == x.shape:
        output = layers.Add()([input_tensor, x])
        return output

    # 如果步长=2,直接输出逐点卷积结果
    else:
        return x

7.8 MBConv模块

一个MBConv模块是由一个下采样模块(stride=2)和若干个基本模块(stride=1)组成

def MBConv(input_tensor, expansion, kernel_size, filters, stride, num):
    # 一个下采样模块,也可能不需要下采样
    x = inverted_res_block(input_tensor, expansion, kernel_size, stride, out_channel=filters)

    # num-1个基本模块。num代表整个MBConv模块包含几个inverted_res_block模块
    for _ in range(1, num):
        x = inverted_res_block(x, expansion, kernel_size, stride=1, out_channel=filters)

    return x  # 返回MBConv卷积块的特征图

7.9 MBConv_SE模块

def MBConv_SE(input_tensor, expansion, kernel_size, filters, stride, num):
    # 一个下采样模块,也可能不需要下采样
    x = inverted_se_res_block(input_tensor, expansion, kernel_size, stride, out_channel=filters)

    # num-1个基本模块。num代表整个MBConv模块包含几个inverted_res_block模块
    for _ in range(1, num):
        x = inverted_se_res_block(x, expansion, kernel_size, stride=1, out_channel=filters)

    return x  # 返回MBConv_SE卷积块的特征图

7.10 主干网络

def MnasNet(input_shape, classes):
    # 构建网络输入tensor
    inputs = keras.Input(shape=input_shape)

    # [224,224,3]==>[112,112,32]
    x = conv_block(inputs, 32, kernel_size=(3, 3), stride=2)
    # [112,112,32]==>[112,112,16]
    x = sep_conv_block(x, kernel_size=(3, 3), stride=1, filters=16)
    # [112,112,16]==>[56,56,24]
    x = MBConv(x, expansion=6, kernel_size=(3, 3), filters=24, stride=2, num=2)
    # [56,56,24]==>[28,28,40]
    x = MBConv_SE(x, expansion=3, kernel_size=(5, 5), filters=40, stride=2, num=3)
    # [28,28,40]==>[14,14,80]
    x = MBConv(x, expansion=6, kernel_size=(3, 3), filters=80, stride=2, num=4)
    # [14,14,80]==>[14,14,112]
    x = MBConv_SE(x, expansion=6, kernel_size=(3, 3), filters=112, stride=1, num=2)
    # [14,14,112]==>[7,7,160]
    x = MBConv_SE(x, expansion=6, kernel_size=(5, 5), filters=160, stride=2, num=3)
    # [7,7,160]==>[7,7,320]
    x = MBConv(x, expansion=6, kernel_size=(3, 3), filters=320, stride=1, num=1)

    # 再进行一次标准卷积 [7,7,320]==>[7,7,1280]
    x = conv_block(x, filters=1280, kernel_size=(1, 1), stride=1)
    # [7,7,1280]==>[None,1280]
    x = layers.GlobalAveragePooling2D()(x)
    # [None,1280]==>[None,1000]
    logits = layers.Dense(classes,activation='softmax')(x)
    # 完成网络构架
    model = Model(inputs, logits)
    return model
model = MnasNet(input_shape=[224, 224, 3], classes=17)  # 给出输入图像shape和分类数
# 查看网络结构
model.summary()
Model: "functional_1"
__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_1 (InputLayer)            [(None, 224, 224, 3) 0                                            
__________________________________________________________________________________________________
conv2d (Conv2D)                 (None, 112, 112, 32) 864         input_1[0][0]                    
__________________________________________________________________________________________________
batch_normalization (BatchNorma (None, 112, 112, 32) 128         conv2d[0][0]                     
__________________________________________________________________________________________________
re_lu (ReLU)                    (None, 112, 112, 32) 0           batch_normalization[0][0]        
__________________________________________________________________________________________________
depthwise_conv2d (DepthwiseConv (None, 112, 112, 32) 288         re_lu[0][0]                      
__________________________________________________________________________________________________
batch_normalization_1 (BatchNor (None, 112, 112, 32) 128         depthwise_conv2d[0][0]           
__________________________________________________________________________________________________
re_lu_1 (ReLU)                  (None, 112, 112, 32) 0           batch_normalization_1[0][0]      
__________________________________________________________________________________________________
conv2d_1 (Conv2D)               (None, 112, 112, 16) 512         re_lu_1[0][0]                    
__________________________________________________________________________________________________
batch_normalization_2 (BatchNor (None, 112, 112, 16) 64          conv2d_1[0][0]                   
__________________________________________________________________________________________________
conv2d_2 (Conv2D)               (None, 112, 112, 96) 1536        batch_normalization_2[0][0]      
__________________________________________________________________________________________________
batch_normalization_3 (BatchNor (None, 112, 112, 96) 384         conv2d_2[0][0]                   
__________________________________________________________________________________________________
re_lu_2 (ReLU)                  (None, 112, 112, 96) 0           batch_normalization_3[0][0]      
__________________________________________________________________________________________________
depthwise_conv2d_1 (DepthwiseCo (None, 56, 56, 96)   864         re_lu_2[0][0]                    
__________________________________________________________________________________________________
batch_normalization_4 (BatchNor (None, 56, 56, 96)   384         depthwise_conv2d_1[0][0]         
__________________________________________________________________________________________________
re_lu_3 (ReLU)                  (None, 56, 56, 96)   0           batch_normalization_4[0][0]      
__________________________________________________________________________________________________
conv2d_3 (Conv2D)               (None, 56, 56, 24)   2304        re_lu_3[0][0]                    
__________________________________________________________________________________________________
batch_normalization_5 (BatchNor (None, 56, 56, 24)   96          conv2d_3[0][0]                   
__________________________________________________________________________________________________
conv2d_4 (Conv2D)               (None, 56, 56, 144)  3456        batch_normalization_5[0][0]      
__________________________________________________________________________________________________
batch_normalization_6 (BatchNor (None, 56, 56, 144)  576         conv2d_4[0][0]                   
__________________________________________________________________________________________________
re_lu_4 (ReLU)                  (None, 56, 56, 144)  0           batch_normalization_6[0][0]      
__________________________________________________________________________________________________
depthwise_conv2d_2 (DepthwiseCo (None, 56, 56, 144)  1296        re_lu_4[0][0]                    
__________________________________________________________________________________________________
batch_normalization_7 (BatchNor (None, 56, 56, 144)  576         depthwise_conv2d_2[0][0]         
__________________________________________________________________________________________________
re_lu_5 (ReLU)                  (None, 56, 56, 144)  0           batch_normalization_7[0][0]      
__________________________________________________________________________________________________
conv2d_5 (Conv2D)               (None, 56, 56, 24)   3456        re_lu_5[0][0]                    
__________________________________________________________________________________________________
batch_normalization_8 (BatchNor (None, 56, 56, 24)   96          conv2d_5[0][0]                   
__________________________________________________________________________________________________
conv2d_6 (Conv2D)               (None, 56, 56, 72)   1728        batch_normalization_8[0][0]      
__________________________________________________________________________________________________
batch_normalization_9 (BatchNor (None, 56, 56, 72)   288         conv2d_6[0][0]                   
__________________________________________________________________________________________________
re_lu_6 (ReLU)                  (None, 56, 56, 72)   0           batch_normalization_9[0][0]      
__________________________________________________________________________________________________
depthwise_conv2d_3 (DepthwiseCo (None, 28, 28, 72)   1800        re_lu_6[0][0]                    
__________________________________________________________________________________________________
batch_normalization_10 (BatchNo (None, 28, 28, 72)   288         depthwise_conv2d_3[0][0]         
__________________________________________________________________________________________________
re_lu_7 (ReLU)                  (None, 28, 28, 72)   0           batch_normalization_10[0][0]     
__________________________________________________________________________________________________
global_average_pooling2d (Globa (None, 72)           0           re_lu_7[0][0]                    
__________________________________________________________________________________________________
dense (Dense)                   (None, 36)           2628        global_average_pooling2d[0][0]   
__________________________________________________________________________________________________
re_lu_8 (ReLU)                  (None, 36)           0           dense[0][0]                      
__________________________________________________________________________________________________
dense_1 (Dense)                 (None, 72)           2664        re_lu_8[0][0]                    
__________________________________________________________________________________________________
tf_op_layer_Sigmoid (TensorFlow [(None, 72)]         0           dense_1[0][0]                    
__________________________________________________________________________________________________
reshape (Reshape)               (None, 1, 1, 72)     0           tf_op_layer_Sigmoid[0][0]        
__________________________________________________________________________________________________
multiply (Multiply)             (None, 28, 28, 72)   0           re_lu_7[0][0]                    
                                                                 reshape[0][0]                    
__________________________________________________________________________________________________
conv2d_7 (Conv2D)               (None, 28, 28, 40)   2880        multiply[0][0]                   
__________________________________________________________________________________________________
batch_normalization_11 (BatchNo (None, 28, 28, 40)   160         conv2d_7[0][0]                   
__________________________________________________________________________________________________
conv2d_8 (Conv2D)               (None, 28, 28, 120)  4800        batch_normalization_11[0][0]     
__________________________________________________________________________________________________
batch_normalization_12 (BatchNo (None, 28, 28, 120)  480         conv2d_8[0][0]                   
__________________________________________________________________________________________________
re_lu_9 (ReLU)                  (None, 28, 28, 120)  0           batch_normalization_12[0][0]     
__________________________________________________________________________________________________
depthwise_conv2d_4 (DepthwiseCo (None, 28, 28, 120)  3000        re_lu_9[0][0]                    
__________________________________________________________________________________________________
batch_normalization_13 (BatchNo (None, 28, 28, 120)  480         depthwise_conv2d_4[0][0]         
__________________________________________________________________________________________________
re_lu_10 (ReLU)                 (None, 28, 28, 120)  0           batch_normalization_13[0][0]     
__________________________________________________________________________________________________
global_average_pooling2d_1 (Glo (None, 120)          0           re_lu_10[0][0]                   
__________________________________________________________________________________________________
dense_2 (Dense)                 (None, 60)           7260        global_average_pooling2d_1[0][0] 
__________________________________________________________________________________________________
re_lu_11 (ReLU)                 (None, 60)           0           dense_2[0][0]                    
__________________________________________________________________________________________________
dense_3 (Dense)                 (None, 120)          7320        re_lu_11[0][0]                   
__________________________________________________________________________________________________
tf_op_layer_Sigmoid_1 (TensorFl [(None, 120)]        0           dense_3[0][0]                    
__________________________________________________________________________________________________
reshape_1 (Reshape)             (None, 1, 1, 120)    0           tf_op_layer_Sigmoid_1[0][0]      
__________________________________________________________________________________________________
multiply_1 (Multiply)           (None, 28, 28, 120)  0           re_lu_10[0][0]                   
                                                                 reshape_1[0][0]                  
__________________________________________________________________________________________________
conv2d_9 (Conv2D)               (None, 28, 28, 40)   4800        multiply_1[0][0]                 
__________________________________________________________________________________________________
batch_normalization_14 (BatchNo (None, 28, 28, 40)   160         conv2d_9[0][0]                   
__________________________________________________________________________________________________
conv2d_10 (Conv2D)              (None, 28, 28, 120)  4800        batch_normalization_14[0][0]     
__________________________________________________________________________________________________
batch_normalization_15 (BatchNo (None, 28, 28, 120)  480         conv2d_10[0][0]                  
__________________________________________________________________________________________________
re_lu_12 (ReLU)                 (None, 28, 28, 120)  0           batch_normalization_15[0][0]     
__________________________________________________________________________________________________
depthwise_conv2d_5 (DepthwiseCo (None, 28, 28, 120)  3000        re_lu_12[0][0]                   
__________________________________________________________________________________________________
batch_normalization_16 (BatchNo (None, 28, 28, 120)  480         depthwise_conv2d_5[0][0]         
__________________________________________________________________________________________________
re_lu_13 (ReLU)                 (None, 28, 28, 120)  0           batch_normalization_16[0][0]     
__________________________________________________________________________________________________
global_average_pooling2d_2 (Glo (None, 120)          0           re_lu_13[0][0]                   
__________________________________________________________________________________________________
dense_4 (Dense)                 (None, 60)           7260        global_average_pooling2d_2[0][0] 
__________________________________________________________________________________________________
re_lu_14 (ReLU)                 (None, 60)           0           dense_4[0][0]                    
__________________________________________________________________________________________________
dense_5 (Dense)                 (None, 120)          7320        re_lu_14[0][0]                   
__________________________________________________________________________________________________
tf_op_layer_Sigmoid_2 (TensorFl [(None, 120)]        0           dense_5[0][0]                    
__________________________________________________________________________________________________
reshape_2 (Reshape)             (None, 1, 1, 120)    0           tf_op_layer_Sigmoid_2[0][0]      
__________________________________________________________________________________________________
multiply_2 (Multiply)           (None, 28, 28, 120)  0           re_lu_13[0][0]                   
                                                                 reshape_2[0][0]                  
__________________________________________________________________________________________________
conv2d_11 (Conv2D)              (None, 28, 28, 40)   4800        multiply_2[0][0]                 
__________________________________________________________________________________________________
batch_normalization_17 (BatchNo (None, 28, 28, 40)   160         conv2d_11[0][0]                  
__________________________________________________________________________________________________
conv2d_12 (Conv2D)              (None, 28, 28, 240)  9600        batch_normalization_17[0][0]     
__________________________________________________________________________________________________
batch_normalization_18 (BatchNo (None, 28, 28, 240)  960         conv2d_12[0][0]                  
__________________________________________________________________________________________________
re_lu_15 (ReLU)                 (None, 28, 28, 240)  0           batch_normalization_18[0][0]     
__________________________________________________________________________________________________
depthwise_conv2d_6 (DepthwiseCo (None, 14, 14, 240)  2160        re_lu_15[0][0]                   
__________________________________________________________________________________________________
batch_normalization_19 (BatchNo (None, 14, 14, 240)  960         depthwise_conv2d_6[0][0]         
__________________________________________________________________________________________________
re_lu_16 (ReLU)                 (None, 14, 14, 240)  0           batch_normalization_19[0][0]     
__________________________________________________________________________________________________
conv2d_13 (Conv2D)              (None, 14, 14, 80)   19200       re_lu_16[0][0]                   
__________________________________________________________________________________________________
batch_normalization_20 (BatchNo (None, 14, 14, 80)   320         conv2d_13[0][0]                  
__________________________________________________________________________________________________
conv2d_14 (Conv2D)              (None, 14, 14, 480)  38400       batch_normalization_20[0][0]     
__________________________________________________________________________________________________
batch_normalization_21 (BatchNo (None, 14, 14, 480)  1920        conv2d_14[0][0]                  
__________________________________________________________________________________________________
re_lu_17 (ReLU)                 (None, 14, 14, 480)  0           batch_normalization_21[0][0]     
__________________________________________________________________________________________________
depthwise_conv2d_7 (DepthwiseCo (None, 14, 14, 480)  4320        re_lu_17[0][0]                   
__________________________________________________________________________________________________
batch_normalization_22 (BatchNo (None, 14, 14, 480)  1920        depthwise_conv2d_7[0][0]         
__________________________________________________________________________________________________
re_lu_18 (ReLU)                 (None, 14, 14, 480)  0           batch_normalization_22[0][0]     
__________________________________________________________________________________________________
conv2d_15 (Conv2D)              (None, 14, 14, 80)   38400       re_lu_18[0][0]                   
__________________________________________________________________________________________________
batch_normalization_23 (BatchNo (None, 14, 14, 80)   320         conv2d_15[0][0]                  
__________________________________________________________________________________________________
conv2d_16 (Conv2D)              (None, 14, 14, 480)  38400       batch_normalization_23[0][0]     
__________________________________________________________________________________________________
batch_normalization_24 (BatchNo (None, 14, 14, 480)  1920        conv2d_16[0][0]                  
__________________________________________________________________________________________________
re_lu_19 (ReLU)                 (None, 14, 14, 480)  0           batch_normalization_24[0][0]     
__________________________________________________________________________________________________
depthwise_conv2d_8 (DepthwiseCo (None, 14, 14, 480)  4320        re_lu_19[0][0]                   
__________________________________________________________________________________________________
batch_normalization_25 (BatchNo (None, 14, 14, 480)  1920        depthwise_conv2d_8[0][0]         
__________________________________________________________________________________________________
re_lu_20 (ReLU)                 (None, 14, 14, 480)  0           batch_normalization_25[0][0]     
__________________________________________________________________________________________________
conv2d_17 (Conv2D)              (None, 14, 14, 80)   38400       re_lu_20[0][0]                   
__________________________________________________________________________________________________
batch_normalization_26 (BatchNo (None, 14, 14, 80)   320         conv2d_17[0][0]                  
__________________________________________________________________________________________________
conv2d_18 (Conv2D)              (None, 14, 14, 480)  38400       batch_normalization_26[0][0]     
__________________________________________________________________________________________________
batch_normalization_27 (BatchNo (None, 14, 14, 480)  1920        conv2d_18[0][0]                  
__________________________________________________________________________________________________
re_lu_21 (ReLU)                 (None, 14, 14, 480)  0           batch_normalization_27[0][0]     
__________________________________________________________________________________________________
depthwise_conv2d_9 (DepthwiseCo (None, 14, 14, 480)  4320        re_lu_21[0][0]                   
__________________________________________________________________________________________________
batch_normalization_28 (BatchNo (None, 14, 14, 480)  1920        depthwise_conv2d_9[0][0]         
__________________________________________________________________________________________________
re_lu_22 (ReLU)                 (None, 14, 14, 480)  0           batch_normalization_28[0][0]     
__________________________________________________________________________________________________
conv2d_19 (Conv2D)              (None, 14, 14, 80)   38400       re_lu_22[0][0]                   
__________________________________________________________________________________________________
batch_normalization_29 (BatchNo (None, 14, 14, 80)   320         conv2d_19[0][0]                  
__________________________________________________________________________________________________
conv2d_20 (Conv2D)              (None, 14, 14, 480)  38400       batch_normalization_29[0][0]     
__________________________________________________________________________________________________
batch_normalization_30 (BatchNo (None, 14, 14, 480)  1920        conv2d_20[0][0]                  
__________________________________________________________________________________________________
re_lu_23 (ReLU)                 (None, 14, 14, 480)  0           batch_normalization_30[0][0]     
__________________________________________________________________________________________________
depthwise_conv2d_10 (DepthwiseC (None, 14, 14, 480)  4320        re_lu_23[0][0]                   
__________________________________________________________________________________________________
batch_normalization_31 (BatchNo (None, 14, 14, 480)  1920        depthwise_conv2d_10[0][0]        
__________________________________________________________________________________________________
re_lu_24 (ReLU)                 (None, 14, 14, 480)  0           batch_normalization_31[0][0]     
__________________________________________________________________________________________________
global_average_pooling2d_3 (Glo (None, 480)          0           re_lu_24[0][0]                   
__________________________________________________________________________________________________
dense_6 (Dense)                 (None, 240)          115440      global_average_pooling2d_3[0][0] 
__________________________________________________________________________________________________
re_lu_25 (ReLU)                 (None, 240)          0           dense_6[0][0]                    
__________________________________________________________________________________________________
dense_7 (Dense)                 (None, 480)          115680      re_lu_25[0][0]                   
__________________________________________________________________________________________________
tf_op_layer_Sigmoid_3 (TensorFl [(None, 480)]        0           dense_7[0][0]                    
__________________________________________________________________________________________________
reshape_3 (Reshape)             (None, 1, 1, 480)    0           tf_op_layer_Sigmoid_3[0][0]      
__________________________________________________________________________________________________
multiply_3 (Multiply)           (None, 14, 14, 480)  0           re_lu_24[0][0]                   
                                                                 reshape_3[0][0]                  
__________________________________________________________________________________________________
conv2d_21 (Conv2D)              (None, 14, 14, 112)  53760       multiply_3[0][0]                 
__________________________________________________________________________________________________
batch_normalization_32 (BatchNo (None, 14, 14, 112)  448         conv2d_21[0][0]                  
__________________________________________________________________________________________________
conv2d_22 (Conv2D)              (None, 14, 14, 672)  75264       batch_normalization_32[0][0]     
__________________________________________________________________________________________________
batch_normalization_33 (BatchNo (None, 14, 14, 672)  2688        conv2d_22[0][0]                  
__________________________________________________________________________________________________
re_lu_26 (ReLU)                 (None, 14, 14, 672)  0           batch_normalization_33[0][0]     
__________________________________________________________________________________________________
depthwise_conv2d_11 (DepthwiseC (None, 14, 14, 672)  6048        re_lu_26[0][0]                   
__________________________________________________________________________________________________
batch_normalization_34 (BatchNo (None, 14, 14, 672)  2688        depthwise_conv2d_11[0][0]        
__________________________________________________________________________________________________
re_lu_27 (ReLU)                 (None, 14, 14, 672)  0           batch_normalization_34[0][0]     
__________________________________________________________________________________________________
global_average_pooling2d_4 (Glo (None, 672)          0           re_lu_27[0][0]                   
__________________________________________________________________________________________________
dense_8 (Dense)                 (None, 336)          226128      global_average_pooling2d_4[0][0] 
__________________________________________________________________________________________________
re_lu_28 (ReLU)                 (None, 336)          0           dense_8[0][0]                    
__________________________________________________________________________________________________
dense_9 (Dense)                 (None, 672)          226464      re_lu_28[0][0]                   
__________________________________________________________________________________________________
tf_op_layer_Sigmoid_4 (TensorFl [(None, 672)]        0           dense_9[0][0]                    
__________________________________________________________________________________________________
reshape_4 (Reshape)             (None, 1, 1, 672)    0           tf_op_layer_Sigmoid_4[0][0]      
__________________________________________________________________________________________________
multiply_4 (Multiply)           (None, 14, 14, 672)  0           re_lu_27[0][0]                   
                                                                 reshape_4[0][0]                  
__________________________________________________________________________________________________
conv2d_23 (Conv2D)              (None, 14, 14, 112)  75264       multiply_4[0][0]                 
__________________________________________________________________________________________________
batch_normalization_35 (BatchNo (None, 14, 14, 112)  448         conv2d_23[0][0]                  
__________________________________________________________________________________________________
conv2d_24 (Conv2D)              (None, 14, 14, 672)  75264       batch_normalization_35[0][0]     
__________________________________________________________________________________________________
batch_normalization_36 (BatchNo (None, 14, 14, 672)  2688        conv2d_24[0][0]                  
__________________________________________________________________________________________________
re_lu_29 (ReLU)                 (None, 14, 14, 672)  0           batch_normalization_36[0][0]     
__________________________________________________________________________________________________
depthwise_conv2d_12 (DepthwiseC (None, 7, 7, 672)    16800       re_lu_29[0][0]                   
__________________________________________________________________________________________________
batch_normalization_37 (BatchNo (None, 7, 7, 672)    2688        depthwise_conv2d_12[0][0]        
__________________________________________________________________________________________________
re_lu_30 (ReLU)                 (None, 7, 7, 672)    0           batch_normalization_37[0][0]     
__________________________________________________________________________________________________
global_average_pooling2d_5 (Glo (None, 672)          0           re_lu_30[0][0]                   
__________________________________________________________________________________________________
dense_10 (Dense)                (None, 336)          226128      global_average_pooling2d_5[0][0] 
__________________________________________________________________________________________________
re_lu_31 (ReLU)                 (None, 336)          0           dense_10[0][0]                   
__________________________________________________________________________________________________
dense_11 (Dense)                (None, 672)          226464      re_lu_31[0][0]                   
__________________________________________________________________________________________________
tf_op_layer_Sigmoid_5 (TensorFl [(None, 672)]        0           dense_11[0][0]                   
__________________________________________________________________________________________________
reshape_5 (Reshape)             (None, 1, 1, 672)    0           tf_op_layer_Sigmoid_5[0][0]      
__________________________________________________________________________________________________
multiply_5 (Multiply)           (None, 7, 7, 672)    0           re_lu_30[0][0]                   
                                                                 reshape_5[0][0]                  
__________________________________________________________________________________________________
conv2d_25 (Conv2D)              (None, 7, 7, 160)    107520      multiply_5[0][0]                 
__________________________________________________________________________________________________
batch_normalization_38 (BatchNo (None, 7, 7, 160)    640         conv2d_25[0][0]                  
__________________________________________________________________________________________________
conv2d_26 (Conv2D)              (None, 7, 7, 960)    153600      batch_normalization_38[0][0]     
__________________________________________________________________________________________________
batch_normalization_39 (BatchNo (None, 7, 7, 960)    3840        conv2d_26[0][0]                  
__________________________________________________________________________________________________
re_lu_32 (ReLU)                 (None, 7, 7, 960)    0           batch_normalization_39[0][0]     
__________________________________________________________________________________________________
depthwise_conv2d_13 (DepthwiseC (None, 7, 7, 960)    24000       re_lu_32[0][0]                   
__________________________________________________________________________________________________
batch_normalization_40 (BatchNo (None, 7, 7, 960)    3840        depthwise_conv2d_13[0][0]        
__________________________________________________________________________________________________
re_lu_33 (ReLU)                 (None, 7, 7, 960)    0           batch_normalization_40[0][0]     
__________________________________________________________________________________________________
global_average_pooling2d_6 (Glo (None, 960)          0           re_lu_33[0][0]                   
__________________________________________________________________________________________________
dense_12 (Dense)                (None, 480)          461280      global_average_pooling2d_6[0][0] 
__________________________________________________________________________________________________
re_lu_34 (ReLU)                 (None, 480)          0           dense_12[0][0]                   
__________________________________________________________________________________________________
dense_13 (Dense)                (None, 960)          461760      re_lu_34[0][0]                   
__________________________________________________________________________________________________
tf_op_layer_Sigmoid_6 (TensorFl [(None, 960)]        0           dense_13[0][0]                   
__________________________________________________________________________________________________
reshape_6 (Reshape)             (None, 1, 1, 960)    0           tf_op_layer_Sigmoid_6[0][0]      
__________________________________________________________________________________________________
multiply_6 (Multiply)           (None, 7, 7, 960)    0           re_lu_33[0][0]                   
                                                                 reshape_6[0][0]                  
__________________________________________________________________________________________________
conv2d_27 (Conv2D)              (None, 7, 7, 160)    153600      multiply_6[0][0]                 
__________________________________________________________________________________________________
batch_normalization_41 (BatchNo (None, 7, 7, 160)    640         conv2d_27[0][0]                  
__________________________________________________________________________________________________
conv2d_28 (Conv2D)              (None, 7, 7, 960)    153600      batch_normalization_41[0][0]     
__________________________________________________________________________________________________
batch_normalization_42 (BatchNo (None, 7, 7, 960)    3840        conv2d_28[0][0]                  
__________________________________________________________________________________________________
re_lu_35 (ReLU)                 (None, 7, 7, 960)    0           batch_normalization_42[0][0]     
__________________________________________________________________________________________________
depthwise_conv2d_14 (DepthwiseC (None, 7, 7, 960)    24000       re_lu_35[0][0]                   
__________________________________________________________________________________________________
batch_normalization_43 (BatchNo (None, 7, 7, 960)    3840        depthwise_conv2d_14[0][0]        
__________________________________________________________________________________________________
re_lu_36 (ReLU)                 (None, 7, 7, 960)    0           batch_normalization_43[0][0]     
__________________________________________________________________________________________________
global_average_pooling2d_7 (Glo (None, 960)          0           re_lu_36[0][0]                   
__________________________________________________________________________________________________
dense_14 (Dense)                (None, 480)          461280      global_average_pooling2d_7[0][0] 
__________________________________________________________________________________________________
re_lu_37 (ReLU)                 (None, 480)          0           dense_14[0][0]                   
__________________________________________________________________________________________________
dense_15 (Dense)                (None, 960)          461760      re_lu_37[0][0]                   
__________________________________________________________________________________________________
tf_op_layer_Sigmoid_7 (TensorFl [(None, 960)]        0           dense_15[0][0]                   
__________________________________________________________________________________________________
reshape_7 (Reshape)             (None, 1, 1, 960)    0           tf_op_layer_Sigmoid_7[0][0]      
__________________________________________________________________________________________________
multiply_7 (Multiply)           (None, 7, 7, 960)    0           re_lu_36[0][0]                   
                                                                 reshape_7[0][0]                  
__________________________________________________________________________________________________
conv2d_29 (Conv2D)              (None, 7, 7, 160)    153600      multiply_7[0][0]                 
__________________________________________________________________________________________________
batch_normalization_44 (BatchNo (None, 7, 7, 160)    640         conv2d_29[0][0]                  
__________________________________________________________________________________________________
conv2d_30 (Conv2D)              (None, 7, 7, 960)    153600      batch_normalization_44[0][0]     
__________________________________________________________________________________________________
batch_normalization_45 (BatchNo (None, 7, 7, 960)    3840        conv2d_30[0][0]                  
__________________________________________________________________________________________________
re_lu_38 (ReLU)                 (None, 7, 7, 960)    0           batch_normalization_45[0][0]     
__________________________________________________________________________________________________
depthwise_conv2d_15 (DepthwiseC (None, 7, 7, 960)    8640        re_lu_38[0][0]                   
__________________________________________________________________________________________________
batch_normalization_46 (BatchNo (None, 7, 7, 960)    3840        depthwise_conv2d_15[0][0]        
__________________________________________________________________________________________________
re_lu_39 (ReLU)                 (None, 7, 7, 960)    0           batch_normalization_46[0][0]     
__________________________________________________________________________________________________
conv2d_31 (Conv2D)              (None, 7, 7, 320)    307200      re_lu_39[0][0]                   
__________________________________________________________________________________________________
batch_normalization_47 (BatchNo (None, 7, 7, 320)    1280        conv2d_31[0][0]                  
__________________________________________________________________________________________________
conv2d_32 (Conv2D)              (None, 7, 7, 1280)   409600      batch_normalization_47[0][0]     
__________________________________________________________________________________________________
batch_normalization_48 (BatchNo (None, 7, 7, 1280)   5120        conv2d_32[0][0]                  
__________________________________________________________________________________________________
re_lu_40 (ReLU)                 (None, 7, 7, 1280)   0           batch_normalization_48[0][0]     
__________________________________________________________________________________________________
global_average_pooling2d_8 (Glo (None, 1280)         0           re_lu_40[0][0]                   
__________________________________________________________________________________________________
dense_16 (Dense)                (None, 17)           21777       global_average_pooling2d_8[0][0] 
==================================================================================================
Total params: 5,420,173
Trainable params: 5,386,685
Non-trainable params: 33,488

7.11 在自定义数据集上测试

超参数

# 类别数
num_class = 17
# 批次大小
# batch_size = 32
batch_size = 32
# 周期数
epochs = 100
# 图片大小
image_size = 224

数据增强

# 训练集数据进行数据增强
train_datagen = ImageDataGenerator(
    rotation_range=20,  # 随机旋转度数
    width_shift_range=0.1,  # 随机水平平移
    height_shift_range=0.1,  # 随机竖直平移
    rescale=1 / 255,  # 数据归一化
    shear_range=10,  # 随机错切变换
    zoom_range=0.1,  # 随机放大
    horizontal_flip=True,  # 水平翻转
    brightness_range=(0.7, 1.3),  # 亮度变化
    fill_mode='nearest',  # 填充方式
)
# 测试集数据只需要归一化就可以
test_datagen = ImageDataGenerator(
    rescale=1 / 255,  # 数据归一化
)

# 训练集数据生成器,可以在训练时自动产生数据进行训练
# 从'data/train'获得训练集数据
# 获得数据后会把图片resize为image_size×image_size的大小
# generator每次会产生batch_size个数据
train_generator = train_datagen.flow_from_directory(
    '../data/train',
    target_size=(image_size, image_size),
    batch_size=batch_size,
)

# 测试集数据生成器
test_generator = test_datagen.flow_from_directory(
    '../data/test',
    target_size=(image_size, image_size),
    batch_size=batch_size,
)

image-20220817204820784

训练

# 定义优化器,loss function,训练过程中计算准确率
model.compile(optimizer=adam,loss='categorical_crossentropy',metrics=['accuracy'])

# Tensorflow2.1版本(包括2.1)之后可以直接使用fit训练模型
# history = model.fit(x=train_generator,epochs=epochs,validation_data=test_generator,callbacks=callbacks)
history = model.fit(x=train_generator,epochs=epochs,validation_data=test_generator)
Epoch 1/100
 2/34 [>.............................] - ETA: 2s - loss: 2.9870 - accuracy: 0.0469WARNING:tensorflow:Callbacks method `on_train_batch_end` is slow compared to the batch time (batch time: 0.0500s vs `on_train_batch_end` time: 0.1287s). Check your callbacks.
34/34 [==============================] - 18s 527ms/step - loss: 2.8722 - accuracy: 0.0634 - val_loss: 2.8354 - val_accuracy: 0.0588
Epoch 2/100
34/34 [==============================] - 17s 499ms/step - loss: 2.8259 - accuracy: 0.0662 - val_loss: 2.8399 - val_accuracy: 0.0588
Epoch 3/100
34/34 [==============================] - 17s 506ms/step - loss: 2.7564 - accuracy: 0.1131 - val_loss: 2.8534 - val_accuracy: 0.0588
Epoch 4/100
34/34 [==============================] - 17s 511ms/step - loss: 2.5981 - accuracy: 0.1305 - val_loss: 2.8669 - val_accuracy: 0.0588
Epoch 5/100
34/34 [==============================] - 17s 511ms/step - loss: 2.4965 - accuracy: 0.1599 - val_loss: 2.8894 - val_accuracy: 0.0588
Epoch 6/100
34/34 [==============================] - 17s 509ms/step - loss: 2.3998 - accuracy: 0.1857 - val_loss: 2.9223 - val_accuracy: 0.0588
Epoch 7/100
34/34 [==============================] - 17s 500ms/step - loss: 2.3533 - accuracy: 0.1884 - val_loss: 2.9427 - val_accuracy: 0.0588
Epoch 8/100
34/34 [==============================] - 17s 502ms/step - loss: 2.3171 - accuracy: 0.2243 - val_loss: 2.9548 - val_accuracy: 0.0588
Epoch 9/100
34/34 [==============================] - 17s 500ms/step - loss: 2.2651 - accuracy: 0.2417 - val_loss: 2.9753 - val_accuracy: 0.0588
Epoch 10/100
34/34 [==============================] - 17s 497ms/step - loss: 2.2145 - accuracy: 0.2426 - val_loss: 2.9968 - val_accuracy: 0.0588
Epoch 11/100
34/34 [==============================] - 17s 498ms/step - loss: 2.1915 - accuracy: 0.2638 - val_loss: 2.9856 - val_accuracy: 0.0588
Epoch 12/100
34/34 [==============================] - 17s 498ms/step - loss: 2.1003 - accuracy: 0.2895 - val_loss: 3.0336 - val_accuracy: 0.0588
Epoch 13/100
34/34 [==============================] - 17s 509ms/step - loss: 2.0063 - accuracy: 0.3226 - val_loss: 3.0915 - val_accuracy: 0.0588
Epoch 14/100
34/34 [==============================] - 17s 504ms/step - loss: 2.0637 - accuracy: 0.3006 - val_loss: 3.1087 - val_accuracy: 0.0588
Epoch 15/100
34/34 [==============================] - 17s 503ms/step - loss: 1.9656 - accuracy: 0.3401 - val_loss: 3.1900 - val_accuracy: 0.0588
Epoch 16/100
34/34 [==============================] - 17s 503ms/step - loss: 1.9868 - accuracy: 0.3263 - val_loss: 3.3415 - val_accuracy: 0.0588
Epoch 17/100
34/34 [==============================] - 17s 509ms/step - loss: 1.9117 - accuracy: 0.3594 - val_loss: 3.3592 - val_accuracy: 0.0588
Epoch 18/100
34/34 [==============================] - 17s 504ms/step - loss: 1.8911 - accuracy: 0.3649 - val_loss: 3.3587 - val_accuracy: 0.0588
Epoch 19/100
34/34 [==============================] - 17s 491ms/step - loss: 1.8776 - accuracy: 0.3474 - val_loss: 3.4207 - val_accuracy: 0.0588
Epoch 20/100
34/34 [==============================] - 17s 488ms/step - loss: 1.7991 - accuracy: 0.3676 - val_loss: 3.5650 - val_accuracy: 0.0662
Epoch 21/100
34/34 [==============================] - 17s 493ms/step - loss: 1.7743 - accuracy: 0.3925 - val_loss: 3.2084 - val_accuracy: 0.1324
Epoch 22/100
34/34 [==============================] - 17s 491ms/step - loss: 1.7518 - accuracy: 0.3980 - val_loss: 2.6447 - val_accuracy: 0.1728
Epoch 23/100
34/34 [==============================] - 17s 489ms/step - loss: 1.7077 - accuracy: 0.4154 - val_loss: 2.3906 - val_accuracy: 0.2574
Epoch 24/100
34/34 [==============================] - 17s 486ms/step - loss: 1.6820 - accuracy: 0.4292 - val_loss: 2.0460 - val_accuracy: 0.3566
Epoch 25/100
34/34 [==============================] - 17s 491ms/step - loss: 1.6869 - accuracy: 0.4127 - val_loss: 1.9796 - val_accuracy: 0.3676
Epoch 26/100
34/34 [==============================] - 16s 485ms/step - loss: 1.5845 - accuracy: 0.4559 - val_loss: 1.9279 - val_accuracy: 0.3897
Epoch 27/100
34/34 [==============================] - 17s 491ms/step - loss: 1.5282 - accuracy: 0.4890 - val_loss: 2.0264 - val_accuracy: 0.3566
Epoch 28/100
34/34 [==============================] - 17s 492ms/step - loss: 1.5917 - accuracy: 0.4642 - val_loss: 1.8973 - val_accuracy: 0.3419
Epoch 29/100
34/34 [==============================] - 17s 495ms/step - loss: 1.5310 - accuracy: 0.4678 - val_loss: 1.8007 - val_accuracy: 0.4632
Epoch 30/100
34/34 [==============================] - 16s 485ms/step - loss: 1.4880 - accuracy: 0.5119 - val_loss: 1.9558 - val_accuracy: 0.3971
Epoch 31/100
34/34 [==============================] - 17s 488ms/step - loss: 1.4860 - accuracy: 0.5028 - val_loss: 1.7672 - val_accuracy: 0.4191
Epoch 32/100
34/34 [==============================] - 17s 497ms/step - loss: 1.4346 - accuracy: 0.5138 - val_loss: 2.1088 - val_accuracy: 0.3824
Epoch 33/100
34/34 [==============================] - 17s 491ms/step - loss: 1.4465 - accuracy: 0.5046 - val_loss: 2.0722 - val_accuracy: 0.4154
Epoch 34/100
34/34 [==============================] - 17s 489ms/step - loss: 1.3273 - accuracy: 0.5395 - val_loss: 2.0420 - val_accuracy: 0.4338
Epoch 35/100
34/34 [==============================] - 17s 489ms/step - loss: 1.3493 - accuracy: 0.5395 - val_loss: 1.9769 - val_accuracy: 0.3971
Epoch 36/100
34/34 [==============================] - 17s 486ms/step - loss: 1.3733 - accuracy: 0.5239 - val_loss: 2.1695 - val_accuracy: 0.3824
Epoch 37/100
34/34 [==============================] - 17s 487ms/step - loss: 1.3781 - accuracy: 0.5276 - val_loss: 1.7586 - val_accuracy: 0.4779
Epoch 38/100
34/34 [==============================] - 17s 492ms/step - loss: 1.3091 - accuracy: 0.5487 - val_loss: 1.8473 - val_accuracy: 0.4449
Epoch 39/100
34/34 [==============================] - 17s 491ms/step - loss: 1.3003 - accuracy: 0.5607 - val_loss: 2.0912 - val_accuracy: 0.3934
Epoch 40/100
34/34 [==============================] - 17s 501ms/step - loss: 1.2221 - accuracy: 0.5772 - val_loss: 2.1785 - val_accuracy: 0.3934
Epoch 41/100
34/34 [==============================] - 17s 505ms/step - loss: 1.2124 - accuracy: 0.5818 - val_loss: 2.3705 - val_accuracy: 0.4301
Epoch 42/100
34/34 [==============================] - 17s 491ms/step - loss: 1.2762 - accuracy: 0.5671 - val_loss: 1.7983 - val_accuracy: 0.4449
Epoch 43/100
34/34 [==============================] - 17s 492ms/step - loss: 1.1704 - accuracy: 0.6149 - val_loss: 1.6400 - val_accuracy: 0.5000
Epoch 44/100
34/34 [==============================] - 17s 499ms/step - loss: 1.1593 - accuracy: 0.5965 - val_loss: 1.9943 - val_accuracy: 0.4301
Epoch 45/100
34/34 [==============================] - 17s 489ms/step - loss: 1.1553 - accuracy: 0.6085 - val_loss: 2.1941 - val_accuracy: 0.4228
Epoch 46/100
34/34 [==============================] - 17s 489ms/step - loss: 1.1740 - accuracy: 0.6112 - val_loss: 2.0605 - val_accuracy: 0.4154
Epoch 47/100
34/34 [==============================] - 17s 489ms/step - loss: 1.1131 - accuracy: 0.6195 - val_loss: 1.7374 - val_accuracy: 0.4743
Epoch 48/100
34/34 [==============================] - 17s 489ms/step - loss: 1.1111 - accuracy: 0.6167 - val_loss: 1.7429 - val_accuracy: 0.4632
Epoch 49/100
34/34 [==============================] - 17s 490ms/step - loss: 1.0426 - accuracy: 0.6388 - val_loss: 1.8401 - val_accuracy: 0.4779
Epoch 50/100
34/34 [==============================] - 16s 484ms/step - loss: 1.0550 - accuracy: 0.6314 - val_loss: 1.7339 - val_accuracy: 0.4963
Epoch 51/100
34/34 [==============================] - 17s 497ms/step - loss: 1.0068 - accuracy: 0.6498 - val_loss: 1.9905 - val_accuracy: 0.4338
Epoch 52/100
34/34 [==============================] - 17s 495ms/step - loss: 1.0351 - accuracy: 0.6581 - val_loss: 1.8905 - val_accuracy: 0.4853
Epoch 53/100
34/34 [==============================] - 17s 491ms/step - loss: 1.0137 - accuracy: 0.6425 - val_loss: 1.5692 - val_accuracy: 0.5331
Epoch 54/100
34/34 [==============================] - 17s 491ms/step - loss: 0.9911 - accuracy: 0.6608 - val_loss: 1.7748 - val_accuracy: 0.5000
Epoch 55/100
34/34 [==============================] - 17s 489ms/step - loss: 0.9270 - accuracy: 0.6783 - val_loss: 1.7582 - val_accuracy: 0.5000
Epoch 56/100
34/34 [==============================] - 17s 488ms/step - loss: 0.9049 - accuracy: 0.6875 - val_loss: 1.5708 - val_accuracy: 0.4963
Epoch 57/100
34/34 [==============================] - 17s 487ms/step - loss: 0.8564 - accuracy: 0.7077 - val_loss: 1.9574 - val_accuracy: 0.4485
Epoch 58/100
34/34 [==============================] - 16s 485ms/step - loss: 0.8824 - accuracy: 0.7096 - val_loss: 1.4882 - val_accuracy: 0.5331
Epoch 59/100
34/34 [==============================] - 17s 490ms/step - loss: 0.8536 - accuracy: 0.6976 - val_loss: 1.5576 - val_accuracy: 0.5147
Epoch 60/100
34/34 [==============================] - 17s 494ms/step - loss: 0.8716 - accuracy: 0.7132 - val_loss: 1.4218 - val_accuracy: 0.5441
Epoch 61/100
34/34 [==============================] - 17s 491ms/step - loss: 0.8252 - accuracy: 0.7022 - val_loss: 1.5433 - val_accuracy: 0.5368
Epoch 62/100
34/34 [==============================] - 17s 494ms/step - loss: 0.8118 - accuracy: 0.7160 - val_loss: 1.6055 - val_accuracy: 0.5331
Epoch 63/100
34/34 [==============================] - 17s 490ms/step - loss: 0.8222 - accuracy: 0.7059 - val_loss: 1.6364 - val_accuracy: 0.4963
Epoch 64/100
34/34 [==============================] - 17s 495ms/step - loss: 0.7907 - accuracy: 0.7417 - val_loss: 1.6590 - val_accuracy: 0.5221
Epoch 65/100
34/34 [==============================] - 17s 487ms/step - loss: 0.7372 - accuracy: 0.7509 - val_loss: 1.4631 - val_accuracy: 0.5699
Epoch 66/100
34/34 [==============================] - 17s 486ms/step - loss: 0.7243 - accuracy: 0.7693 - val_loss: 1.3263 - val_accuracy: 0.6324
Epoch 67/100
34/34 [==============================] - 17s 486ms/step - loss: 0.7166 - accuracy: 0.7583 - val_loss: 1.4515 - val_accuracy: 0.5515
Epoch 68/100
34/34 [==============================] - 17s 487ms/step - loss: 0.7351 - accuracy: 0.7399 - val_loss: 1.5351 - val_accuracy: 0.5294
Epoch 69/100
34/34 [==============================] - 17s 489ms/step - loss: 0.7209 - accuracy: 0.7482 - val_loss: 1.5974 - val_accuracy: 0.5478
Epoch 70/100
34/34 [==============================] - 17s 488ms/step - loss: 0.7007 - accuracy: 0.7711 - val_loss: 1.4905 - val_accuracy: 0.5625
Epoch 71/100
34/34 [==============================] - 17s 493ms/step - loss: 0.7097 - accuracy: 0.7684 - val_loss: 1.4627 - val_accuracy: 0.5772
Epoch 72/100
34/34 [==============================] - 16s 484ms/step - loss: 0.7270 - accuracy: 0.7381 - val_loss: 1.4361 - val_accuracy: 0.5772
Epoch 73/100
34/34 [==============================] - 16s 485ms/step - loss: 0.6925 - accuracy: 0.7454 - val_loss: 1.5836 - val_accuracy: 0.5772
Epoch 74/100
34/34 [==============================] - 17s 490ms/step - loss: 0.6579 - accuracy: 0.7767 - val_loss: 1.3095 - val_accuracy: 0.6397
Epoch 75/100
34/34 [==============================] - 16s 484ms/step - loss: 0.6713 - accuracy: 0.7711 - val_loss: 1.5228 - val_accuracy: 0.5956
Epoch 76/100
34/34 [==============================] - 17s 487ms/step - loss: 0.6101 - accuracy: 0.7877 - val_loss: 1.2876 - val_accuracy: 0.6434
Epoch 77/100
34/34 [==============================] - 17s 494ms/step - loss: 0.5969 - accuracy: 0.8024 - val_loss: 1.4905 - val_accuracy: 0.6103
Epoch 78/100
34/34 [==============================] - 17s 485ms/step - loss: 0.5962 - accuracy: 0.7969 - val_loss: 1.4315 - val_accuracy: 0.6066
Epoch 79/100
34/34 [==============================] - 17s 491ms/step - loss: 0.5144 - accuracy: 0.8235 - val_loss: 1.7321 - val_accuracy: 0.5478
Epoch 80/100
34/34 [==============================] - 17s 487ms/step - loss: 0.5598 - accuracy: 0.8143 - val_loss: 1.6919 - val_accuracy: 0.5772
Epoch 81/100
34/34 [==============================] - 17s 489ms/step - loss: 0.5220 - accuracy: 0.8235 - val_loss: 1.2872 - val_accuracy: 0.6471
Epoch 82/100
34/34 [==============================] - 17s 486ms/step - loss: 0.5223 - accuracy: 0.8180 - val_loss: 1.7068 - val_accuracy: 0.5699
Epoch 83/100
34/34 [==============================] - 17s 486ms/step - loss: 0.5560 - accuracy: 0.7950 - val_loss: 1.3098 - val_accuracy: 0.6324
Epoch 84/100
34/34 [==============================] - 17s 496ms/step - loss: 0.5417 - accuracy: 0.8290 - val_loss: 1.5687 - val_accuracy: 0.5993
Epoch 85/100
34/34 [==============================] - 17s 497ms/step - loss: 0.5142 - accuracy: 0.8189 - val_loss: 1.4660 - val_accuracy: 0.6103
Epoch 86/100
34/34 [==============================] - 17s 499ms/step - loss: 0.5485 - accuracy: 0.8107 - val_loss: 1.2894 - val_accuracy: 0.6397
Epoch 87/100
34/34 [==============================] - 17s 491ms/step - loss: 0.4548 - accuracy: 0.8493 - val_loss: 1.3272 - val_accuracy: 0.6360
Epoch 88/100
34/34 [==============================] - 17s 496ms/step - loss: 0.4498 - accuracy: 0.8465 - val_loss: 1.4847 - val_accuracy: 0.5956
Epoch 89/100
34/34 [==============================] - 17s 485ms/step - loss: 0.4742 - accuracy: 0.8281 - val_loss: 1.2164 - val_accuracy: 0.6544
Epoch 90/100
34/34 [==============================] - 17s 496ms/step - loss: 0.4438 - accuracy: 0.8548 - val_loss: 1.4722 - val_accuracy: 0.6471
Epoch 91/100
34/34 [==============================] - 16s 484ms/step - loss: 0.4693 - accuracy: 0.8373 - val_loss: 1.4707 - val_accuracy: 0.6140
Epoch 92/100
34/34 [==============================] - 17s 491ms/step - loss: 0.4496 - accuracy: 0.8373 - val_loss: 1.3028 - val_accuracy: 0.6654
Epoch 93/100
34/34 [==============================] - 17s 489ms/step - loss: 0.4185 - accuracy: 0.8585 - val_loss: 1.4897 - val_accuracy: 0.6250
Epoch 94/100
34/34 [==============================] - 17s 501ms/step - loss: 0.4458 - accuracy: 0.8364 - val_loss: 1.1078 - val_accuracy: 0.6728
Epoch 95/100
34/34 [==============================] - 17s 494ms/step - loss: 0.4002 - accuracy: 0.8603 - val_loss: 1.2185 - val_accuracy: 0.6728
Epoch 96/100
34/34 [==============================] - 17s 495ms/step - loss: 0.4170 - accuracy: 0.8456 - val_loss: 1.4954 - val_accuracy: 0.5993
Epoch 97/100
34/34 [==============================] - 17s 497ms/step - loss: 0.3647 - accuracy: 0.8686 - val_loss: 1.4924 - val_accuracy: 0.6250
Epoch 98/100
34/34 [==============================] - 17s 490ms/step - loss: 0.3660 - accuracy: 0.8768 - val_loss: 1.3445 - val_accuracy: 0.6581
Epoch 99/100
34/34 [==============================] - 17s 491ms/step - loss: 0.3648 - accuracy: 0.8750 - val_loss: 1.2317 - val_accuracy: 0.6912
Epoch 100/100
34/34 [==============================] - 17s 498ms/step - loss: 0.3714 - accuracy: 0.8824 - val_loss: 1.3951 - val_accuracy: 0.6434
  可以看到,前面几个周期,验证集的准确率都不带变的,可优化的范围很大,下去我再改改学习率试试。

  可视化acc和loss

# 显示训练集和验证集的acc和loss曲线
acc = history.history['accuracy']
val_acc = history.history['val_accuracy']
loss = history.history['loss']
val_loss = history.history['val_loss']

plt.subplot(1, 2, 1)
plt.plot(acc, label='Training Accuracy')
plt.plot(val_acc, label='Validation Accuracy')
plt.title('Training and Validation Accuracy')
plt.legend()

plt.subplot(1, 2, 2)
plt.plot(loss, label='Training Loss')
plt.plot(val_loss, label='Validation Loss')
plt.title('Training and Validation Loss')
plt.legend()
plt.show()

image-20220817205041831

   效果没有想象中的好,这次没有用迁移学习,所以精度可能低了点,这还要经过优化才能达到理想的效果。
网络架构图
在这里插入图片描述

References

Mingxing Tan, Bo Chen, Ruoming Pang, Vijay K. Vasudevan, Mark Sandler, Andrew Howard, & Quoc V. Le (2018). MnasNet: Platform-Aware Neural Architecture Search for Mobile computer vision and pattern recognition.

SENet架构-通道注意力机制

MobileNetV1架构解析

MobileNetV2架构解析

【精读AI论文】谷歌轻量化网络Mnasnet(神经架构搜索)

MnasNet 代码复现,网络解析,附Tensorflow完整代码

MnasNet 网络原理与 Tensorflow2.0 实现(with SE module)

https://github.com/tensorflow/tpu/blob/master/models/official/mnasnet/mnasnet_models.py

https://github.com/Shathe/MNasNet-Keras-Tensorflow

目录
相关文章
|
23天前
|
Linux 编译器 开发者
Linux设备树解析:桥接硬件与操作系统的关键架构
在探索Linux的庞大和复杂世界时🌌,我们经常会遇到许多关键概念和工具🛠️,它们使得Linux成为了一个强大和灵活的操作系统💪。其中,"设备树"(Device Tree)是一个不可或缺的部分🌲,尤其是在嵌入式系统🖥️和多平台硬件支持方面🔌。让我们深入了解Linux设备树是什么,它的起源,以及为什么Linux需要它🌳。
Linux设备树解析:桥接硬件与操作系统的关键架构
|
9天前
|
前端开发 Java
SpringBoot之三层架构的详细解析
SpringBoot之三层架构的详细解析
23 0
|
2月前
|
canal 消息中间件 关系型数据库
【分布式技术专题】「分布式技术架构」MySQL数据同步到Elasticsearch之N种方案解析,实现高效数据同步
【分布式技术专题】「分布式技术架构」MySQL数据同步到Elasticsearch之N种方案解析,实现高效数据同步
90 0
|
2月前
|
运维 Linux Apache
LAMP架构调优(十)——Apache禁止指定目录PHP解析与错误页面优化
LAMP架构调优(十)——Apache禁止指定目录PHP解析与错误页面优化
199 2
|
2月前
|
消息中间件 弹性计算 Kubernetes
Knative 架构解析
【2月更文挑战第29天】Knative作为构建无服务器产品的基础设施,建立在Kubernetes和Istio之上,提供从源代码到服务的编排、流量管理、自动扩缩容和事件绑定等功能,分为Build、Eventing和Serving三个模块,旨在确保编程模型的可移植性。
|
2月前
|
设计模式 存储 API
C++桥接模式大解析:轻松设计与实现高效软件架构
C++桥接模式大解析:轻松设计与实现高效软件架构
163 0
|
2天前
|
缓存 Java 开发者
10个点介绍SpringBoot3工作流程与核心组件源码解析
Spring Boot 是Java开发中100%会使用到的框架,开发者不仅要熟练使用,对其中的核心源码也要了解,正所谓知其然知其所以然,V 哥建议小伙伴们在学习的过程中,一定要去研读一下源码,这有助于你在开发中游刃有余。欢迎一起交流学习心得,一起成长。
|
3天前
|
消息中间件 缓存 前端开发
Netty消息编码及发送源码解析
Netty消息编码及发送源码解析
6 0
|
6天前
|
XML 人工智能 Java
Spring Bean名称生成规则(含源码解析、自定义Spring Bean名称方式)
Spring Bean名称生成规则(含源码解析、自定义Spring Bean名称方式)

推荐镜像

更多