iT邦幫忙

2021 iThome 鐵人賽

DAY 11
0
AI & Data

手寫中文字之影像辨識系列 第 11

【第11天】訓練模型-Keras Application重要函數

  • 分享至 

  • xImage
  •  

摘要

  1. 資料集預處理

    1.1 ImageDataGenerator

    1.2 flow_from_directory

  2. Callbacks API

    2.1 EarlyStopping

    2.2 ModelCheckpoint

    2.3 Callbacks


內容

  1. 資料集預處理

    1.1 簡介:

    • 【第6天】資料前處理-資料擴增曾提及,訓練模型時,會增加訓練樣本,避免模型過擬合。其中,Data Augmentation也是一個增加訓練樣本的方法。
    • keras.preprocessing中內建的Data Augmentation函數,即為ImageDataGenerator。
    • flow_from_directory則是從ImageDataGenerator抽取訓練樣本,供模型訓練每個epoch時使用。用於解決資料集過大,無法一次性載入記憶體的困境。

    1.2 ImageDataGenerator

    • 範例:
    # 設定批量生成器
    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)
    
    • 參數說明

      • rescale:預設值為0或None,若賦值(1./255)的話,會將圖片的數據乘以該值,進行縮放。
      • rotation_range:若賦值為20,代表圖像順時針旋轉20度;賦值為-20,代表圖像逆時針旋轉20度。
      • width_shift_range:圖像隨機水平移動,位移距離為圖像長度乘以參數(0.2)。
      • height_shift_range:圖像隨機垂直移動,位移距離為圖像長度乘以參數(0.2)。
      • shear_range:固定圖像的X軸/Y軸,對Y軸/X軸座標進行垂直/水平移動。如圖像從長方形,變成平行四邊形,如下圖。


      圖片來自於:https://medium.com/ai%E5%8F%8D%E6%96%97%E5%9F%8E/preprocessing-data-image-data-augmentation%E5%AF%A6%E4%BD%9C%E8%88%87%E5%8F%83%E6%95%B8%E8%AA%AA%E6%98%8E-d05f2ed24194

      • zoom_range:讓圖像在水平或垂直方向進行放縮放。賦值在0~1之間,代表放大;賦值大於1,代表縮小。
      • fill_mode:用來填補圖像資料擴增時,造成的像素缺失。

    1.3 flow_from_directory

    • 範例:
    # 讀取資料集+批量生成器,產生每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)
    
    • 參數說明:

      • target_size:圖像尺寸大小。
      • shuffle:預設為True,代表抽取資料時,會隨機將資料打散。
  2. 預訓練模型種類

    2.1 簡介:

    • Callback:訓練模型時,可以呼叫該函數,監控模型的訓練狀態,用於即時自動調整其他函數。
    • EarlyStopping:設定模型停止訓練的條件,避免發生過擬合的現象。
    • ModelCheckpoint:當模型的表現優於先前,才會覆蓋儲存先前的權重,用於儲存最佳模型。

    2.2 EarlyStopping

    • 範例
    # 設定earlystop條件
    estop = EarlyStopping(monitor='val_loss', patience=10, 
                          mode='min', verbose=1)
    
    • 參數說明:

      • monitor:欲監控的數值。通常使用val_loss或val_acc
      • mode:選擇監控的模式。對應monitor類別,val_loss設定min或val_acc設定max。
      • patience:若賦值為10,代表模型連續訓練10個epoch後,監控的數值表現沒有更好,就會停止訓練。
      • verbose:用於選擇模型訓練資訊的顯示方式。

    2.3 ModelCheckpoint

    • 範例:
    # 設定模型儲存條件(儲存最佳模型)
    checkpoint = ModelCheckpoint('Densenet201_checkpoint_v2.h5', verbose=1,
                                  monitor='val_loss', save_best_only=True,
                                  mode='min')
    
    • 參數說明:

      • 待讀取模型路徑:'Densenet201_checkpoint_v2.h5'
      • monitor:欲監控的數值。通常使用val_loss或val_acc
      • mode:選擇監控的模式。對應monitor類別,val_loss設定min或val_acc設定max。
      • save_best_only:預設為False,代表每個epoch訓練後,都會覆蓋儲存權重。若設定為True,只有當模型表現更佳時,才會覆蓋儲存權重。
      • verbose:用於選擇模型訓練資訊的顯示方式。

    2.4 Callbacks

    • 範例:
    # 重新訓練模型權重(以callbacks呼叫checkpoint、estop、reduce_lr)
    history = model.fit_generator(train_generator,
                       epochs=500, 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])
    
    • 參數說明:

      • 讀取資料集+批量生成器,抽取每epoch訓練樣本:train_generator。
      • epochs:訓練回合數。
      • verbose:用於選擇模型訓練資訊的顯示方式。
      • steps_per_epoch:設定每個epoch要執行多少step,詳細說明請參閱Keras fit_generator的steps_per_epoch。計算公式如下。
        steps_per_epoch = 資料集樣本數 除以 batch size
      • callbacks:用來儲存checkpoint、estop、reduce_lr的函數。

小結

下一章,目標是:「和大家簡單介紹Learning rate,並比較3種Learning rate的策略與優劣」。

讓我們繼續看下去...


參考資料

  1. Keras Application_中文
  2. Preprocessing Data : Image Data Augmentation實作與參數說明

上一篇
【第10天】訓練模型-預訓練模型
下一篇
【第12天】訓練模型-Learning Rate
系列文
手寫中文字之影像辨識31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
Frank
iT邦新手 5 級 ‧ 2021-09-26 22:53:36

隊友好棒棒,加油!!

我要留言

立即登入留言