• GoogleNet架构解析


    参考论文:Going deeper with convolutions

    作者:Christian Szegedy,Wei Liu,Yangqing Jia(贾扬清,Caffe作者),Pierre Sermanet,Scott Reed,Dragomir Anguelov,Dumitru Erhan,Vincent Vanhoucke,Andrew Rabinovich

    1、GoogleNet简介

      GoogleNet 是 2014 年 ImageNet Challenge 图像识别比赛的冠军。从它的名字我们就 可以看出是来自谷歌的团队完成的。前面我们有介绍,GoogleNet 之所以获得冠军,是因为 它进行模型融合以后得到的效果要比 VGGNet 模型融合之后的效果要好。不过单模型比拼, 它与 VGGNet 的效果相当。

      虽然 GoogleNet 的模型的效果跟 VGGNet 相差不大,不过它比 VGGNet 更具有创新 性。GoogleNet 有一些更具创新性的设计,为后来的模型设计提供了很多新的思路。

    2、Inception结构

      在 GoogleNet 最特别的设计就是 Inception 结构,所以 GoogleNet 在后来的版本中改了名字,模型的名字改成了 Inception,而 GoogleNet 就是 Inception-v1。Inception 结构如下所示。

    image-20220812145518684

    或者下面这样:

    image-20220812145638199

      图中的 convolutions 表示卷积,filter concatenation 表示滤波器合并,max pooling 表示最大池化,previous layer 表示前一层。

      左边的结构是 Inception 原始的版本,右边的结构是 Inception 后来优化的 版本了。 1×1 卷积是为看了增加网络的层数以增加非线性,同时减少网络的权值数量和计算量。

      不过 Inception 最特别的设计不是在于 1×1 卷积,而是在于同时使用多种不同尺度的卷 积核。我们可以看到 Inception 结构中使用了 1×1 卷积,3×3 卷积,5×5 卷积和一个最大 池化。卷积的作用我们应该很清楚了,用来做特征提取。不同的卷积核的数值可以提取不同 的特征,那么不同大小的卷积核当然也是可以从不同的尺度来提取特征的。从一个小区域提 取出来的特征跟从一个大区域提取出来的特征当然是不一样的。所以 Inception 具有创新的 设计在于使用了多种不同尺度的卷积核来提取不同尺度的特征。

    3、Inception结构的计算

    image-20220812150011584

      图中 conv 表示卷积,pool 表示池化。

      Inception module 是从 GoogleNet 结构中拿出来的一个具体计算的例子。输入是 192 个 28×28 的特征图,Inception module 会对这些特征图进行不同的特征提取计算。假如我们把 Inception 看成是有 4 个通道的特征提取计算:

      第1 个通道就是对输入特征做 1×1,步长为 1,same padding 卷积,生成 64 个 28× 28 的特征图。

      第 2 个通道就是对输入特征做 1×1,步长为 1,same padding 卷积,生成 96 个 28× 28 的特征图。然后再做 3×3,步长为 1,same padding 卷积,生成 128 个 28×28 的特征图。

      第 3 个通道就是对输入特征做 1×1,步长为 1,same padding 卷积,生成 16 个 28× 28 的特征图。然后再做 5×5,步长为 1,same padding 卷积,生成 32 个 28×28 的特征 图。

      第 4 个通道就是对输入特征做 3×3,步长为 1,same padding 的最大池化,生成 192 个 28×28 的特征图。然后再做 1×1,步长为 1,same padding 卷积,生成 32 个 28×28 的特征图。

      最后再把这 4 个通道分别得到的特征图组合起来,得到 64+128+32+32=256 个 28× 28 的特征图。

      在 GoogleNet 中叠加了很多个 Inception 结构,使得网络的层数变得非常多,并且网络 特征提取的能力特别强。

    4、GoogleNet网络结构

    image-20220812151827074

      图中的 conv 表示卷积;MaxPool 表示最大池化;LocalRespNorm 表示局部响应归一 化;DepthConcat 表示数据拼接;FC 表示全连接层;AveragePool 表示平均池化。

       GoogleNet是一个 22 层的网络,网络的输入跟 VGGNet 一样也是 224×224。除了最后一层用的是 softmax 函数外,其它层的激活函数都 是 ReLU 函数。我们可以看到 GoogleNet 的主要结构组成是 Inception module,一共叠加 了 9 个 Inception。GoogleNet 网络的一些具体细节如下图所示。

    image-20220812150646147

      图中的 type 表示层的类型;patch size/stride 表示窗口大小/步长;output size 表示输 出大小;depth 表示深度;params 表示参数数量;ops 表示计算量;convolution 表示卷 积;max pool 表示最大池化;avg pool 表示平均池化;linear 表示全连接层。

      虽然GoogleNet 有 22 层之多,但它的权值参数数量只有 600 多万,仅约为 AlexNet 的 1/10,VGGNet 的 1/20。

      GoogleNet 的输入是 224×224×3 的彩色图片,从图中我们可以看到第一个卷积是 7×7 步长为 2,卷积后得到 64 个 112×112 的特征图。卷积后进行了一次 3×3 步长为 2 的最大 池化,得到 64 个 56×56 的特征图。

      接下来再进行一次 1×1 步长为 1 的卷积得到 64 个 56×56 的特征图,卷积后再进行 3× 3 步长为 1 的卷积,得到 192 个 56×56 的特征图。这里我们要注意,图中第 3 行的卷积, depth 为 2,说明这里是有 2 层卷积。图中的 reduce 其实是表示 1×1 卷积的意思,#3×3 reduce 表示 3×3 卷积之前的 1×1 卷积。#5×5 reduce 表示 5×5 卷积之前的 1×1 卷积。

      卷积后再进行一次 3×3 步长为 2 的最大池化,得到 192 个 28×28 的特征图。

      下面我们看到了第一个 Inception 模块 inception(3a),每个 inception 模块都有两层卷积,所以 depth 为 2。

    5、GoogleNet的平均池化设计

      我们看一下上图中倒数第 4 行“avg pool”, 这是平均池化,这个“avg pool”放在 inception(5b)后面,这里使用的“avg pool”,它的作用跟“Flatten”的作用其实类似,主要目的是把 4 维的特征图数据变成 2 维的数据,再跟后面的 1000 个分类神经元进行全连接。

      inception(5b)的输出是 1024 个 7×7 的特征图,“avg pool”窗口大小为 7×7,所以 也就是每个特征图求平均得到 1 个特征值,那么 1024 个特征图就可以提取出 1024 个特征 值,最后再跟 1000 个神经元进行全连接。GoogleNet 的论文中有提到,把“Flatten”后连 接 1024 个神经元改成“avg pool”得到 1024 个特征值,ImageNet Challenge 图像识别 比赛 Top1 准确率提高了 0.6% 。另外使用“avg pool”还可以减少模型的权值数量,因为 全连接层会产生大量权值,而池化计算是没有权值的。

    image-20220812151326254

    6、GoogleNet的辅助分类器设计

      GoogleNet 的网络有 3 个输出,中间部分的两个输出是 GoogleNet 设计的两 个辅助分类器。作者引入的两个辅助分类器也会经过 softmax 函数后输出预测结果,预测结 果跟真实标签做对比得到辅助损失 aux_loss,该模型总损失等于真实损失和辅助损失的加权 和,论文中每个辅助损失使用的权重值是 0.3,总的 loss 公式如下:
    t o t a l l o s s = r e a l l o s s + 0.3 × a u x l o s s 1 + 0.3 × a u x l o s s 2 total_{loss}=real_{loss}+0.3\times aux_{loss_1}+0.3\times aux_{loss_2} totalloss=realloss+0.3×auxloss1+0.3×auxloss2
      这两个辅助分类器的作用是增加反向传播的梯度信号,也就是说即使整个网络都是用了 ReLU 激活函数,但是网络的层的比较多(22 层),梯度信号在反向传递的过程中,还是会 损失掉一些有用的信号。 所以作者在中间层加入两个辅助分类器,帮助中间层那部分的权值 和靠近输入层那部分的权值更好的训练。

    辅助分类器只在模型训练阶段起作用,模型预测结果辅助分类器是不使用的。

      浅层的辅助分类器后面被证实没太大用处,所以作者在Inception V2/V3的论文里去掉了浅层辅助分类器

    7、模型复现

      使用Tensorflow框架复现GoogleNet模型结构,这里并没有设计辅助分类器。

    7.1 导入依赖

    import tensorflow as tf
    from tensorflow.keras.models import Model
    from tensorflow.keras.layers import *
    from tensorflow.keras.layers import AvgPool2D
    from plot_model import plot_model
    from tensorflow.keras.optimizers import Adam
    import matplotlib.pyplot as plt
    import numpy as np
    from tensorflow.keras.preprocessing.image import ImageDataGenerator
    from tensorflow.keras.callbacks import LearningRateScheduler
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    7.2 超参数设置

    # 类别数
    num_classes = 17
    # 批次大小
    batch_size = 32
    # 周期数
    epochs = 100
    # 图片大小
    image_size = 224
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    这里对17种鲜花进行分类,数据集如下:

    image-20220812152343652

      每种类别的花分别放在对应的文件夹中。

    7.3 数据增强

    # 训练集数据进行数据增强
    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,  # 数据归一化
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    7.4 数据生成器设置

    # 训练集数据生成器,可以在训练时自动产生数据进行训练
    # 从'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,
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    7.5 定义Inception结构

    # 定义Inception结构
    def Inception(x, filters):
        tower_1 = Conv2D(filters=filters[0], kernel_size=1, strides=1, padding='same', activation='relu')(x)
        tower_2 = Conv2D(filters=filters[1], kernel_size=1, strides=1, padding='same', activation='relu')(x)
        tower_2 = Conv2D(filters=filters[2], kernel_size=3, strides=1, padding='same', activation='relu')(tower_2)
        tower_3 = Conv2D(filters=filters[3], kernel_size=1, strides=1, padding='same', activation='relu')(x)
        tower_3 = Conv2D(filters=filters[4], kernel_size=5, strides=1, padding='same', activation='relu')(tower_3)
        pooling = MaxPool2D(pool_size=(3, 3), strides=1, padding='same')(x)
        pooling = Conv2D(filters=filters[5], kernel_size=1, strides=1, padding='same', activation='relu')(pooling)
        x = concatenate([tower_1, tower_2, tower_3, pooling], axis=3)
        return x
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    image-20220812152525236

    7.6 定义GoogleNet模型

    # 定义GoogleNet模型
    model_input = Input(shape=(image_size, image_size, 3))
    x = Conv2D(filters=64, kernel_size=7, strides=2, padding='same', activation='relu')(model_input)
    x = MaxPool2D(pool_size=3, strides=2, padding='same')(x)
    x = Conv2D(filters=64, kernel_size=1, strides=1, padding='same', activation='relu')(x)
    x = Conv2D(filters=192, kernel_size=3, strides=1, padding='same', activation='relu')(x)
    x = MaxPool2D(pool_size=(3, 3), strides=2, padding='same')(x)
    x = Inception(x, [64, 96, 128, 16, 32, 32])
    x = Inception(x, [128, 128, 192, 32, 96, 64])
    x = MaxPool2D(pool_size=3, strides=2, padding='same')(x)
    x = Inception(x, [192, 96, 208, 16, 48, 64])
    x = Inception(x, [160, 112, 224, 24, 64, 64])
    x = Inception(x, [128, 128, 256, 24, 64, 64])
    x = Inception(x, [112, 144, 288, 32, 64, 64])
    x = Inception(x, [256, 160, 320, 32, 128, 128])
    x = MaxPool2D(pool_size=3, strides=2, padding='same')(x)
    x = Inception(x, [256, 160, 320, 32, 128, 128])
    x = Inception(x, [384, 192, 384, 48, 128, 128])
    x = AvgPool2D(pool_size=7, strides=1)(x)
    x = Flatten()(x)
    x = Dropout(0.4)(x)
    x = Dense(num_classes, activation='softmax')(x)
    model = Model(inputs=model_input, outputs=x)
    model.summary()
    plot_model(model, to_file='img/GoogleNet.png', show_shapes=True)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    Model: "model"
    __________________________________________________________________________________________________
    Layer (type)                    Output Shape         Param #     Connected to                     
    ==================================================================================================
    input_1 (InputLayer)            [(None, 224, 224, 3) 0                                            
    __________________________________________________________________________________________________
    conv2d (Conv2D)                 (None, 112, 112, 64) 9472        input_1[0][0]                    
    __________________________________________________________________________________________________
    max_pooling2d (MaxPooling2D)    (None, 56, 56, 64)   0           conv2d[0][0]                     
    __________________________________________________________________________________________________
    conv2d_1 (Conv2D)               (None, 56, 56, 64)   4160        max_pooling2d[0][0]              
    __________________________________________________________________________________________________
    conv2d_2 (Conv2D)               (None, 56, 56, 192)  110784      conv2d_1[0][0]                   
    __________________________________________________________________________________________________
    max_pooling2d_1 (MaxPooling2D)  (None, 28, 28, 192)  0           conv2d_2[0][0]                   
    __________________________________________________________________________________________________
    conv2d_4 (Conv2D)               (None, 28, 28, 96)   18528       max_pooling2d_1[0][0]            
    __________________________________________________________________________________________________
    conv2d_6 (Conv2D)               (None, 28, 28, 16)   3088        max_pooling2d_1[0][0]            
    __________________________________________________________________________________________________
    max_pooling2d_2 (MaxPooling2D)  (None, 28, 28, 192)  0           max_pooling2d_1[0][0]            
    __________________________________________________________________________________________________
    conv2d_3 (Conv2D)               (None, 28, 28, 64)   12352       max_pooling2d_1[0][0]            
    __________________________________________________________________________________________________
    conv2d_5 (Conv2D)               (None, 28, 28, 128)  110720      conv2d_4[0][0]                   
    __________________________________________________________________________________________________
    conv2d_7 (Conv2D)               (None, 28, 28, 32)   12832       conv2d_6[0][0]                   
    __________________________________________________________________________________________________
    conv2d_8 (Conv2D)               (None, 28, 28, 32)   6176        max_pooling2d_2[0][0]            
    __________________________________________________________________________________________________
    concatenate (Concatenate)       (None, 28, 28, 256)  0           conv2d_3[0][0]                   
                                                                     conv2d_5[0][0]                   
                                                                     conv2d_7[0][0]                   
                                                                     conv2d_8[0][0]                   
    __________________________________________________________________________________________________
    conv2d_10 (Conv2D)              (None, 28, 28, 128)  32896       concatenate[0][0]                
    __________________________________________________________________________________________________
    conv2d_12 (Conv2D)              (None, 28, 28, 32)   8224        concatenate[0][0]                
    __________________________________________________________________________________________________
    max_pooling2d_3 (MaxPooling2D)  (None, 28, 28, 256)  0           concatenate[0][0]                
    __________________________________________________________________________________________________
    conv2d_9 (Conv2D)               (None, 28, 28, 128)  32896       concatenate[0][0]                
    __________________________________________________________________________________________________
    conv2d_11 (Conv2D)              (None, 28, 28, 192)  221376      conv2d_10[0][0]                  
    __________________________________________________________________________________________________
    conv2d_13 (Conv2D)              (None, 28, 28, 96)   76896       conv2d_12[0][0]                  
    __________________________________________________________________________________________________
    conv2d_14 (Conv2D)              (None, 28, 28, 64)   16448       max_pooling2d_3[0][0]            
    __________________________________________________________________________________________________
    concatenate_1 (Concatenate)     (None, 28, 28, 480)  0           conv2d_9[0][0]                   
                                                                     conv2d_11[0][0]                  
                                                                     conv2d_13[0][0]                  
                                                                     conv2d_14[0][0]                  
    __________________________________________________________________________________________________
    max_pooling2d_4 (MaxPooling2D)  (None, 14, 14, 480)  0           concatenate_1[0][0]              
    __________________________________________________________________________________________________
    conv2d_16 (Conv2D)              (None, 14, 14, 96)   46176       max_pooling2d_4[0][0]            
    __________________________________________________________________________________________________
    conv2d_18 (Conv2D)              (None, 14, 14, 16)   7696        max_pooling2d_4[0][0]            
    __________________________________________________________________________________________________
    max_pooling2d_5 (MaxPooling2D)  (None, 14, 14, 480)  0           max_pooling2d_4[0][0]            
    __________________________________________________________________________________________________
    conv2d_15 (Conv2D)              (None, 14, 14, 192)  92352       max_pooling2d_4[0][0]            
    __________________________________________________________________________________________________
    conv2d_17 (Conv2D)              (None, 14, 14, 208)  179920      conv2d_16[0][0]                  
    __________________________________________________________________________________________________
    conv2d_19 (Conv2D)              (None, 14, 14, 48)   19248       conv2d_18[0][0]                  
    __________________________________________________________________________________________________
    conv2d_20 (Conv2D)              (None, 14, 14, 64)   30784       max_pooling2d_5[0][0]            
    __________________________________________________________________________________________________
    concatenate_2 (Concatenate)     (None, 14, 14, 512)  0           conv2d_15[0][0]                  
                                                                     conv2d_17[0][0]                  
                                                                     conv2d_19[0][0]                  
                                                                     conv2d_20[0][0]                  
    __________________________________________________________________________________________________
    conv2d_22 (Conv2D)              (None, 14, 14, 112)  57456       concatenate_2[0][0]              
    __________________________________________________________________________________________________
    conv2d_24 (Conv2D)              (None, 14, 14, 24)   12312       concatenate_2[0][0]              
    __________________________________________________________________________________________________
    max_pooling2d_6 (MaxPooling2D)  (None, 14, 14, 512)  0           concatenate_2[0][0]              
    __________________________________________________________________________________________________
    conv2d_21 (Conv2D)              (None, 14, 14, 160)  82080       concatenate_2[0][0]              
    __________________________________________________________________________________________________
    conv2d_23 (Conv2D)              (None, 14, 14, 224)  226016      conv2d_22[0][0]                  
    __________________________________________________________________________________________________
    conv2d_25 (Conv2D)              (None, 14, 14, 64)   38464       conv2d_24[0][0]                  
    __________________________________________________________________________________________________
    conv2d_26 (Conv2D)              (None, 14, 14, 64)   32832       max_pooling2d_6[0][0]            
    __________________________________________________________________________________________________
    concatenate_3 (Concatenate)     (None, 14, 14, 512)  0           conv2d_21[0][0]                  
                                                                     conv2d_23[0][0]                  
                                                                     conv2d_25[0][0]                  
                                                                     conv2d_26[0][0]                  
    __________________________________________________________________________________________________
    conv2d_28 (Conv2D)              (None, 14, 14, 128)  65664       concatenate_3[0][0]              
    __________________________________________________________________________________________________
    conv2d_30 (Conv2D)              (None, 14, 14, 24)   12312       concatenate_3[0][0]              
    __________________________________________________________________________________________________
    max_pooling2d_7 (MaxPooling2D)  (None, 14, 14, 512)  0           concatenate_3[0][0]              
    __________________________________________________________________________________________________
    conv2d_27 (Conv2D)              (None, 14, 14, 128)  65664       concatenate_3[0][0]              
    __________________________________________________________________________________________________
    conv2d_29 (Conv2D)              (None, 14, 14, 256)  295168      conv2d_28[0][0]                  
    __________________________________________________________________________________________________
    conv2d_31 (Conv2D)              (None, 14, 14, 64)   38464       conv2d_30[0][0]                  
    __________________________________________________________________________________________________
    conv2d_32 (Conv2D)              (None, 14, 14, 64)   32832       max_pooling2d_7[0][0]            
    __________________________________________________________________________________________________
    concatenate_4 (Concatenate)     (None, 14, 14, 512)  0           conv2d_27[0][0]                  
                                                                     conv2d_29[0][0]                  
                                                                     conv2d_31[0][0]                  
                                                                     conv2d_32[0][0]                  
    __________________________________________________________________________________________________
    conv2d_34 (Conv2D)              (None, 14, 14, 144)  73872       concatenate_4[0][0]              
    __________________________________________________________________________________________________
    conv2d_36 (Conv2D)              (None, 14, 14, 32)   16416       concatenate_4[0][0]              
    __________________________________________________________________________________________________
    max_pooling2d_8 (MaxPooling2D)  (None, 14, 14, 512)  0           concatenate_4[0][0]              
    __________________________________________________________________________________________________
    conv2d_33 (Conv2D)              (None, 14, 14, 112)  57456       concatenate_4[0][0]              
    __________________________________________________________________________________________________
    conv2d_35 (Conv2D)              (None, 14, 14, 288)  373536      conv2d_34[0][0]                  
    __________________________________________________________________________________________________
    conv2d_37 (Conv2D)              (None, 14, 14, 64)   51264       conv2d_36[0][0]                  
    __________________________________________________________________________________________________
    conv2d_38 (Conv2D)              (None, 14, 14, 64)   32832       max_pooling2d_8[0][0]            
    __________________________________________________________________________________________________
    concatenate_5 (Concatenate)     (None, 14, 14, 528)  0           conv2d_33[0][0]                  
                                                                     conv2d_35[0][0]                  
                                                                     conv2d_37[0][0]                  
                                                                     conv2d_38[0][0]                  
    __________________________________________________________________________________________________
    conv2d_40 (Conv2D)              (None, 14, 14, 160)  84640       concatenate_5[0][0]              
    __________________________________________________________________________________________________
    conv2d_42 (Conv2D)              (None, 14, 14, 32)   16928       concatenate_5[0][0]              
    __________________________________________________________________________________________________
    max_pooling2d_9 (MaxPooling2D)  (None, 14, 14, 528)  0           concatenate_5[0][0]              
    __________________________________________________________________________________________________
    conv2d_39 (Conv2D)              (None, 14, 14, 256)  135424      concatenate_5[0][0]              
    __________________________________________________________________________________________________
    conv2d_41 (Conv2D)              (None, 14, 14, 320)  461120      conv2d_40[0][0]                  
    __________________________________________________________________________________________________
    conv2d_43 (Conv2D)              (None, 14, 14, 128)  102528      conv2d_42[0][0]                  
    __________________________________________________________________________________________________
    conv2d_44 (Conv2D)              (None, 14, 14, 128)  67712       max_pooling2d_9[0][0]            
    __________________________________________________________________________________________________
    concatenate_6 (Concatenate)     (None, 14, 14, 832)  0           conv2d_39[0][0]                  
                                                                     conv2d_41[0][0]                  
                                                                     conv2d_43[0][0]                  
                                                                     conv2d_44[0][0]                  
    __________________________________________________________________________________________________
    max_pooling2d_10 (MaxPooling2D) (None, 7, 7, 832)    0           concatenate_6[0][0]              
    __________________________________________________________________________________________________
    conv2d_46 (Conv2D)              (None, 7, 7, 160)    133280      max_pooling2d_10[0][0]           
    __________________________________________________________________________________________________
    conv2d_48 (Conv2D)              (None, 7, 7, 32)     26656       max_pooling2d_10[0][0]           
    __________________________________________________________________________________________________
    max_pooling2d_11 (MaxPooling2D) (None, 7, 7, 832)    0           max_pooling2d_10[0][0]           
    __________________________________________________________________________________________________
    conv2d_45 (Conv2D)              (None, 7, 7, 256)    213248      max_pooling2d_10[0][0]           
    __________________________________________________________________________________________________
    conv2d_47 (Conv2D)              (None, 7, 7, 320)    461120      conv2d_46[0][0]                  
    __________________________________________________________________________________________________
    conv2d_49 (Conv2D)              (None, 7, 7, 128)    102528      conv2d_48[0][0]                  
    __________________________________________________________________________________________________
    conv2d_50 (Conv2D)              (None, 7, 7, 128)    106624      max_pooling2d_11[0][0]           
    __________________________________________________________________________________________________
    concatenate_7 (Concatenate)     (None, 7, 7, 832)    0           conv2d_45[0][0]                  
                                                                     conv2d_47[0][0]                  
                                                                     conv2d_49[0][0]                  
                                                                     conv2d_50[0][0]                  
    __________________________________________________________________________________________________
    conv2d_52 (Conv2D)              (None, 7, 7, 192)    159936      concatenate_7[0][0]              
    __________________________________________________________________________________________________
    conv2d_54 (Conv2D)              (None, 7, 7, 48)     39984       concatenate_7[0][0]              
    __________________________________________________________________________________________________
    max_pooling2d_12 (MaxPooling2D) (None, 7, 7, 832)    0           concatenate_7[0][0]              
    __________________________________________________________________________________________________
    conv2d_51 (Conv2D)              (None, 7, 7, 384)    319872      concatenate_7[0][0]              
    __________________________________________________________________________________________________
    conv2d_53 (Conv2D)              (None, 7, 7, 384)    663936      conv2d_52[0][0]                  
    __________________________________________________________________________________________________
    conv2d_55 (Conv2D)              (None, 7, 7, 128)    153728      conv2d_54[0][0]                  
    __________________________________________________________________________________________________
    conv2d_56 (Conv2D)              (None, 7, 7, 128)    106624      max_pooling2d_12[0][0]           
    __________________________________________________________________________________________________
    concatenate_8 (Concatenate)     (None, 7, 7, 1024)   0           conv2d_51[0][0]                  
                                                                     conv2d_53[0][0]                  
                                                                     conv2d_55[0][0]                  
                                                                     conv2d_56[0][0]                  
    __________________________________________________________________________________________________
    average_pooling2d (AveragePooli (None, 1, 1, 1024)   0           concatenate_8[0][0]              
    __________________________________________________________________________________________________
    flatten (Flatten)               (None, 1024)         0           average_pooling2d[0][0]          
    __________________________________________________________________________________________________
    dropout (Dropout)               (None, 1024)         0           flatten[0][0]                    
    __________________________________________________________________________________________________
    dense (Dense)                   (None, 17)           17425       dropout[0][0]                    
    ==================================================================================================
    Total params: 5,990,977
    Trainable params: 5,990,977
    Non-trainable params: 0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202

    image-20220812152705366

    7.7 模型编译与训练

    # 学习率调节函数,逐渐减小学习率
    def adjust_learning_rate(epoch):
        # 前40周期
        if epoch <= 40:
            lr = 2e-4
        # 前40到80周期
        elif 40 < epoch <= 80:
            lr = 2e-5
        # 80到100周期
        else:
            lr = 2e-6
        return lr
    
    
    # 定义优化器
    adam = Adam(lr=2e-4)
    
    # 定义学习率衰减策略
    callbacks = []
    callbacks.append(LearningRateScheduler(adjust_learning_rate))
    
    # 定义优化器,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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    7.8 可视化与保存

    # 画出训练集准确率曲线图
    plt.plot(np.arange(epochs), history.history['accuracy'], c='b', label='train_accuracy')
    # 画出验证集准确率曲线图
    plt.plot(np.arange(epochs), history.history['val_accuracy'], c='y', label='val_accuracy')
    # 图例
    plt.legend()
    # x坐标描述
    plt.xlabel('epochs')
    # y坐标描述
    plt.ylabel('accuracy')
    # 显示图像
    plt.show()
    # 模型保存
    model.save('GoogleNet.h5')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    image-20220812152847680

    References

    Szegedy C , Liu W , Jia Y , et al. [IEEE 2015 IEEE Conference on Computer Vision and Pattern Recognition (CVPR) - Boston, MA, USA (2015.6.7-2015.6.12)] 2015 IEEE Conference on Computer Vision and Pattern Recognition (CVPR) - Going deeper with convolutions[J]. 2015:1-9.

    【精读AI论文】GoogLeNet(Inception V1)深度学习图像分类算法

  • 相关阅读:
    联合教育部高等学校科学研究发展中心,阿依瓦科技创新教育专项正式发布!
    系统方向学习9--android 10.0 去掉未知来源弹窗 默认授予安装未知来源权限
    通讯网关软件014——利用CommGate X2HTTP实现HTTP访问OPC Server
    android 指针动画转动
    基于PHP的互联网送水平台
    【CF1635F】 Closest Pair 题解
    使用Node.js构建一个简单的聊天机器人
    开发调试工具:USB转IIC/I2C/SPI/UART适配器模块可编程开发板
    跳一跳
    MySQL进阶(再论JDBC)——JDBC编程思想的分析 & JDBC的规范架构 & JDBC相关的类分析
  • 原文地址:https://blog.csdn.net/qq_43753724/article/details/126305310