1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
   | class DataLoader(object):     """     Data loader. Combines a dataset and a sampler, and provides     single- or multi-process iterators over the dataset.
      Arguments:         dataset (Dataset): dataset from which to load the data.         batch_size (int, optional): how many samples per batch to load             (default: 1).         shuffle (bool, optional): set to ``True`` to have the data reshuffled             at every epoch (default: False).         sampler (Sampler, optional): defines the strategy to draw samples from             the dataset. If specified, ``shuffle`` must be False.         batch_sampler (Sampler, optional): like sampler, but returns a batch of             indices at a time. Mutually exclusive with batch_size, shuffle,             sampler, and drop_last.         num_workers (int, optional): how many subprocesses to use for data             loading. 0 means that the data will be loaded in the main process             (default: 0)         collate_fn (callable, optional): merges a list of samples to form a mini-batch.         pin_memory (bool, optional): If ``True``, the data loader will copy tensors             into CUDA pinned memory before returning them.         drop_last (bool, optional): set to ``True`` to drop the last incomplete batch,             if the dataset size is not divisible by the batch size. If False and             the size of dataset is not divisible by the batch size, then the last batch             will be smaller. (default: False)     """
      def __init__(self, dataset, batch_size=1, shuffle=False, sampler=None, batch_sampler=None,                  num_workers=0, collate_fn=default_collate, pin_memory=False, drop_last=False):         self.dataset = dataset         self.batch_size = batch_size         self.num_workers = num_workers         self.collate_fn = collate_fn         self.pin_memory = pin_memory         self.drop_last = drop_last
          if batch_sampler is not None:             if batch_size > 1 or shuffle or sampler is not None or drop_last:                 raise ValueError('batch_sampler is mutually exclusive with '                                  'batch_size, shuffle, sampler, and drop_last')
          if sampler is not None and shuffle:             raise ValueError('sampler is mutually exclusive with shuffle')
          if batch_sampler is None:             if sampler is None:                 if shuffle:                     sampler = RandomSampler(dataset)                 else:                     sampler = SequentialSampler(dataset)             batch_sampler = BatchSampler(sampler, batch_size, drop_last)
          self.sampler = sampler         self.batch_sampler = batch_sampler
      def __iter__(self):         return DataLoaderIter(self)
      def __len__(self):         return len(self.batch_sampler)
   |