DataLoader的使用
dataset只是告诉我们程序,数据集在什么位置
dataloader就是把数据加载到神经网络当中
dataloader就在dataset取数据,每次取多少,怎么取这个过程就用dataloader中的参数进行设置
先看dataloader官网,然后讲解dataloader在代码中如何使用的,以及效果如何
看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的使用
如有侵权联系删除 仅供学习交流使用