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=155 | drop_last=False - Total=156 & Step=156 |
---|---|
上图左图显示了drop_last=True时最后不满一批次的数据,会被截取,所以整个step是155。
上图右图drop_last=False会将最后一批不足的数据也读出,不会被截取,所以整个step是156张,最后一屏占满不了代码中设置的64张。
shuffle=True|False的情况
Epoch=0 | Epoch=1 |
---|---|
上图演示了shuffle=True图片随机读出的效果,同样的Step读出的顺序不同。
那么从字面上也可以理解当shuffle=False时,图片的顺序一定是相同的。
附
相关知识
文档入口
Pytorch的官网:pytorch.org/ , 选中核心模块进入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, *, 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并行训练
DataParallel
和DistributedDataParallel
用于GPU的并行训练,后者效率更高,建议使用。[官网有介绍] (pytorch.org/docs/stable…
分布式计算
torch.distributed
可多节点多线程的并行运行代码。
[参考]