Pytorch中DataLoader类
1 基本流程
首先熟知,pytorch 的數據加載到模型的操作順序是這樣的:
- 創建一個 Dataset 對象
- 創建一個 DataLoader 對象
- 循環這個 DataLoader 對象,將img, label加載到模型中進行訓練
2 參數介紹
def __init__(self, dataset: Dataset[T_co], batch_size: Optional[int] = 1,shuffle: bool = False, sampler: Optional[Sampler[int]] = None,batch_sampler: Optional[Sampler[Sequence[int]]] = None,num_workers: int = 0, collate_fn: _collate_fn_t = None,pin_memory: bool = False, drop_last: bool = False,timeout: float = 0, worker_init_fn: _worker_init_fn_t = None,multiprocessing_context=None, generator=None,*, prefetch_factor: int = 2,persistent_workers: bool = False):-
dataset(Dataset): 傳入的數據集
-
batch_size(int, optional): 每個batch有多少個樣本
-
shuffle(bool, optional): 在每個epoch開始的時候,對數據進行重新排序
-
sampler(Sampler, optional): 自定義從數據集中取樣本的策略,如果指定這個參數,那么shuffle必須為False
-
batch_sampler(Sampler, optional): 與sampler類似,但是一次只返回一個batch的indices(索引),需要注意的是,一旦指定了這個參數,那么batch_size,shuffle,sampler,drop_last就不能再制定了(互斥——Mutually exclusive)
-
num_workers (int, optional): 這個參數決定了有幾個進程來處理data loading。0意味著所有的數據都會被load進主進程。(默認為0)
-
collate_fn (callable, optional): 將一個list的sample組成一個mini-batch的函數
-
pin_memory (bool, optional): 如果設置為True,那么data loader將會在返回它們之前,將tensors拷貝到CUDA中的固定內存(CUDA pinned memory)中.
-
drop_last (bool, optional): 如果設置為True:這個是對最后的未完成的batch來說的,比如你的batch_size設置為64,而一個epoch只有100個樣本,那么訓練的時候后面的36個就被扔掉了…
如果為False(默認),那么會繼續正常執行,只是最后的batch_size會小一點。 -
timeout(numeric, optional): 如果是正數,表明等待從worker進程中收集一個batch等待的時間,若超出設定的時間還沒有收集到,那就不收集這個內容了。這個numeric應總是大于等于0。默認為0
-
worker_init_fn (callable, optional): 用戶定義的每個worker初始化的時候需要執行的函數。如果不是None, 則會以worker id[0, num_workers - 1]的每個子進程調用(在sedding后,數據加載前)
3 關于worker_init_fn的問題
如果程序一開始指定了各種seed,為了得到確定的結果。如
random.seed(args.seed)np.random.seed(args.seed)torch.manual_seed(args.seed)torch.cuda.manual_seed(args.seed)此時,在生成Dataloader時,如果要設置num_workers的數量大于0,使用多進程。則需要傳入
def worker_init_fn(worker_id):random.seed(args.seed + worker_id)4 關于pin_memory的問題
pin_memory就是鎖頁內存,創建DataLoader時,設置pin_memory=True,則意味著生成的Tensor數據最開始是屬于內存中的鎖頁內存,這樣將內存的Tensor轉義到GPU的顯存就會更快一些。
主機中的內存,有兩種存在方式,一是鎖頁,二是不鎖頁,鎖頁內存存放的內容在任何情況下都不會與主機的虛擬內存進行交換(注:虛擬內存就是硬盤),而不鎖頁內存在主機內存不足時,數據會存放在虛擬內存中。而顯卡中的顯存全部是鎖頁內存!
當計算機的內存充足的時候,可以設置pin_memory=True。當系統卡住,或者交換內存使用過多的時候,設置pin_memory=False。因為pin_memory與電腦硬件性能有關,pytorch開發者不能確保每一個煉丹玩家都有高端設備,因此pin_memory默認為False。
參考資料
總結
以上是生活随笔為你收集整理的Pytorch中DataLoader类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ribbon使用及其客户端负载均衡实现原
- 下一篇: 半监督学习之数据加载