在上一篇文章中,介紹了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:是否開啟可視化分析。