在大數據的時代,資料的大小動輒是GB或是TB等級,這樣的資料不可能一次性的被儲存到記憶體之上並提供給機器學習模型進行訓練。這種時候我們需要做事情就是讓資料從硬碟上直接送到GPU本身進行訓練,這樣就能避免記憶體大小對我們的資料造成的限制。在利用TensorFlow以及PyTorch建立張量章節中,我們簡單示範了如何利用生成器(generator
)物件實作資料流。在本章節中,我們將示範如何建立一個基於torch.utils.data.Dataset
物件的資料流。有人可能會問「都有基於生成器的作法了,為何還需要基於前述物件的實作呢?」,原因如下:
torch.utils.data.Dataset
物件的資料流實作,將可以繼承這兩個物件本身已經預先設計好的功能(例如:on_epoch_end
等功能),使用者無須再花時間及精力來實作一些進階功能。在PyTorch中的實作,基本上與在TensorFlow無異。然而在PyTorch中,特別將實作分成了兩種類別,分別為:Map-style datasets以及Iterable-style datasets。其中,Map-style datasets的實作與TensorFLow的實作沒有太多差異,唯一差異在PyTorch的版本不需要實作batch_size
的取用,這部份會由torch.utils.data.DataLoader
來完成。以下是在PyTorch中,Map-style datasets以及Iterable-style datasets的差異。
__getitem__()
以及__len__()
方法的資料集。此物件以及資料流的實作需要繼承torch.utils.data.Dataset
類別。範例如下:
__iter__()
方法的資料集。此物件以及資料流的實作需要繼承torch.utils.data.IterableDataset
類別。此物件的特點是提供了一個可迭代(Iterable) 的資料集操作。資料的取用方式不是透過[]
以及相對索引的搭配來取用,而是透過對一個可迭代對象[1]的迭代取值來實現。此方式在處理串流媒體資料時非常有用。
torch.utils.data.DataLoader
物件在PyTorch中,不像TensorFlow中可以直接將繼承了tf.keras.utils.Sequence
的物件送進.fit()
函數進行訓練。在PyTorch中,需要先將物件包含成torch.utils.data.DataLoader
物件,再將變數送進模型進行訓練。這樣做的必要性在:(一)torch.utils.data.DataLoader
的包裝同時包含了對batch_size
的定義,sampler
的宣告以及多線程的實現。sampler
是隨機打散資料集所需要的函數,而在包裝時宣告的num_works
以及其他變數將讓資料的取用可以藉由多線程來進行。作法很簡單,只要如下方範例執行即可(以Map-style datasets
中的物件為範例)[2]:
除去在PyTorch中個Iterable-style datasets
,在TensorFlow與PyTorch之中對資料流的實作基本上差不多,讀者可以在符合自身需求下進行實作。
Machine Learning
Notebook
技術隨筆
機器學習
Python
PyTorch