日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Pytorch中DataLoader类

發布時間:2024/10/8 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Pytorch中DataLoader类 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1 基本流程

首先熟知,pytorch 的數據加載到模型的操作順序是這樣的:

  • 創建一個 Dataset 對象
  • 創建一個 DataLoader 對象
  • 循環這個 DataLoader 對象,將img, label加載到模型中進行訓練
dataset = MyDataset() dataloader = DataLoader(dataset) num_epoches = 100 for epoch in range(num_epoches):for img, label in dataloader:....

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。

參考資料

  • https://blog.csdn.net/g11d111/article/details/81504637
  • https://blog.csdn.net/qq_40612314/article/details/114435334
  • 與50位技術專家面對面20年技術見證,附贈技術全景圖

    總結

    以上是生活随笔為你收集整理的Pytorch中DataLoader类的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。