天天看點

41.人工智能——深度學習飛槳-PaddleX 模型訓練過程和參數說明

作者:UNET

在上一篇文章中,介紹了PaddleX基本功能和安裝方法:40.人工智能——深度學習飛槳-PaddleX 安裝:Windows 10系統。本文主要講一下使用PaddleX的API來訓練模型,雖然有PaddleX GUI圖像形化界面程式,是可以作為初學者或入門級的選擇,如果需要更靈活自由的方式來組織實作自己的功能,則使用PaddleX的提供的API來完成比如友善。

基于PaddleX的模型訓練的過程:

一、劃分資料集

1、使用paddlex自帶指令劃分資料集,劃分比例一般比例,訓練集:驗證集:測試集=7:2:1

1.1.圖像分類任務:在指令行下輸入如下指令

paddlex --split_dataset --format ImageNet --dataset_dir MyDataset --val_value 0.2 --test_value 0.1           

1.2.目标檢測任務:在指令行輸入如何指令

paddlex --split_dataset --format VOC --dataset_dir MyDataset --val_value 0.2 --test_value 0.1           

其中參數:

--dataset_dir:資料集目錄

--format:資料集格式

--val_value:驗證集比例

--val_test:測試集比例

劃分完成後,會在資料集目錄裡自動生成4個檔案,用于後面的模型。

labels.txt:分類名稱或目标名稱

test_list.txt:測試資料

train_list.txt:訓練資料

val_list.txt:驗證資料

二、定義訓練和驗證時的transforms,圖像增強操作。

train_transforms = T.Compose([
  T.RandomResizeByShort( short_sizes=[640, 672, 704, 736, 768, 800], max_size=1333, interp='CUBIC'), 
  T.RandomHorizontalFlip(), 
  T.Normalize( mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])

eval_transforms = T.Compose([
    T.ResizeByShort(short_size=800, max_size=1333, interp='CUBIC'),
  T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
           

說明:為了簡化代碼,預設參數可以省略不寫。根據需要選擇合适的增強操作。

詳細API說明:https://github.com/PaddlePaddle/PaddleX/blob/develop/docs/apis/transforms/transforms.md

三、定義訓練和驗證所用的資料集

train_dataset = pdx.datasets.VOCDetection(
    data_dir='goods',
    file_list='goods/train_list.txt',
    label_list='goods/labels.txt',
    transforms=train_transforms,
    shuffle=True)

eval_dataset = pdx.datasets.VOCDetection(
    data_dir='goods',
    file_list='goods/val_list.txt',
    label_list='goods/labels.txt',
    transforms=eval_transforms,
    shuffle=False)           

參數說明:

data_dir:資料集目錄

file_list:訓練資料檔案

label_list:标簽檔案

transforms:資料增強

shuffle:是否開啟亂序

四、初化始模型,開啟訓練

num_classes = len(train_dataset.labels)
model = pdx.det.FasterRCNN( num_classes=num_classes, backbone='ResNet50', with_fpn=True)           

說明:這裡主要選擇算法模型和backbone骨幹網

詳細API說明:https://github.com/PaddlePaddle/PaddleX/blob/develop/docs/apis/models/detection.md

model.train(
    num_epochs=12,
    train_dataset=train_dataset,
    train_batch_size=2,
    eval_dataset=eval_dataset,
    learning_rate=0.0025,
    lr_decay_epochs=[8, 11],
    warmup_steps=500,
    warmup_start_lr=0.00025,
    save_dir='output/faster_rcnn_r50_fpn',
    use_vdl=True)           

num_epochs:是模型訓練疊代的總輪數(模型對訓練集全部樣本過一遍即為一個epoch),使用者可以設定較大的數值,根據模型疊代過程在驗證集上的名額表現,來判斷模型是否收斂,進而提前終止訓練。

train_dataset:訓練集

train_batch_size:指模型在訓練過程中,前向計算一次(即為一個step)所用到的樣本數量,Batch Size跟機器的顯存/記憶體高度相關,batch_size越高,所消耗的顯存/記憶體就越高,如若訓練時提示GPU顯存不足,則相應調低BatchSize。

eval_dataset:驗證集

learning_rate:學習率

lr_decay_epochs:用于讓學習率在模型訓練後期逐漸衰減,它一般是一個list,如[6, 8, 10],表示學習率在第6個epoch時衰減一次,第8個epoch時再衰減一次,第10個epoch時再衰減一次。每次學習率衰減為之前的學習率*lr_decay_gamma。

warmup_steps,warmup_start_lr:在訓練模型時,一般都會使用預訓練模型,例如檢測模型在訓練時使用backbone在ImageNet資料集上的預訓練權重。但由于在自行訓練時,自己的資料與ImageNet資料集存在較大的差異,可能會一開始由于梯度過大使得訓練出現問題,這種情況下可以在剛開始訓練時,讓學習率以一個較小的值,慢慢增長到設定的學習率。warmup_steps和warmup_start_lr就是起到這個作用,模型開始訓練時,學習率會從warmup_start_lr開始,在warmup_steps個batch資料疊代後線性增長到設定的學習率。

save_dir:訓練模型儲存的目錄

use_vdl:是否開啟可視化分析。

繼續閱讀