【第17天】训练模型-InceptionV4

摘要

  1. InceptionV4

    1.1 来源
    1.2 架构
    1.3 特性

  2. 训练过程

    2.1 预训练模型
    2.2 设置Callbacks
    2.3 设置训练集
    2.4 开始训练模型
    2.5 储存模型与纪录学习曲线

  3. 模型训练结果

    3.1 学习曲线
    3.2 Accuracy与Loss

  4. 验证模型准确度

    4.1 程序码
    4.2 验证结果


内容

  1. InceptionV4

    1.1 来源

    • 简介:
      • 借监InceptionV3的概念,优化後产出更深的网路,保留主要特徵的同时,减少运算量,以提高模型准确率。
    • 时程:於2016年提出论文。
    • 论文名称:Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning

    1.2 架构

    • 完整架构:

      图片来自於:http://yeephycho.github.io/2016/08/31/A-reminder-of-algorithms-in-Convolutional-Neural-Networks-and-their-influences-III/

    • Stem:因Inception module在低维度特徵提取时,降低特徵图尺寸的速度过快,可能会损失大量特徵信息,进一步影响模型效能,故以Stem取代一般卷积层。

      • 使用池化层、卷积层并行结构:减少计算量,降低过拟合。(下图-A处)
      • 使用不对称卷积核:保留主要特徵讯息(下图-B处)
      • 使用 1 * 1 卷积核降低维度。(下图-B处)
    • Inception Module:

      • 使用不对称卷积层
      • 使用1 * 1卷积层降低维度(下图-A处)或统一维度(下图-B处)。
      • Inception-A
      • Inception-B
      • Inception-C
    • Reduction:与Stem的设计概念相同,避免急遽降低特徵图的尺寸。理论依据可参考论文5. Efficient Grid Size Reduction

      • Reduction-A:

      • Reduction-B:

    • Dropout:在Softmax与Average Pooling间,加入Dropout(0.2),降低模型训练过拟合的可能性。

    1.3 特性

    • 保有InceptionV3特性,且更深的InceptionV4架构,模型准确率显着提升。
  2. 训练过程:

    2.1 预训练模型

    # IMPORT MODULES
    from keras.callbacks import EarlyStopping, ModelCheckpoint, ReduceLROnPlateau
    from keras.layers import Input, Dense, GlobalAveragePooling2D
    from keras.preprocessing.image import ImageDataGenerator
    from keras.optimizers import Adam
    import matplotlib.pyplot as plt
    from keras.models import Model
    from keras.applications import InceptionResNetV2
    
    # -----------------------------1.客制化模型--------------------------------
    # 载入keras模型(更换输出图片尺寸)
    model = create_model(num_classes=800, dropout_prob=0.2, 
                         weights=None, include_top=True)
    
    # 编译模型
    model.compile(optimizer=Adam(lr=0.001),
               loss='categorical_crossentropy',
               metrics=['accuracy'])
    

    2.2 设置Callbacks

    # ---------------------------2.设置callbacks----------------------------
    # 设定earlystop条件
    estop = EarlyStopping(monitor='val_loss', patience=15, mode='min', verbose=1)
    
    # 设定模型储存条件
    checkpoint = ModelCheckpoint('InceptionV4_checkpoint_v2.h5', verbose=1,
                              monitor='val_loss', save_best_only=True,
                              mode='min')
    
    # 设定lr降低条件
    reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.5,
                               patience=5, mode='min', verbose=1,
                               min_lr=1e-6)
    

    2.3 设置训练集

    # -----------------------------3.设置资料集--------------------------------
    # 设定ImageDataGenerator参数(路径、批量、图片尺寸)
    train_dir = './workout/train/'
    valid_dir = './workout/val/'
    test_dir = './workout/test/'
    batch_size = 64
    target_size = (120, 120)
    
    # 设定批量生成器
    train_datagen = ImageDataGenerator(rescale=1./255, 
                                       rotation_range=20,
                                       width_shift_range=0.2,
                                       height_shift_range=0.2,
                                       shear_range=0.2, 
                                       zoom_range=0.5,
                                       fill_mode="nearest")
    
    val_datagen = ImageDataGenerator(rescale=1./255)
    
    test_datagen = ImageDataGenerator(rescale=1./255)
    
    # 读取资料集+批量生成器,产生每epoch训练样本
    train_generator = train_datagen.flow_from_directory(train_dir,
                                          target_size=target_size,
                                          batch_size=batch_size)
    
    valid_generator = val_datagen.flow_from_directory(valid_dir,
                                          target_size=target_size,
                                          batch_size=batch_size)
    
    test_generator = test_datagen.flow_from_directory(test_dir,
                                          target_size=target_size,
                                          batch_size=batch_size,
                                          shuffle=False)
    

    2.4 重新训练模型权重

    # -----------------------------4.开始训练模型------------------------------
    # 重新训练权重
    history = model.fit_generator(train_generator,
                       epochs=50, verbose=1,
                       steps_per_epoch=train_generator.samples//batch_size,
                       validation_data=valid_generator,
                       validation_steps=valid_generator.samples//batch_size,
                       callbacks=[checkpoint, estop, reduce_lr])
    

    2.5 储存模型与纪录学习曲线

    # -----------------------5.储存模型、纪录学习曲线------------------------
    # 储存模型
    model.save('./InceptionV4_retrained_v2.h5')
    print('已储存InceptionV2_retrained_v2.h5')
    
    # 画出acc学习曲线
    acc = history.history['accuracy']
    epochs = range(1, len(acc) + 1)
    val_acc = history.history['val_accuracy']
    plt.plot(epochs, acc, 'bo', label='Training acc')
    plt.plot(epochs, val_acc, 'r', label='Validation acc')
    plt.title('Training and validation accuracy')
    plt.legend(loc='lower right')
    plt.grid()
    # 储存acc学习曲线
    plt.savefig('./acc.png')
    plt.show()
    
    # 画出loss学习曲线
    loss = history.history['loss']
    val_loss = history.history['val_loss']
    plt.plot(epochs, loss, 'bo', label='Training loss')
    plt.plot(epochs, val_loss, 'r', label='Validation loss')
    plt.title('Training and validation loss')
    plt.legend(loc='upper right')
    plt.grid()
    # 储存loss学习曲线
    plt.savefig('loss.png')
    plt.show()
    
  3. 模型训练结果

    3.1 训练epochs:28 epochs。

    3.2 耗费时间:3小时44分28秒(13468秒)。

    3.3 学习曲线

    3.4 Accuary与Loss

  4. 验证准确度

    4.1 程序码

    # -------------------------6.验证模型准确度--------------------------
    # 以vali资料夹验证模型准确度
    test_loss, test_acc = model.evaluate_generator(test_generator,
                                steps=test_generator.samples//batch_size,
                                verbose=1)
    print('test acc:', test_acc)
    print('test loss:', test_loss)
    

    4.2 验证结果


