天天看點

DataLoader源代碼剖析

前言

  • dataloader  本質是一個可疊代對象,使用  iter()  通路,不能使用  next()  通路;
  • 使用   iter(dataloader)  傳回的是一個疊代器,然後可以使用   next  通路;
  • 也可以使用  `for inputs, labels in dataloaders`  進行可疊代對象的通路;
  • 一般我們實作一個 datasets 對象,傳入到  dataloader  中;然後内部使用  yeild  傳回每一次  batch  的資料;

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:
        ....      

  是以,作為直接對資料進入模型中的關鍵一步, DataLoader非常重要。

DataLoader

  先介紹一下DataLoader(object)的參數:

  • 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初始化函數 If not None, this will be called on each
  • worker subprocess with the worker id (an int in [0, num_workers - 1]) as
  • input, after seeding and before data loading. (default: None)

例子:

from torch.utils.data import DataLoader
from torchvision import transforms,datasets
import matplotlib.pyplot  as plt

def get_datas(batch_size):
    data_tf = transforms.Compose(
        [
            transforms.ToTensor(),
            transforms.Normalize(0,1)
        ]
    )
    train_dataset = datasets.MNIST(root = "./data",train=True,transform=data_tf,download = True)
    train_loader = DataLoader(train_dataset,shuffle =True,batch_size = batch_size,drop_last = True )
    return train_loader

train_loader = get_datas(2)
print(len(train_loader))
for i, data in enumerate(train_loader):
    # f輸出兩張圖檔
    if i>0:
        break
    inputs, labels = data
    for j in range(len(inputs)):
        print(inputs[j].shape)
        decode_img = inputs[j].squeeze()  #去掉1
        print(decode_img.shape)
        decode_img = decode_img.data.cpu().numpy() * 255
        plt.imshow(decode_img.astype('uint8'), cmap='gray')
        plt.show()



train_loader = get_datas(2)
print(len(train_loader))
i=0
for imgs, labels in iter(train_loader):
    # f輸出兩張圖檔
    if i>0:
        break
    for j in range(len(imgs)):
        decode_img =imgs[j].squeeze()  #去掉1
        print(decode_img.shape)
        decode_img = decode_img.data.cpu().numpy() * 255
        plt.imshow(decode_img.astype('uint8'), cmap='gray')
        plt.show()
    i = i+1      

因上求緣,果上努力~~~~ 作者:cute_Learner,轉載請注明原文連結:https://www.cnblogs.com/BlairGrowing/p/15709472.html