簡介
DataLoader是PyTorch中的一種數據類型。對數據進行按批讀取。
使用Pytorch自定義讀取數據時步驟如下: 1)創建Dataset對象 2)將Dataset對象作為參數傳遞到Dataloader中 |
Dataloader 就是一個迭代器,最基本的使用就是傳入一個 Dataset 對象,它就會根據參數 batch_size 的值生成一個 batch 的數據。
torch.utils.data.DataLoader(dataset, batch_size=1, shuffle=False, sampler=None, batch_sampler=None, num_workers=0, collate_fn=None, pin_memory=False, drop_last=False, timeout=0, worker_init_fn=None, multiprocessing_context=None)
Data loader. Combines a dataset and a sampler, and provides an iterable over the given dataset.
The DataLoader supports both map-style and iterable-style datasets with single- or multi-process loading, customizing loading order and optional automatic batching (collation) and memory pinning.
See torch.utils.data documentation page for more details.
參數說明
__init__(構造函數)中的幾個重要的屬性[3]:
1、dataset:(數據類型 dataset)
輸入的數據類型。看名字感覺就像是數據庫,C#里面也有dataset類,理論上應該還有下一級的datatable。這應當是原始數據的輸入。PyTorch內也有這種數據結構。這里先不管,估計和C#的類似,這里只需要知道是輸入數據類型是dataset就可以了。
2、batch_size:(數據類型 int)
每次輸入數據的行數,默認為1。PyTorch訓練模型時調用數據不是一行一行進行的(這樣太沒效率),而是一捆一捆來的。這里就是定義每次喂給神經網絡多少行數據,如果設置成1,那就是一行一行進行(PyTorch默認設置是1)。
3、shuffle:(數據類型 bool)
洗牌。默認設置為False。在每次迭代訓練時是否將數據洗牌,默認設置是False。將輸入數據的順序打亂,是為了使數據更有獨立性,但如果數據是有序列特征的,就不要設置成True了。
4、collate_fn:(數據類型 callable,沒見過的類型)
將一小段數據合並成數據列表,默認設置是False。如果設置成True,系統會在返回前會將張量數據(Tensors)復制到CUDA內存中。(不解,就暫時默認False)
5、batch_sampler:(數據類型 Sampler)
批量采樣,默認設置為None。但每次返回的是一批數據的索引(不是數據)。其和batch_size、shuffle 、sampler and drop_last參數是不兼容的。我想,應該是每次輸入網絡的數據是隨機采樣模式,這樣能使數據更具有獨立性質。所以,它和一捆一捆按順序輸入,數據洗牌,數據采樣,等模式是不兼容的。
6、sampler:(數據類型 Sampler)
采樣,默認設置為None。根據定義的策略從數據集中采樣輸入。如果定義采樣規則,則洗牌(shuffle)設置必須為False。
7、num_workers:(數據類型 Int)
工作者數量,默認是0。使用多少個子進程來導入數據。設置為0,就是使用主進程來導入數據。注意:這個數字必須是大於等於0的,負數估計會出錯。
8、pin_memory:(數據類型 bool)
內存寄存,默認為False。在數據返回前,是否將數據復制到CUDA內存中。
9、drop_last:(數據類型 bool)
丟棄最后數據,默認為False。設置了 batch_size 的數目后,最后一批數據的大小未必是設置的批大小,有可能會小些。這時你是否需要丟棄這批數據。
10、timeout:(數據類型 numeric)
超時,默認為0。是用來設置數據讀取的超時時間的,超過這個時間還沒讀取到數據的話就會報錯。 所以,數值必須大於等於0。
11、worker_init_fn(數據類型 callable ?)
子進程導入模式,默認為None。在數據導入前和步長結束后,根據工作子進程的ID逐個按順序導入數據。(線程數目)
12、
multiprocessing_context=None 【暫時不解】
與Dataset
Dataset是一個包裝類,可對數據進行張量(tensor)的封裝,其可作為DataLoader的參數傳入,進一步實現基於tensor的數據預處理。
參考
[1] pytorch:https://github.com/pytorch/pytorch
[2] dataloader:https://pytorch.org/docs/stable/_modules/torch/utils/data/dataloader.html
[3] https://blog.csdn.net/rogerfang/article/details/82291464