小结

下一章目标是:介绍第五个预训练模型InceptionResNetV2,与分享训练成果」。

让我们继续看下去...


参考资料

  1. Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning
  2. Inception 系列 — InceptionV4, Inception-ResNet-v1, Inception-ResNet-v2
  3. InceptionV4与Inception-ResNet-v2架构图比较
  4. Rethinking the Inception Architecture for Computer Vision

<<:  [DAY 17] VAE 简介

>>:  【Side Project】 订单清单 - 画面设计

[Day 26] 建立注册的画面及功能(十) - Gmail设定(一)

之後我们要处理寄送E-mail的部分, 这次我们会使用Gmail, 好处是一般寄送E-mail会有网...

身体惯性-螃蟹改不了横行

早起运动Day8 - 身体习惯​ ​ 不假思索的起床,做第一件事情以後就会带到第二件事情。​ 就像看...

DAY10 - [CSS+RWD] 合体吧!网页与小结

今日文章目录 将这十天的零件,组成一页式网页 10天CSS小结 我这次写铁人赛的目标,是想将目前学...

[Day06] 第六章- 开发环境安装(xampp,vscode,composer)

目标 安装环境 勘误修正及补充 1. 前言 到目前为止 已经把永丰的api参数以及相关制作流程做完了...

效能监视器--Windows的隐藏监控器

今天要讲的是效能监视器(Performance Monitor),他是Windows内建的监控程序之...