PyTorch入门备忘-4-数据集加载-Dataloader

441 阅读4分钟

dataloader作用是把torchvision.dataset装载的数据按训练等要求装载,供下游的深度学习等场景使用。比如:按几次批加载、加载时epoch设置为多少等

从数据集准备、数据集处理与实例化,数据集加载,后面就是送入深度学习模型等下游业务进行数据训练了。

DataLoader官方的文档入口、声明与主要参与见 附-相关知识 部分

使用流程

  • 步骤1: transform实例化,编写数据处理代码
  • 步骤2: 用torchvision.dataset读取数据集,将实例化的transform作为dataset参数对数据集进行统一处理
  • 步骤3: 用dataloader按要求装载dataset数据集(
  • 步骤4: 写日志至指定路径
  • 步骤5: 启动tensorboard查看对应的数据

上述步骤正好对应数据处理流程
代码比较简单,用于入门

导入

from torch.utils.data import DataLoader

实操代码

import torchvision.datasets
from torch.utils.data import DataLoader

# 准备的测试数据集
from torch.utils.tensorboard import SummaryWriter

test_data = torchvision.datasets.CIFAR10("./data_torchvision_dataset", train=False, transform=torchvision.transforms.ToTensor(),download=True)
# 加载测试集:取四个数据,进行打包,batch_size = 64 数据一共四条,0~3
test_loader = DataLoader(dataset=test_data, batch_size=64, shuffle=True, num_workers=0, drop_last=True)

# 测试数据集中第一张图片,及target
# target指目录在classes包下label的索引
img, target = test_data[0]
print("channel:", img.shape)
print("label=", test_data.classes[target])
print("dataset_len=", len(test_data))

# 展示
writer = SummaryWriter("logs_dataloader")
# 重复输出两次相同的数据,shuffle=True代表两次数据顺序不同
for epoch in range(2):
    step = 0
    for data in test_loader:
        # 读取数据
        # 实际操作时,读取完数据后,会将读出的数据直接输送到神经网络,作为神网的输入
        myImg, myTarget = data
        # format:格式化输出
        writer.add_images("Epoch:{}".format(epoch), myImg, step)
        step = step + 1

writer.close()

启动tensorboard查看结果

在python console运行代码

runfile('xxx/learn_torch/dataloader.py', wdir='xxx/learn_torch')

# ---控制台输出
channel: torch.Size([3, 32, 32])
label= cat
dataset_len= 10000

在Terminal中启动tensorboar

tensorboard  --logdir=logs_dataloader 

默认端口是:6006,可修改

tensorboard输出结果

drop_last=True|False的情况

drop_last=True - Total=155 & Step=155drop_last=False - Total=156 & Step=156
image.pngimage.png

上图左图显示了drop_last=True时最后不满一批次的数据,会被截取,所以整个step是155。
上图右图drop_last=False会将最后一批不足的数据也读出,不会被截取,所以整个step是156张,最后一屏占满不了代码中设置的64张。

shuffle=True|False的情况

Epoch=0Epoch=1
image.pngimage.png

上图演示了shuffle=True图片随机读出的效果,同样的Step读出的顺序不同。
那么从字面上也可以理解当shuffle=False时,图片的顺序一定是相同的。

相关知识

文档入口

Pytorch的官网:pytorch.org/ , 选中核心模块进入dataloader的页面,点击torch.utils.data

image.png

官网: pytorch.org/docs/stable…

声明

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, *, prefetch_factor=2,
           persistent_workers=False)

主要参数

  • dataset – 要被加载的数据集,可以用index取值的对象,map-style and iterable-style
  • batch_size – 每批要加载的样本数 (默认: 1).
  • shuffle – 取batch是否随机取 (default: False). 为False加载的数据要同,否则不同。
  • sampler – 定义取batch的方法,是一个迭代器, 每次生成一个key 用于读取dataset中的值
  • batch_sampler – 也是一个迭代器, 每次生次一个batch_size的key.
  • num_workers – 加载数据启动的进程线。等于0表示采用主进程加载 (default: 0)
  • drop_last - 为False,余下不满足batach_size的数据不丢弃,设为True丢弃。(默认: False)

官网查看详细

dataset类型

pytorch支持两种不同类型的数据集,

map-style datasets:一种映射型的数据集,使用__getitem__() 和 __len__()协议,表示一种从indices/keys(可能为非整型)到数据样本的映射。 比如有这样一个数据集,当访问 dataset[idx]时,可以从磁盘上的文件夹读取到第idx个图像以及与它相关的标签。

iterable-style datasets这类数据集是 IterableDataset 的子类的一个实例,使用 __iter__()协议,表示可在数据样本上迭代。这种类型的数据集特别适合于很难甚至无法进行随机读取,以及BatchSize的大小取决于获取的数据的情况。 如调用 iter(dataset)时,可以返回从数据库、远程服务器读取的数据流,甚至实时生成的日志。

我们使用的大部分数据集都是map-style类型的数据集

(该段文字来自 zhuanlan.zhihu.com/p/267157806)

GPU并行训练

DataParallelDistributedDataParallel用于GPU的并行训练,后者效率更高,建议使用。[官网有介绍] (pytorch.org/docs/stable…

分布式计算

torch.distributed 可多节点多线程的并行运行代码。



[参考]