sunpongber

DataLoader的使用

dataset只是告诉我们程序,数据集在什么位置

dataloader就是把数据加载到神经网络当中

dataloader就在dataset取数据,每次取多少,怎么取这个过程就用dataloader中的参数进行设置

先看dataloader官网,然后讲解dataloader在代码中如何使用的,以及效果如何

PyTorch官网

看PyTorch官方文档,左上角选择1.8.1,搜索dataloader,选择torch.utils.data.DataLoader

torch.utils.data.DataLoader(dataset, batch_size=1, shuffle=False, sampler=None, batch_sampler=None, num_workers=0, collate_fn=None, pin_memory=False, drop_last=False, timeout=0, worker_init_fn=None, multiprocessing_context=None, generator=None, *, prefetch_factor=2, persistent_workers=False)

可以看到dataloader中参数比较多,很多参数都有了默认值,dataset没有默认值
dataset就是之前自定义的dataset,dataset就是告诉我们数据集在什么地方,第一张数据、第二张数据是什么,包括dataset告诉我们总共有多少张数据,我们只需要把我们之前自定义的dataset实例化放在dataloader中就可以,其它的参数都有默认值,实际过程中只需要设置少量的参数即可

dataset (数据集)- 用于加载数据的数据集。

batch_size (int,可选)- 每批加载多少个样本(默认值:1)。

shuffle(bool,可选项)- 设置为 “true ”可在每个时间点重新洗牌数据(默认值:False)。

sampler (采样器或 Iterable,可选)- 定义从数据集中提取样本的策略。可以是任何实现了 len 的 Iterable。如果指定,则不得指定 shuffle。

batch_sampler (采样器或 Iterable,可选)- 与采样器类似,但一次返回一批索引。与 batch_size、shuffle、sampler 和 drop_last 互斥。

num_workers(int,可选)- 用于加载数据的子进程数量。0 表示数据将在主进程中加载。(默认值:0)

collate_fn (可调用,可选)- 合并样本列表以形成一个小型张量批次。在使用地图式数据集批量加载时使用。

pin_memory(bool,可选)- 如果为 True,数据加载器将在返回张量之前将其复制到 CUDA pinned 内存中。如果您的数据元素是自定义类型,或者您的 collate_fn 返回的批次是自定义类型,请参阅下面的示例。

drop_last(bool,可选)- 设置为 True 时,如果数据集大小不能被批次大小整除,则丢弃最后一个未完成的批次。如果设置为 False,且数据集的大小不能被批次大小整除,则最后一批数据会更小。(默认值:假)

import torchvision
from torch.utils.data import DataLoader

test_data = torchvision.datasets.CIFAR10(root="P14_torchvision_transforms/dataset", train=False, transform= torchvision.transforms.ToTensor())
test_loader = DataLoader(dataset=test_data, batch_size=4, shuffle=True, num_workers=0, drop_last=False)

img, target = test_data[0]
print(img.shape)
print(target)

for data in test_loader:
    imgs, targets = data
    print(imgs.shape)
    print(targets)

其中:

print(img.shape)
print(target)

返回:

torch.Size([3, 32, 32])
3

其中:

print(imgs.shape)
print(targets)

返回:

torch.Size([4, 3, 32, 32])
tensor([6, 6, 9, 9])
...
torch.Size([4, 3, 32, 32])
tensor([0, 4, 3, 6])

sampler是RandomSampler
以下作为理解,并非真实程序

def __getitem__(self, index: int) -> Tuple[Any, Any]:

return img, target

DataLoader(batch_size=4)

img0, target0 = test_data[0]
img1, target1 = test_data[1]
img2, target2 = test_data[2]
img3, target3 = test_data[3]

会把img0、1、2、3打包,把target0、1、2、3打包,作为DataLoader中的返回

import torchvision
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

test_data = torchvision.datasets.CIFAR10(root="P14_torchvision_transforms/dataset", train=False, transform= torchvision.transforms.ToTensor())
test_loader = DataLoader(dataset=test_data, batch_size=64, shuffle=True, num_workers=0, drop_last=False)

img, target = test_data[0]
print(img.shape)
print(target)

writer = SummaryWriter(log_dir="logs")
step = 0
for data in test_loader:
    imgs, targets = data
    writer.add_images("test_data", imgs, 0)
    step = step + 1
writer.close()

可以看到最后一步并不是64张图片,只取了16张图片
是因为drop_last设置的是False,数据集的大小不能被批次大小整除,则最后一批数据会更小
而当drop_last设置的是True时,数据集大小不能被批次大小整除,则丢弃最后一个未完成的批次

for循环就是抓完了一轮数据,当进行下一轮数据抓取的时候,shuffle设置为True可在每个时间点重新洗牌数据,而shuffle设置为False则下一轮抓取的数据会和上一轮一样

import torchvision
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

test_data = torchvision.datasets.CIFAR10(root="P14_torchvision_transforms/dataset", train=False, transform= torchvision.transforms.ToTensor())
test_loader = DataLoader(dataset=test_data, batch_size=64, shuffle=True, num_workers=0, drop_last=False)

img, target = test_data[0]
print(img.shape)
print(target)

writer = SummaryWriter(log_dir="logs")
for epoch in range(2):
    step = 0
    for data in test_loader:
        imgs, targets = data
        writer.add_images("Epoch: {}".format(epoch), imgs, step)
        step = step + 1
writer.close()

原始资料地址:
DataLoader的使用
如有侵权联系删除 仅供学习交流使用