iT邦幫忙

2022 iThome 鐵人賽

DAY 5
0
AI & Data

PyTorch 生態鏈實戰運用系列 第 5

[Day05] Dataloader with PyTorch and MONAI

  • 分享至 

  • xImage
  •  

前言

在進行模型訓練之前,通常需要透過一連串的行為,將資料轉換成適合訓練的格式。前一日的文章構建了長資料來管理資料,本日的文章將透過PyTorch與MONAI來進行前處理。

Data Preprocess

一般來說資料準備好,要進入模型之前大致上會經歷以下流程:

這邊也分享一下每一個環節的大觀念:

  • Reader:讀檔案,也就是decode。選對正確的decoder至關重要。
  • all kinds of preprocess: 各式各樣的前處理。很多模型能做好的,關鍵通常都在這裡加入重要的Domain know how,或是有一些天馬行空式的突破。
  • Tensor:轉化成Tensor,通常就是轉化成pytorch或是tensorflow之類框架所使用的tensor,進行該框架底下的運算。不見得必要,依照框架甚至版本決定。

在monai裡頭,我們可以寫成像是下面這樣一個function的list,之後直接以pipeline的形式對所有資料作完整的前處理:

import monai

transforms = [
    monai.transforms.LoadImageD(keys = ['img']),
    monai.transforms.EnsureChannelFirstD(keys = ['img']),
    monai.transforms.ScaleIntensityD(keys = ['img']),
    monai.transforms.ToTensorD(keys = ['img'])
]

transforms = monai.transforms.Compose(transforms)

以上述的函式例子,我們假設每個進來的資料點都是一個dict(這些都是屬於monai.transfroms函數的DICT版,才會每個函數名稱後面都有一個D)。

而這個transforms則是可以針對每個dict裡頭img這個key,依序進行decode、調整channel、正規化pixel value到[0, 1]以及轉換成tensor。

Data Loader with Dictionary

有了前處理的函數以後,接著就可以讀取我們前一日進行的資料進來,接著轉換成list of dicts:

SPLITS = ['TRAIN', 'VALIDATION', 'TEST']
df = pd.read_csv('data/dataset.csv')
datasets = {split : df[df['split'] == split].to_dict('records') for split in SPLITS}

再下來,把資料點們跟上一段準備好的transforms進行結合成一個monai的dataset物件:

processed_datasets = {
    split : monai.data.Dataset(data = datasets[split], transform = transforms)    
    for split in SPLITS
}

最後,為dataset建立PyTorch的dataloader:

data_generators = {
    split : torch.utils.data.DataLoader(processed_datasets[split],
                                        batch_size = BATCH_SIZE,
                                        shuffle = True,
                                        collate_fn = monai.data.utils.pad_list_data_collate,
                                        pin_memory=torch.cuda.is_available())
    for split in SPLITS
}

接著就大功告成了!

補充:

  1. 通常不同split的dataloader是獨立的,以免混到。因此我用一堆dict的方式來進行管理,此為個人習慣。
  2. collate_fn = monai.data.utils.pad_list_data_collate 是個很有趣的東西,他可以幫你把各種前處理以後如果有少掉大小的圖檔pad成一致的大小,避免在製造batch的時候不會出錯。

Sampling

接著根據上述三個dataloader,可以簡單進行sampling並製圖:

看起來還不錯,詳細的產生方式可以參考這個檔案,一樣使用

python src/preprocess.py

就能得到結果。

本日小節

  • 以monai建立的transforms進行資料前處理
  • 視覺化處理後的影像(看起來沒什麼太大意外)

上一篇
[Day04] Data Preparation for MedMNIST
下一篇
[Day06] Design a Model
系列文
PyTorch 生態鏈實戰運用30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言