Pytorch Dataset,TensorDataset,Dataloader,Sampler關(guān)系解讀
Dataloader
Dataloader是數(shù)據(jù)加載器,組合數(shù)據(jù)集和采樣器,并在數(shù)據(jù)集上提供單線程或多線程的迭代器。
所以Dataloader的參數(shù)必然需要指定數(shù)據(jù)集Dataset和采樣器Sampler。
class torch.utils.data.DataLoader(dataset, batch_size=1, shuffle=False, sampler=None, num_workers=0, collate_fn=<function default_collate>, pin_memory=False, drop_last=False)
- dataset (Dataset) – 數(shù)據(jù)集。
- batch_size (int, optional) – 每個batch加載樣本數(shù)。
- shuffle (bool, optional) – True則打亂數(shù)據(jù).
- sampler (Sampler, optional) – 采樣器,如指定則忽略shuffle參數(shù)。
- num_workers (int, optional) – 用多少個子進程加載數(shù)據(jù)。0表示數(shù)據(jù)將在主進程中加載
- collate_fn (callable, optional) – 獲取batch數(shù)據(jù)的回調(diào)函數(shù),也就是說可以在這個函數(shù)中修改batch的形式
- pin_memory (bool, optional) –
- drop_last (bool, optional) – 如果數(shù)據(jù)集大小不能被batch size整除,則設(shè)置為True后可刪除最后一個不完整的batch。如果設(shè)為False并且數(shù)據(jù)集的大小不能被batch size整除,則最后一個batch將更小。
Dataset和TensorDataset
所有其他數(shù)據(jù)集都應(yīng)該進行子類化。所有子類應(yīng)該override __len__
和 __getitem__
,前者提供了數(shù)據(jù)集的大小,后者支持整數(shù)索引,范圍從0到len(self)。
TensorDataset是Dataset的子類,已經(jīng)復(fù)寫了 __len__
和 __getitem__
方法,只要傳入張量即可,它通過第一個維度進行索引。
所以TensorDataset說白了就是將輸入的tensors捆綁在一起,然后 __len__
是任何一個tensor的維度, __getitem__
表示每個tensor取相同的索引,然后將這個結(jié)果組成一個元組,源碼如下,要好好理解它通過第一個維度進行索引的意思(針對tensors里面的每一個tensor而言)。
class TensorDataset(Dataset): def __init__(self,*tensors): assert all(tensors[0].size(0)==tensor.size(0) for tensor in tensors) self.tensors = tensors def __getitem__(self,index): return tuple(tensor[index] for tensor in self.tensors) def __len__(self): return self.tensors[0].size(0)
Sampler和RandomSampler
Sampler與Dataset類似,是采樣器的基礎(chǔ)類。
每個采樣器子類必須提供一個 __iter__
方法,提供一種迭代數(shù)據(jù)集元素的索引的方法,以及返回迭代器長度的 __len__
方法。
所以Sampler必然是關(guān)于索引的迭代器,也就是它的輸出是索引。
而RandomSampler與TensorDataset類似,RandomSamper已經(jīng)實現(xiàn)了 __iter__
和 __len__
方法,只需要傳入數(shù)據(jù)集即可。
猜想理解RandomSampler的實現(xiàn)方式,考慮到這個類實現(xiàn)需要傳入Dataset,所以 __len__
就是Dataset的 __len__
,然后 __iter__
就可以隨便搞一個隨機函數(shù)對range(length)隨機即可。
綜合示例
結(jié)合TensorDataset和RandomSampler使用Dataloader
這里即可理解Dataloader這個數(shù)據(jù)加載器其實就是組合數(shù)據(jù)集和采樣器的組合。
所以那就是先根據(jù)Sampler隨機拿到一個索引,再用這個索引到Dataset中取tensors里每個tensor對應(yīng)索引的數(shù)據(jù)來組成一個元組。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python實現(xiàn)統(tǒng)計單詞出現(xiàn)的個數(shù)
這篇文章主要介紹了Python實現(xiàn)統(tǒng)計單詞出現(xiàn)的個數(shù),本文給出了實現(xiàn)代碼以及使用方法,需要的朋友可以參考下2015-05-05使用?PyQt5?設(shè)計下載遠程服務(wù)器日志文件程序的思路
這篇文章主要介紹了使用?PyQt5?設(shè)計下載遠程服務(wù)器日志文件程序,借助 PyQt5 強大的能力,我們可以通過“拖拉拽”的形式很容易地實現(xiàn)桌面端程序,只需要將原來的 Python 腳本綁定到 UI 程序的事件中,就實現(xiàn)了命令行程序到桌面程序的演進,需要的朋友可以參考下2022-11-11python 從csv讀數(shù)據(jù)到mysql的實例
今天小編就為大家分享一篇python 從csv讀數(shù)據(jù)到mysql的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06